From 0a436db00b8c75642de569814de2d901b23def90 Mon Sep 17 00:00:00 2001 From: matthias muntwiler Date: Tue, 4 Jul 2017 11:24:41 +0200 Subject: [PATCH] include documentation in public distribution --- .gitignore | 1 - doc/html/PageProjections.html | 135 + doc/html/annotated.html | 131 + doc/html/annotated.js | 5 + doc/html/arrowdown.png | Bin 0 -> 246 bytes doc/html/arrowright.png | Bin 0 -> 229 bytes doc/html/bc_s.png | Bin 0 -> 676 bytes doc/html/bdwn.png | Bin 0 -> 147 bytes doc/html/classes.html | 135 + doc/html/closed.png | Bin 0 -> 132 bytes doc/html/deprecated.html | 123 + .../dir_fe5dc42579d4b99403482a3a637d9f7d.html | 178 + doc/html/doc.png | Bin 0 -> 746 bytes doc/html/doxygen.css | 1475 +++++++++ doc/html/doxygen.png | Bin 0 -> 3779 bytes doc/html/dynsections.js | 104 + doc/html/fermi-edge-analysis_8ipf.html | 502 +++ doc/html/fermi-edge-analysis_8ipf.js | 15 + doc/html/fermi-edge-analysis_8ipf_source.html | 139 + doc/html/files.html | 147 + doc/html/files.js | 22 + doc/html/folderclosed.png | Bin 0 -> 616 bytes doc/html/folderopen.png | Bin 0 -> 597 bytes doc/html/functions.html | 189 ++ doc/html/functions_vars.html | 189 ++ doc/html/globals.html | 393 +++ doc/html/globals_b.html | 245 ++ doc/html/globals_c.html | 226 ++ doc/html/globals_d.html | 217 ++ doc/html/globals_dup.js | 25 + doc/html/globals_e.html | 220 ++ doc/html/globals_f.html | 187 ++ doc/html/globals_func.html | 392 +++ doc/html/globals_func.js | 24 + doc/html/globals_func_b.html | 244 ++ doc/html/globals_func_c.html | 225 ++ doc/html/globals_func_d.html | 216 ++ doc/html/globals_func_e.html | 213 ++ doc/html/globals_func_f.html | 186 ++ doc/html/globals_func_g.html | 201 ++ doc/html/globals_func_h.html | 168 + doc/html/globals_func_i.html | 202 ++ doc/html/globals_func_k.html | 159 + doc/html/globals_func_l.html | 206 ++ doc/html/globals_func_m.html | 204 ++ doc/html/globals_func_n.html | 168 + doc/html/globals_func_o.html | 183 ++ doc/html/globals_func_p.html | 357 ++ doc/html/globals_func_q.html | 159 + doc/html/globals_func_r.html | 191 ++ doc/html/globals_func_s.html | 254 ++ doc/html/globals_func_t.html | 177 + doc/html/globals_func_u.html | 189 ++ doc/html/globals_func_w.html | 159 + doc/html/globals_g.html | 202 ++ doc/html/globals_h.html | 172 + doc/html/globals_i.html | 203 ++ doc/html/globals_k.html | 245 ++ doc/html/globals_l.html | 207 ++ doc/html/globals_m.html | 214 ++ doc/html/globals_n.html | 169 + doc/html/globals_o.html | 184 ++ doc/html/globals_p.html | 372 +++ doc/html/globals_q.html | 160 + doc/html/globals_r.html | 192 ++ doc/html/globals_s.html | 255 ++ doc/html/globals_t.html | 178 + doc/html/globals_u.html | 190 ++ doc/html/globals_v.html | 161 + doc/html/globals_vars.html | 282 ++ doc/html/globals_w.html | 160 + doc/html/group___arpes_package.html | 173 + doc/html/group___arpes_package.js | 12 + doc/html/group___preparation_package.html | 133 + doc/html/index.html | 138 + doc/html/jquery.js | 68 + doc/html/mainpage_8dox.html | 125 + doc/html/modules.html | 123 + doc/html/modules.js | 4 + .../namespace_pearl_anglescan_process.html | 130 + doc/html/namespace_pearl_anneal.html | 129 + doc/html/namespace_pearl_area_display.html | 154 + doc/html/namespace_pearl_area_import.html | 130 + doc/html/namespace_pearl_area_profiles.html | 130 + .../namespace_pearl_area_profiles_test.html | 129 + doc/html/namespace_pearl_arpes.html | 130 + doc/html/namespace_pearl_data_explorer.html | 130 + doc/html/namespace_pearl_elog.html | 130 + doc/html/namespace_pearl_matrix_import.html | 130 + doc/html/namespace_pearl_p_shell_import.html | 130 + doc/html/namespace_pearl_preparation.html | 129 + .../namespace_pearl_scienta_preprocess.html | 130 + doc/html/namespaces.html | 137 + doc/html/namespaces.js | 13 + doc/html/nav_f.png | Bin 0 -> 153 bytes doc/html/nav_g.png | Bin 0 -> 95 bytes doc/html/nav_h.png | Bin 0 -> 98 bytes doc/html/navtree.css | 143 + doc/html/navtree.js | 523 +++ doc/html/navtreedata.js | 40 + doc/html/navtreeindex0.js | 253 ++ doc/html/navtreeindex1.js | 253 ++ doc/html/navtreeindex2.js | 81 + doc/html/open.png | Bin 0 -> 123 bytes doc/html/pages.html | 124 + .../pearl-anglescan-process-test_8ipf.html | 189 ++ doc/html/pearl-anglescan-process-test_8ipf.js | 5 + ...rl-anglescan-process-test_8ipf_source.html | 210 ++ doc/html/pearl-anglescan-process_8ipf.html | 2890 +++++++++++++++++ doc/html/pearl-anglescan-process_8ipf.js | 56 + .../pearl-anglescan-process_8ipf_source.html | 188 ++ doc/html/pearl-anglescan-tracker_8ipf.html | 1581 +++++++++ doc/html/pearl-anglescan-tracker_8ipf.js | 48 + .../pearl-anglescan-tracker_8ipf_source.html | 186 ++ doc/html/pearl-anneal_8ipf.html | 1303 ++++++++ doc/html/pearl-anneal_8ipf.js | 43 + doc/html/pearl-anneal_8ipf_source.html | 1488 +++++++++ doc/html/pearl-area-display_8ipf.html | 1604 +++++++++ doc/html/pearl-area-display_8ipf.js | 42 + doc/html/pearl-area-display_8ipf_source.html | 168 + doc/html/pearl-area-import_8ipf.html | 1294 ++++++++ doc/html/pearl-area-import_8ipf.js | 27 + doc/html/pearl-area-import_8ipf_source.html | 154 + doc/html/pearl-area-live_8ipf.html | 478 +++ doc/html/pearl-area-live_8ipf.js | 13 + doc/html/pearl-area-live_8ipf_source.html | 510 +++ doc/html/pearl-area-profiles-test_8ipf.html | 455 +++ doc/html/pearl-area-profiles-test_8ipf.js | 13 + .../pearl-area-profiles-test_8ipf_source.html | 568 ++++ doc/html/pearl-area-profiles_8ipf.html | 976 ++++++ doc/html/pearl-area-profiles_8ipf.js | 17 + doc/html/pearl-area-profiles_8ipf_source.html | 139 + doc/html/pearl-arpes-scans_8ipf.html | 348 ++ doc/html/pearl-arpes-scans_8ipf.js | 12 + doc/html/pearl-arpes-scans_8ipf_source.html | 287 ++ doc/html/pearl-arpes_8ipf.html | 217 ++ doc/html/pearl-arpes_8ipf.js | 5 + doc/html/pearl-arpes_8ipf_source.html | 127 + doc/html/pearl-data-explorer_8ipf.html | 1904 +++++++++++ doc/html/pearl-data-explorer_8ipf.js | 59 + doc/html/pearl-data-explorer_8ipf_source.html | 198 ++ doc/html/pearl-data-export_8ipf.html | 152 + doc/html/pearl-data-export_8ipf.js | 4 + doc/html/pearl-data-export_8ipf_source.html | 154 + doc/html/pearl-elog_8ipf.html | 2259 +++++++++++++ doc/html/pearl-elog_8ipf.js | 64 + doc/html/pearl-elog_8ipf_source.html | 187 ++ doc/html/pearl-fitfuncs_8ipf.html | 607 ++++ doc/html/pearl-fitfuncs_8ipf.js | 19 + doc/html/pearl-fitfuncs_8ipf_source.html | 150 + doc/html/pearl-gui-tools_8ipf.html | 225 ++ doc/html/pearl-gui-tools_8ipf.js | 6 + doc/html/pearl-gui-tools_8ipf_source.html | 128 + doc/html/pearl-matrix-import_8ipf.html | 1093 +++++++ doc/html/pearl-matrix-import_8ipf.js | 27 + doc/html/pearl-matrix-import_8ipf_source.html | 156 + doc/html/pearl-menu_8ipf.html | 334 ++ doc/html/pearl-menu_8ipf.js | 12 + doc/html/pearl-menu_8ipf_source.html | 134 + doc/html/pearl-otf-import_8ipf.html | 478 +++ doc/html/pearl-otf-import_8ipf.js | 13 + doc/html/pearl-otf-import_8ipf_source.html | 136 + doc/html/pearl-polar-coordinates_8ipf.html | 344 ++ doc/html/pearl-polar-coordinates_8ipf.js | 8 + .../pearl-polar-coordinates_8ipf_source.html | 130 + doc/html/pearl-preparation_8ipf.html | 209 ++ doc/html/pearl-preparation_8ipf.js | 5 + doc/html/pearl-preparation_8ipf_source.html | 161 + doc/html/pearl-pshell-import_8ipf.html | 2156 ++++++++++++ doc/html/pearl-pshell-import_8ipf.js | 45 + doc/html/pearl-pshell-import_8ipf_source.html | 171 + doc/html/pearl-scienta-preprocess_8ipf.html | 708 ++++ doc/html/pearl-scienta-preprocess_8ipf.js | 21 + .../pearl-scienta-preprocess_8ipf_source.html | 146 + doc/html/pearl-tools_8ipf.html | 333 ++ doc/html/pearl-tools_8ipf.js | 9 + doc/html/pearl-tools_8ipf_source.html | 134 + doc/html/pearl-vector-operations_8ipf.html | 405 +++ doc/html/pearl-vector-operations_8ipf.js | 12 + .../pearl-vector-operations_8ipf_source.html | 134 + doc/html/resize.js | 97 + doc/html/search/all_0.html | 26 + doc/html/search/all_0.js | 83 + doc/html/search/all_1.html | 26 + doc/html/search/all_1.js | 33 + doc/html/search/all_10.html | 26 + doc/html/search/all_10.js | 14 + doc/html/search/all_11.html | 26 + doc/html/search/all_11.js | 36 + doc/html/search/all_12.html | 26 + doc/html/search/all_12.js | 11 + doc/html/search/all_13.html | 26 + doc/html/search/all_13.js | 15 + doc/html/search/all_14.html | 26 + doc/html/search/all_14.js | 4 + doc/html/search/all_15.html | 26 + doc/html/search/all_15.js | 6 + doc/html/search/all_16.html | 26 + doc/html/search/all_16.js | 5 + doc/html/search/all_17.html | 26 + doc/html/search/all_17.js | 4 + doc/html/search/all_2.html | 26 + doc/html/search/all_2.js | 27 + doc/html/search/all_3.html | 26 + doc/html/search/all_3.js | 24 + doc/html/search/all_4.html | 26 + doc/html/search/all_4.js | 26 + doc/html/search/all_5.html | 26 + doc/html/search/all_5.js | 15 + doc/html/search/all_6.html | 26 + doc/html/search/all_6.js | 18 + doc/html/search/all_7.html | 26 + doc/html/search/all_7.js | 8 + doc/html/search/all_8.html | 26 + doc/html/search/all_8.js | 20 + doc/html/search/all_9.html | 26 + doc/html/search/all_9.js | 32 + doc/html/search/all_a.html | 26 + doc/html/search/all_a.js | 19 + doc/html/search/all_b.html | 26 + doc/html/search/all_b.js | 24 + doc/html/search/all_c.html | 26 + doc/html/search/all_c.js | 9 + doc/html/search/all_d.html | 26 + doc/html/search/all_d.js | 13 + doc/html/search/all_e.html | 26 + doc/html/search/all_e.js | 103 + doc/html/search/all_f.html | 26 + doc/html/search/all_f.js | 4 + doc/html/search/classes_0.html | 26 + doc/html/search/classes_0.js | 4 + doc/html/search/classes_1.html | 26 + doc/html/search/classes_1.js | 4 + doc/html/search/close.png | Bin 0 -> 273 bytes doc/html/search/files_0.html | 26 + doc/html/search/files_0.js | 4 + doc/html/search/files_1.html | 26 + doc/html/search/files_1.js | 4 + doc/html/search/files_2.html | 26 + doc/html/search/files_2.js | 21 + doc/html/search/functions_0.html | 26 + doc/html/search/functions_0.js | 81 + doc/html/search/functions_1.html | 26 + doc/html/search/functions_1.js | 32 + doc/html/search/functions_10.html | 26 + doc/html/search/functions_10.js | 14 + doc/html/search/functions_11.html | 26 + doc/html/search/functions_11.js | 35 + doc/html/search/functions_12.html | 26 + doc/html/search/functions_12.js | 10 + doc/html/search/functions_13.html | 26 + doc/html/search/functions_13.js | 14 + doc/html/search/functions_14.html | 26 + doc/html/search/functions_14.js | 4 + doc/html/search/functions_2.html | 26 + doc/html/search/functions_2.js | 26 + doc/html/search/functions_3.html | 26 + doc/html/search/functions_3.js | 23 + doc/html/search/functions_4.html | 26 + doc/html/search/functions_4.js | 22 + doc/html/search/functions_5.html | 26 + doc/html/search/functions_5.js | 13 + doc/html/search/functions_6.html | 26 + doc/html/search/functions_6.js | 18 + doc/html/search/functions_7.html | 26 + doc/html/search/functions_7.js | 7 + doc/html/search/functions_8.html | 26 + doc/html/search/functions_8.js | 17 + doc/html/search/functions_9.html | 26 + doc/html/search/functions_9.js | 4 + doc/html/search/functions_a.html | 26 + doc/html/search/functions_a.js | 19 + doc/html/search/functions_b.html | 26 + doc/html/search/functions_b.js | 19 + doc/html/search/functions_c.html | 26 + doc/html/search/functions_c.js | 7 + doc/html/search/functions_d.html | 26 + doc/html/search/functions_d.js | 12 + doc/html/search/functions_e.html | 26 + doc/html/search/functions_e.js | 70 + doc/html/search/functions_f.html | 26 + doc/html/search/functions_f.js | 4 + doc/html/search/groups_0.html | 26 + doc/html/search/groups_0.js | 4 + doc/html/search/groups_1.html | 26 + doc/html/search/groups_1.js | 4 + doc/html/search/mag_sel.png | Bin 0 -> 563 bytes doc/html/search/namespaces_0.html | 26 + doc/html/search/namespaces_0.js | 13 + doc/html/search/nomatches.html | 12 + doc/html/search/pages_0.html | 26 + doc/html/search/pages_0.js | 4 + doc/html/search/pages_1.html | 26 + doc/html/search/pages_1.js | 4 + doc/html/search/pages_2.html | 26 + doc/html/search/pages_2.js | 4 + doc/html/search/search.css | 271 ++ doc/html/search/search.js | 791 +++++ doc/html/search/search_l.png | Bin 0 -> 604 bytes doc/html/search/search_m.png | Bin 0 -> 158 bytes doc/html/search/search_r.png | Bin 0 -> 612 bytes doc/html/search/searchdata.js | 36 + doc/html/search/variables_0.html | 26 + doc/html/search/variables_0.js | 4 + doc/html/search/variables_1.html | 26 + doc/html/search/variables_1.js | 4 + doc/html/search/variables_10.html | 26 + doc/html/search/variables_10.js | 5 + doc/html/search/variables_11.html | 26 + doc/html/search/variables_11.js | 4 + doc/html/search/variables_2.html | 26 + doc/html/search/variables_2.js | 4 + doc/html/search/variables_3.html | 26 + doc/html/search/variables_3.js | 6 + doc/html/search/variables_4.html | 26 + doc/html/search/variables_4.js | 4 + doc/html/search/variables_5.html | 26 + doc/html/search/variables_5.js | 4 + doc/html/search/variables_6.html | 26 + doc/html/search/variables_6.js | 5 + doc/html/search/variables_7.html | 26 + doc/html/search/variables_7.js | 31 + doc/html/search/variables_8.html | 26 + doc/html/search/variables_8.js | 7 + doc/html/search/variables_9.html | 26 + doc/html/search/variables_9.js | 5 + doc/html/search/variables_a.html | 26 + doc/html/search/variables_a.js | 4 + doc/html/search/variables_b.html | 26 + doc/html/search/variables_b.js | 8 + doc/html/search/variables_c.html | 26 + doc/html/search/variables_c.js | 4 + doc/html/search/variables_d.html | 26 + doc/html/search/variables_d.js | 4 + doc/html/search/variables_e.html | 26 + doc/html/search/variables_e.js | 4 + doc/html/search/variables_f.html | 26 + doc/html/search/variables_f.js | 5 + doc/html/splitbar.png | Bin 0 -> 314 bytes doc/html/struct_doniach_sunjic_struct.html | 283 ++ doc/html/struct_doniach_sunjic_struct.js | 12 + doc/html/structerror_code.html | 319 ++ doc/html/structerror_code.js | 14 + doc/html/sync_off.png | Bin 0 -> 853 bytes doc/html/sync_on.png | Bin 0 -> 845 bytes doc/html/tab_a.png | Bin 0 -> 142 bytes doc/html/tab_b.png | Bin 0 -> 169 bytes doc/html/tab_h.png | Bin 0 -> 177 bytes doc/html/tab_s.png | Bin 0 -> 184 bytes doc/html/tabs.css | 60 + doc/html/todo.html | 132 + doc/latex/refman.pdf | Bin 0 -> 566487 bytes 352 files changed, 51487 insertions(+), 1 deletion(-) create mode 100644 doc/html/PageProjections.html create mode 100644 doc/html/annotated.html create mode 100644 doc/html/annotated.js create mode 100644 doc/html/arrowdown.png create mode 100644 doc/html/arrowright.png create mode 100644 doc/html/bc_s.png create mode 100644 doc/html/bdwn.png create mode 100644 doc/html/classes.html create mode 100644 doc/html/closed.png create mode 100644 doc/html/deprecated.html create mode 100644 doc/html/dir_fe5dc42579d4b99403482a3a637d9f7d.html create mode 100644 doc/html/doc.png create mode 100644 doc/html/doxygen.css create mode 100644 doc/html/doxygen.png create mode 100644 doc/html/dynsections.js create mode 100644 doc/html/fermi-edge-analysis_8ipf.html create mode 100644 doc/html/fermi-edge-analysis_8ipf.js create mode 100644 doc/html/fermi-edge-analysis_8ipf_source.html create mode 100644 doc/html/files.html create mode 100644 doc/html/files.js create mode 100644 doc/html/folderclosed.png create mode 100644 doc/html/folderopen.png create mode 100644 doc/html/functions.html create mode 100644 doc/html/functions_vars.html create mode 100644 doc/html/globals.html create mode 100644 doc/html/globals_b.html create mode 100644 doc/html/globals_c.html create mode 100644 doc/html/globals_d.html create mode 100644 doc/html/globals_dup.js create mode 100644 doc/html/globals_e.html create mode 100644 doc/html/globals_f.html create mode 100644 doc/html/globals_func.html create mode 100644 doc/html/globals_func.js create mode 100644 doc/html/globals_func_b.html create mode 100644 doc/html/globals_func_c.html create mode 100644 doc/html/globals_func_d.html create mode 100644 doc/html/globals_func_e.html create mode 100644 doc/html/globals_func_f.html create mode 100644 doc/html/globals_func_g.html create mode 100644 doc/html/globals_func_h.html create mode 100644 doc/html/globals_func_i.html create mode 100644 doc/html/globals_func_k.html create mode 100644 doc/html/globals_func_l.html create mode 100644 doc/html/globals_func_m.html create mode 100644 doc/html/globals_func_n.html create mode 100644 doc/html/globals_func_o.html create mode 100644 doc/html/globals_func_p.html create mode 100644 doc/html/globals_func_q.html create mode 100644 doc/html/globals_func_r.html create mode 100644 doc/html/globals_func_s.html create mode 100644 doc/html/globals_func_t.html create mode 100644 doc/html/globals_func_u.html create mode 100644 doc/html/globals_func_w.html create mode 100644 doc/html/globals_g.html create mode 100644 doc/html/globals_h.html create mode 100644 doc/html/globals_i.html create mode 100644 doc/html/globals_k.html create mode 100644 doc/html/globals_l.html create mode 100644 doc/html/globals_m.html create mode 100644 doc/html/globals_n.html create mode 100644 doc/html/globals_o.html create mode 100644 doc/html/globals_p.html create mode 100644 doc/html/globals_q.html create mode 100644 doc/html/globals_r.html create mode 100644 doc/html/globals_s.html create mode 100644 doc/html/globals_t.html create mode 100644 doc/html/globals_u.html create mode 100644 doc/html/globals_v.html create mode 100644 doc/html/globals_vars.html create mode 100644 doc/html/globals_w.html create mode 100644 doc/html/group___arpes_package.html create mode 100644 doc/html/group___arpes_package.js create mode 100644 doc/html/group___preparation_package.html create mode 100644 doc/html/index.html create mode 100644 doc/html/jquery.js create mode 100644 doc/html/mainpage_8dox.html create mode 100644 doc/html/modules.html create mode 100644 doc/html/modules.js create mode 100644 doc/html/namespace_pearl_anglescan_process.html create mode 100644 doc/html/namespace_pearl_anneal.html create mode 100644 doc/html/namespace_pearl_area_display.html create mode 100644 doc/html/namespace_pearl_area_import.html create mode 100644 doc/html/namespace_pearl_area_profiles.html create mode 100644 doc/html/namespace_pearl_area_profiles_test.html create mode 100644 doc/html/namespace_pearl_arpes.html create mode 100644 doc/html/namespace_pearl_data_explorer.html create mode 100644 doc/html/namespace_pearl_elog.html create mode 100644 doc/html/namespace_pearl_matrix_import.html create mode 100644 doc/html/namespace_pearl_p_shell_import.html create mode 100644 doc/html/namespace_pearl_preparation.html create mode 100644 doc/html/namespace_pearl_scienta_preprocess.html create mode 100644 doc/html/namespaces.html create mode 100644 doc/html/namespaces.js create mode 100644 doc/html/nav_f.png create mode 100644 doc/html/nav_g.png create mode 100644 doc/html/nav_h.png create mode 100644 doc/html/navtree.css create mode 100644 doc/html/navtree.js create mode 100644 doc/html/navtreedata.js create mode 100644 doc/html/navtreeindex0.js create mode 100644 doc/html/navtreeindex1.js create mode 100644 doc/html/navtreeindex2.js create mode 100644 doc/html/open.png create mode 100644 doc/html/pages.html create mode 100644 doc/html/pearl-anglescan-process-test_8ipf.html create mode 100644 doc/html/pearl-anglescan-process-test_8ipf.js create mode 100644 doc/html/pearl-anglescan-process-test_8ipf_source.html create mode 100644 doc/html/pearl-anglescan-process_8ipf.html create mode 100644 doc/html/pearl-anglescan-process_8ipf.js create mode 100644 doc/html/pearl-anglescan-process_8ipf_source.html create mode 100644 doc/html/pearl-anglescan-tracker_8ipf.html create mode 100644 doc/html/pearl-anglescan-tracker_8ipf.js create mode 100644 doc/html/pearl-anglescan-tracker_8ipf_source.html create mode 100644 doc/html/pearl-anneal_8ipf.html create mode 100644 doc/html/pearl-anneal_8ipf.js create mode 100644 doc/html/pearl-anneal_8ipf_source.html create mode 100644 doc/html/pearl-area-display_8ipf.html create mode 100644 doc/html/pearl-area-display_8ipf.js create mode 100644 doc/html/pearl-area-display_8ipf_source.html create mode 100644 doc/html/pearl-area-import_8ipf.html create mode 100644 doc/html/pearl-area-import_8ipf.js create mode 100644 doc/html/pearl-area-import_8ipf_source.html create mode 100644 doc/html/pearl-area-live_8ipf.html create mode 100644 doc/html/pearl-area-live_8ipf.js create mode 100644 doc/html/pearl-area-live_8ipf_source.html create mode 100644 doc/html/pearl-area-profiles-test_8ipf.html create mode 100644 doc/html/pearl-area-profiles-test_8ipf.js create mode 100644 doc/html/pearl-area-profiles-test_8ipf_source.html create mode 100644 doc/html/pearl-area-profiles_8ipf.html create mode 100644 doc/html/pearl-area-profiles_8ipf.js create mode 100644 doc/html/pearl-area-profiles_8ipf_source.html create mode 100644 doc/html/pearl-arpes-scans_8ipf.html create mode 100644 doc/html/pearl-arpes-scans_8ipf.js create mode 100644 doc/html/pearl-arpes-scans_8ipf_source.html create mode 100644 doc/html/pearl-arpes_8ipf.html create mode 100644 doc/html/pearl-arpes_8ipf.js create mode 100644 doc/html/pearl-arpes_8ipf_source.html create mode 100644 doc/html/pearl-data-explorer_8ipf.html create mode 100644 doc/html/pearl-data-explorer_8ipf.js create mode 100644 doc/html/pearl-data-explorer_8ipf_source.html create mode 100644 doc/html/pearl-data-export_8ipf.html create mode 100644 doc/html/pearl-data-export_8ipf.js create mode 100644 doc/html/pearl-data-export_8ipf_source.html create mode 100644 doc/html/pearl-elog_8ipf.html create mode 100644 doc/html/pearl-elog_8ipf.js create mode 100644 doc/html/pearl-elog_8ipf_source.html create mode 100644 doc/html/pearl-fitfuncs_8ipf.html create mode 100644 doc/html/pearl-fitfuncs_8ipf.js create mode 100644 doc/html/pearl-fitfuncs_8ipf_source.html create mode 100644 doc/html/pearl-gui-tools_8ipf.html create mode 100644 doc/html/pearl-gui-tools_8ipf.js create mode 100644 doc/html/pearl-gui-tools_8ipf_source.html create mode 100644 doc/html/pearl-matrix-import_8ipf.html create mode 100644 doc/html/pearl-matrix-import_8ipf.js create mode 100644 doc/html/pearl-matrix-import_8ipf_source.html create mode 100644 doc/html/pearl-menu_8ipf.html create mode 100644 doc/html/pearl-menu_8ipf.js create mode 100644 doc/html/pearl-menu_8ipf_source.html create mode 100644 doc/html/pearl-otf-import_8ipf.html create mode 100644 doc/html/pearl-otf-import_8ipf.js create mode 100644 doc/html/pearl-otf-import_8ipf_source.html create mode 100644 doc/html/pearl-polar-coordinates_8ipf.html create mode 100644 doc/html/pearl-polar-coordinates_8ipf.js create mode 100644 doc/html/pearl-polar-coordinates_8ipf_source.html create mode 100644 doc/html/pearl-preparation_8ipf.html create mode 100644 doc/html/pearl-preparation_8ipf.js create mode 100644 doc/html/pearl-preparation_8ipf_source.html create mode 100644 doc/html/pearl-pshell-import_8ipf.html create mode 100644 doc/html/pearl-pshell-import_8ipf.js create mode 100644 doc/html/pearl-pshell-import_8ipf_source.html create mode 100644 doc/html/pearl-scienta-preprocess_8ipf.html create mode 100644 doc/html/pearl-scienta-preprocess_8ipf.js create mode 100644 doc/html/pearl-scienta-preprocess_8ipf_source.html create mode 100644 doc/html/pearl-tools_8ipf.html create mode 100644 doc/html/pearl-tools_8ipf.js create mode 100644 doc/html/pearl-tools_8ipf_source.html create mode 100644 doc/html/pearl-vector-operations_8ipf.html create mode 100644 doc/html/pearl-vector-operations_8ipf.js create mode 100644 doc/html/pearl-vector-operations_8ipf_source.html create mode 100644 doc/html/resize.js create mode 100644 doc/html/search/all_0.html create mode 100644 doc/html/search/all_0.js create mode 100644 doc/html/search/all_1.html create mode 100644 doc/html/search/all_1.js create mode 100644 doc/html/search/all_10.html create mode 100644 doc/html/search/all_10.js create mode 100644 doc/html/search/all_11.html create mode 100644 doc/html/search/all_11.js create mode 100644 doc/html/search/all_12.html create mode 100644 doc/html/search/all_12.js create mode 100644 doc/html/search/all_13.html create mode 100644 doc/html/search/all_13.js create mode 100644 doc/html/search/all_14.html create mode 100644 doc/html/search/all_14.js create mode 100644 doc/html/search/all_15.html create mode 100644 doc/html/search/all_15.js create mode 100644 doc/html/search/all_16.html create mode 100644 doc/html/search/all_16.js create mode 100644 doc/html/search/all_17.html create mode 100644 doc/html/search/all_17.js create mode 100644 doc/html/search/all_2.html create mode 100644 doc/html/search/all_2.js create mode 100644 doc/html/search/all_3.html create mode 100644 doc/html/search/all_3.js create mode 100644 doc/html/search/all_4.html create mode 100644 doc/html/search/all_4.js create mode 100644 doc/html/search/all_5.html create mode 100644 doc/html/search/all_5.js create mode 100644 doc/html/search/all_6.html create mode 100644 doc/html/search/all_6.js create mode 100644 doc/html/search/all_7.html create mode 100644 doc/html/search/all_7.js create mode 100644 doc/html/search/all_8.html create mode 100644 doc/html/search/all_8.js create mode 100644 doc/html/search/all_9.html create mode 100644 doc/html/search/all_9.js create mode 100644 doc/html/search/all_a.html create mode 100644 doc/html/search/all_a.js create mode 100644 doc/html/search/all_b.html create mode 100644 doc/html/search/all_b.js create mode 100644 doc/html/search/all_c.html create mode 100644 doc/html/search/all_c.js create mode 100644 doc/html/search/all_d.html create mode 100644 doc/html/search/all_d.js create mode 100644 doc/html/search/all_e.html create mode 100644 doc/html/search/all_e.js create mode 100644 doc/html/search/all_f.html create mode 100644 doc/html/search/all_f.js create mode 100644 doc/html/search/classes_0.html create mode 100644 doc/html/search/classes_0.js create mode 100644 doc/html/search/classes_1.html create mode 100644 doc/html/search/classes_1.js create mode 100644 doc/html/search/close.png create mode 100644 doc/html/search/files_0.html create mode 100644 doc/html/search/files_0.js create mode 100644 doc/html/search/files_1.html create mode 100644 doc/html/search/files_1.js create mode 100644 doc/html/search/files_2.html create mode 100644 doc/html/search/files_2.js create mode 100644 doc/html/search/functions_0.html create mode 100644 doc/html/search/functions_0.js create mode 100644 doc/html/search/functions_1.html create mode 100644 doc/html/search/functions_1.js create mode 100644 doc/html/search/functions_10.html create mode 100644 doc/html/search/functions_10.js create mode 100644 doc/html/search/functions_11.html create mode 100644 doc/html/search/functions_11.js create mode 100644 doc/html/search/functions_12.html create mode 100644 doc/html/search/functions_12.js create mode 100644 doc/html/search/functions_13.html create mode 100644 doc/html/search/functions_13.js create mode 100644 doc/html/search/functions_14.html create mode 100644 doc/html/search/functions_14.js create mode 100644 doc/html/search/functions_2.html create mode 100644 doc/html/search/functions_2.js create mode 100644 doc/html/search/functions_3.html create mode 100644 doc/html/search/functions_3.js create mode 100644 doc/html/search/functions_4.html create mode 100644 doc/html/search/functions_4.js create mode 100644 doc/html/search/functions_5.html create mode 100644 doc/html/search/functions_5.js create mode 100644 doc/html/search/functions_6.html create mode 100644 doc/html/search/functions_6.js create mode 100644 doc/html/search/functions_7.html create mode 100644 doc/html/search/functions_7.js create mode 100644 doc/html/search/functions_8.html create mode 100644 doc/html/search/functions_8.js create mode 100644 doc/html/search/functions_9.html create mode 100644 doc/html/search/functions_9.js create mode 100644 doc/html/search/functions_a.html create mode 100644 doc/html/search/functions_a.js create mode 100644 doc/html/search/functions_b.html create mode 100644 doc/html/search/functions_b.js create mode 100644 doc/html/search/functions_c.html create mode 100644 doc/html/search/functions_c.js create mode 100644 doc/html/search/functions_d.html create mode 100644 doc/html/search/functions_d.js create mode 100644 doc/html/search/functions_e.html create mode 100644 doc/html/search/functions_e.js create mode 100644 doc/html/search/functions_f.html create mode 100644 doc/html/search/functions_f.js create mode 100644 doc/html/search/groups_0.html create mode 100644 doc/html/search/groups_0.js create mode 100644 doc/html/search/groups_1.html create mode 100644 doc/html/search/groups_1.js create mode 100644 doc/html/search/mag_sel.png create mode 100644 doc/html/search/namespaces_0.html create mode 100644 doc/html/search/namespaces_0.js create mode 100644 doc/html/search/nomatches.html create mode 100644 doc/html/search/pages_0.html create mode 100644 doc/html/search/pages_0.js create mode 100644 doc/html/search/pages_1.html create mode 100644 doc/html/search/pages_1.js create mode 100644 doc/html/search/pages_2.html create mode 100644 doc/html/search/pages_2.js create mode 100644 doc/html/search/search.css create mode 100644 doc/html/search/search.js create mode 100644 doc/html/search/search_l.png create mode 100644 doc/html/search/search_m.png create mode 100644 doc/html/search/search_r.png create mode 100644 doc/html/search/searchdata.js create mode 100644 doc/html/search/variables_0.html create mode 100644 doc/html/search/variables_0.js create mode 100644 doc/html/search/variables_1.html create mode 100644 doc/html/search/variables_1.js create mode 100644 doc/html/search/variables_10.html create mode 100644 doc/html/search/variables_10.js create mode 100644 doc/html/search/variables_11.html create mode 100644 doc/html/search/variables_11.js create mode 100644 doc/html/search/variables_2.html create mode 100644 doc/html/search/variables_2.js create mode 100644 doc/html/search/variables_3.html create mode 100644 doc/html/search/variables_3.js create mode 100644 doc/html/search/variables_4.html create mode 100644 doc/html/search/variables_4.js create mode 100644 doc/html/search/variables_5.html create mode 100644 doc/html/search/variables_5.js create mode 100644 doc/html/search/variables_6.html create mode 100644 doc/html/search/variables_6.js create mode 100644 doc/html/search/variables_7.html create mode 100644 doc/html/search/variables_7.js create mode 100644 doc/html/search/variables_8.html create mode 100644 doc/html/search/variables_8.js create mode 100644 doc/html/search/variables_9.html create mode 100644 doc/html/search/variables_9.js create mode 100644 doc/html/search/variables_a.html create mode 100644 doc/html/search/variables_a.js create mode 100644 doc/html/search/variables_b.html create mode 100644 doc/html/search/variables_b.js create mode 100644 doc/html/search/variables_c.html create mode 100644 doc/html/search/variables_c.js create mode 100644 doc/html/search/variables_d.html create mode 100644 doc/html/search/variables_d.js create mode 100644 doc/html/search/variables_e.html create mode 100644 doc/html/search/variables_e.js create mode 100644 doc/html/search/variables_f.html create mode 100644 doc/html/search/variables_f.js create mode 100644 doc/html/splitbar.png create mode 100644 doc/html/struct_doniach_sunjic_struct.html create mode 100644 doc/html/struct_doniach_sunjic_struct.js create mode 100644 doc/html/structerror_code.html create mode 100644 doc/html/structerror_code.js create mode 100644 doc/html/sync_off.png create mode 100644 doc/html/sync_on.png create mode 100644 doc/html/tab_a.png create mode 100644 doc/html/tab_b.png create mode 100644 doc/html/tab_h.png create mode 100644 doc/html/tab_s.png create mode 100644 doc/html/tabs.css create mode 100644 doc/html/todo.html create mode 100644 doc/latex/refman.pdf diff --git a/.gitignore b/.gitignore index 302d42c..7d3b9a7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,5 @@ ~* *.bak *.ipfT* -doc/html/* doc/latex/* diff --git a/doc/html/PageProjections.html b/doc/html/PageProjections.html new file mode 100644 index 0000000..084b6f7 --- /dev/null +++ b/doc/html/PageProjections.html @@ -0,0 +1,135 @@ + + + + + + +PEARL Procedures: Projections + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Projections
+
+
+

the functions of the anglescan package support the following map projections.

+

for a description of the different projections, see, for example, https://en.wikipedia.org/wiki/Map_projection

+ + + + + + + + + + + + + +
Selector Projection Function Properties
kProjDist = 0 azimuthal equidistant r = c * theta radius is proportional to polar angle.
kProjStereo = 1 stereographic r = c * tan theta/2 circles on sphere map to circles.
kProjArea = 2 azimuthal equal-area r = c * sin theta/2 preserves area measure.
kProjGnom = 3 gnomonic r = c * tan theta great circles map to straight lines.
kProjOrtho = 4 orthographic r = c * sin theta k-space mapping in ARPES and LEED.
+

the projections in this package are defined for 0 <= theta < 90.

+
+
+ + + + diff --git a/doc/html/annotated.html b/doc/html/annotated.html new file mode 100644 index 0000000..a853797 --- /dev/null +++ b/doc/html/annotated.html @@ -0,0 +1,131 @@ + + + + + + +PEARL Procedures: Data Structures + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + +
 CDoniachSunjicStruct
 CerrorCodeFrom matrixfilereader help
+
+
+
+ + + + diff --git a/doc/html/annotated.js b/doc/html/annotated.js new file mode 100644 index 0000000..9a48b34 --- /dev/null +++ b/doc/html/annotated.js @@ -0,0 +1,5 @@ +var annotated = +[ + [ "DoniachSunjicStruct", "struct_doniach_sunjic_struct.html", "struct_doniach_sunjic_struct" ], + [ "errorCode", "structerror_code.html", "structerror_code" ] +]; \ No newline at end of file diff --git a/doc/html/arrowdown.png b/doc/html/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/doc/html/arrowright.png b/doc/html/arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + +PEARL Procedures: Data Structure Index + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Data Structure Index
+
+
+
D | E
+ + + + + +
  D  
+
  e  
+
DoniachSunjicStruct   errorCode   
+
D | E
+
+
+ + + + diff --git a/doc/html/closed.png b/doc/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html new file mode 100644 index 0000000..8ef053c --- /dev/null +++ b/doc/html/deprecated.html @@ -0,0 +1,123 @@ + + + + + + +PEARL Procedures: Deprecated List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Deprecated List
+
+
+
+
Global elog_add_graph_prompt (string graphname, variable replyto=defaultValue)
+
this function is specific to the PEARL/Experiments logbook. it cannot be customized without major efforts. it will be removed in a future version.
+
Global elog_prompt_attributes (string *attributes, string *message)
+
this function is specific to the PEARL/Experiments logbook. it cannot be customized without major efforts. it will be removed in a future version.
+
+
+
+ + + + diff --git a/doc/html/dir_fe5dc42579d4b99403482a3a637d9f7d.html b/doc/html/dir_fe5dc42579d4b99403482a3a637d9f7d.html new file mode 100644 index 0000000..229cda1 --- /dev/null +++ b/doc/html/dir_fe5dc42579d4b99403482a3a637d9f7d.html @@ -0,0 +1,178 @@ + + + + + + +PEARL Procedures: pearl Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  fermi-edge-analysis.ipf [code]
 tools for analysing the Fermi edge measured by the Scienta EW4000 analyser.
 
file  pearl-anglescan-process.ipf [code]
 processing and holographic mapping of angle scanned XPD data.
 
file  pearl-anglescan-tracker.ipf [code]
 
file  pearl-area-display.ipf [code]
 visualization tools for 2D and 3D data.
 
file  pearl-area-import.ipf [code]
 HDF5 file import from EPICS area detectors.
 
file  pearl-area-profiles.ipf [code]
 profile extraction for multi-dimensional datasets acquired from area detectors.
 
file  pearl-arpes.ipf [code]
 data acquisition and analysis package for ARPES at PEARL.
 
file  pearl-data-explorer.ipf [code]
 preview and import panel for PEARL data
 
file  pearl-elog.ipf [code]
 interface for writing ELOG entries with Igor graphs as attachment.
 
file  pearl-fitfuncs.ipf [code]
 
file  pearl-gui-tools.ipf [code]
 
file  pearl-matrix-import.ipf [code]
 data file import for omicron matrix (STM) files
 
file  pearl-menu.ipf [code]
 
file  pearl-otf-import.ipf [code]
 
file  pearl-polar-coordinates.ipf [code]
 
file  pearl-pshell-import.ipf [code]
 import data from PShell
 
file  pearl-scienta-preprocess.ipf [code]
 preprocessing functions for Scienta detector images.
 
file  pearl-tools.ipf [code]
 
file  pearl-vector-operations.ipf [code]
 
+
+
+ + + + diff --git a/doc/html/doc.png b/doc/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css new file mode 100644 index 0000000..1425ec5 --- /dev/null +++ b/doc/html/doxygen.css @@ -0,0 +1,1475 @@ +/* The standard CSS for doxygen 1.8.11 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js new file mode 100644 index 0000000..1e6bf07 --- /dev/null +++ b/doc/html/dynsections.js @@ -0,0 +1,104 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +PEARL Procedures: fermi-edge-analysis.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
fermi-edge-analysis.ipf File Reference
+
+
+ +

tools for analysing the Fermi edge measured by the Scienta EW4000 analyser. +More...

+
#include "pearl-area-profiles"
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + +

+Functions

variable analyse_curved_edge (wave data)
 
variable record_results (variable index)
 
variable integrate_curved_edge (wave data, wave data_sig)
 
variable slit_correction (wave data, wave data_out, variable epass)
 
threadsafe variable FermiFuncLinDOS2D_corr (variable w, threadsafe x, wave y)
 
threadsafe variable slit_shift (variable ypix, variable epass)
 
variable show_shift (wave data)
 
variable analyser_energy_resolution (variable epass, variable slit)
 calculate the energy resolution of the analyser More...
 
+ + + + + + + + + + + + + +

+Variables

static const variable mcp_radius_pix = 555
 MCP radius seen by the camera in pixels. More...
 
static const variable mcp_radius_mm = 20
 physical size (radius) of the MCP in mm More...
 
static const variable hemi_radius_mm = 200
 physical size (radius) of the hemisphere in mm More...
 
static const variable mcp_radius_epass = 0.04
 energy range imaged on MCP relative to the pass energy More...
 
+

Detailed Description

+

tools for analysing the Fermi edge measured by the Scienta EW4000 analyser.

+

proposed procedure

+
    +
  • angular normalization
  • +
  • fit curved fermi function
  • +
  • calculate corrected energy coordinates and map to single independent variable
  • +
  • fit normal fermi function
  • +
+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+
+thomas dienel
+ + +

Definition in file fermi-edge-analysis.ipf.

+

Function Documentation

+ +
+
+ + + + + + + + +
variable analyse_curved_edge (wave data)
+
+ +

Definition at line 27 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable analyser_energy_resolution (variable epass,
variable slit 
)
+
+ +

calculate the energy resolution of the analyser

+
Parameters
+ + + +
epasspass energy in eV
slitanalyser entrance slit in mm
+
+
+
Returns
energy resolution (FWHM)
+ +

Definition at line 306 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable FermiFuncLinDOS2D_corr (variable w,
threadsafe x,
wave y 
)
+
+ +

Definition at line 216 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable integrate_curved_edge (wave data,
wave data_sig 
)
+
+ +

Definition at line 116 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable record_results (variable index)
+
+ +

Definition at line 98 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable show_shift (wave data)
+
+ +

Definition at line 284 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable slit_correction (wave data,
wave data_out,
variable epass 
)
+
+ +

Definition at line 173 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
threadsafe variable slit_shift (variable ypix,
variable epass 
)
+
+ +

Definition at line 267 of file fermi-edge-analysis.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const variable hemi_radius_mm = 200
+
+static
+
+ +

physical size (radius) of the hemisphere in mm

+ +

Definition at line 263 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable mcp_radius_epass = 0.04
+
+static
+
+ +

energy range imaged on MCP relative to the pass energy

+ +

Definition at line 265 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable mcp_radius_mm = 20
+
+static
+
+ +

physical size (radius) of the MCP in mm

+ +

Definition at line 261 of file fermi-edge-analysis.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable mcp_radius_pix = 555
+
+static
+
+ +

MCP radius seen by the camera in pixels.

+ +

Definition at line 259 of file fermi-edge-analysis.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/fermi-edge-analysis_8ipf.js b/doc/html/fermi-edge-analysis_8ipf.js new file mode 100644 index 0000000..eea1f88 --- /dev/null +++ b/doc/html/fermi-edge-analysis_8ipf.js @@ -0,0 +1,15 @@ +var fermi_edge_analysis_8ipf = +[ + [ "analyse_curved_edge", "fermi-edge-analysis_8ipf.html#a1c4a805435a1d43c2b6dfb6deb633894", null ], + [ "analyser_energy_resolution", "fermi-edge-analysis_8ipf.html#ad23de34bb698589e2576ce2836b89d55", null ], + [ "FermiFuncLinDOS2D_corr", "fermi-edge-analysis_8ipf.html#a520d8de9fbc4276c19fb417861f05b0d", null ], + [ "integrate_curved_edge", "fermi-edge-analysis_8ipf.html#a2a1d7b49c1f88f29ee6d49f6a6f4fbf8", null ], + [ "record_results", "fermi-edge-analysis_8ipf.html#aac6bac1ee0582caa0676bdc9c2d254f0", null ], + [ "show_shift", "fermi-edge-analysis_8ipf.html#acf72d644b8d37b6c26b1e070edba4e30", null ], + [ "slit_correction", "fermi-edge-analysis_8ipf.html#a4cec596c8fd2b21953cb45d6d347211d", null ], + [ "slit_shift", "fermi-edge-analysis_8ipf.html#a27f000c3a3ea74c49db31716be3396d4", null ], + [ "hemi_radius_mm", "fermi-edge-analysis_8ipf.html#a0cb8da36beae05c79fe5b1da918d3897", null ], + [ "mcp_radius_epass", "fermi-edge-analysis_8ipf.html#a4749b9bce3e1d0381bd9daeb97c9754c", null ], + [ "mcp_radius_mm", "fermi-edge-analysis_8ipf.html#a4dcc00b93822f1663be2908b10d2ad3e", null ], + [ "mcp_radius_pix", "fermi-edge-analysis_8ipf.html#a09f26b0a0fd940a3d8c6f92aa769c8bc", null ] +]; \ No newline at end of file diff --git a/doc/html/fermi-edge-analysis_8ipf_source.html b/doc/html/fermi-edge-analysis_8ipf_source.html new file mode 100644 index 0000000..57e36ec --- /dev/null +++ b/doc/html/fermi-edge-analysis_8ipf_source.html @@ -0,0 +1,139 @@ + + + + + + +PEARL Procedures: fermi-edge-analysis.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
fermi-edge-analysis.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3// Use modern global access method and strict wave access.
2 #include "pearl-area-profiles"
3 
4 // $Id$
5 
25 
26 
27 variable analyse_curved_edge(wave data){
28  wave data// 2D counts data, x-scale = kinetic energy, y-scale = analyser angle
29  variable guess_EF// initial guess of the Fermi level
30 
31  dfref savedf = GetDataFolderDFR()
32  dfref datadf = GetWavesDataFolderDFR(data)
33  setdatafolder datadf
34 
35  make /n=5 /d /o w_coef_int
36  make /n=7 /d /o w_coef_curved
37 
38  // 1) integrate data
39  wave xint = ad_profile_x(data, -inf, inf, "", noavg=1)
40  duplicate /free xint, xint_sig
41  xint_sig = sqrt(xint * 4) / 4
42  variable xmin = wavemin(xint)
43  variable xmax = wavemax(xint)
44  variable xmean = mean(xint)
45 
46  // 2) fit integrated data for reference
47  w_coef_int[0] = xmin
48  w_coef_int[1] = 0
49  w_coef_int[2] = xmax - xmin
50  w_coef_int[3] = dimoffset(xint, 0) + dimdelta(xint, 0) * dimsize(xint, 0) / 2
51  w_coef_int[4] = 100
52  FuncFit /NTHR=0 FermiFuncLinDOS w_coef_int xint /D /I=1 /W=xint_sig
53  wave w_sigma
54  duplicate /o w_sigma, w_sigma_int
55 
56  // 3) normalize data
57  wave yavg = ad_profile_y(data, -inf, inf, "")
58  variable ymean = mean(yavg)
59 
60  duplicate /o data, data_norm, data_sig
61  data_sig = sqrt(data * 4) / 4
62  data_norm = data_norm * ymean / yavg[q]
63  data_sig = data_sig * ymean / yavg[q]
64 
65  // 4) fit normalized data
66  wave xavg = ad_profile_x(data, -inf, inf, "")
67  xmin = wavemin(xavg)
68  xmax = wavemax(xavg)
69  xmean = mean(xavg)
70 
71  w_coef_curved[0] = {0, 0, 1, 95.5, 100, 0, -0.0001}
72  w_coef_curved[0] = xmin
73  w_coef_curved[2] = xmax - xmin
74  w_coef_curved[3] = w_coef_int[3]
75  w_coef_curved[4] = w_coef_int[4]
76 
77  //variable box = min(11, numpnts(xavg) / 5)
78  //FindLevel /B=(box) /EDGE=2 /Q xavg, (xmin + xmax) / 2
79  //if (v_flag == 0)
80  // w_coef_curved[3] = v_levelx
81  //else
82  // w_coef_curved[3] = dimoffset(data, 0) + dimdelta(data, 0) * dimsize(data, 0) / 2
83  //endif
84 
85  duplicate /o data_norm, fit_data_norm
86  FuncFitMD /X=1 /NTHR=0 FermiFuncLinDOS_2Dcorr w_coef_curved data_norm /D=fit_data_norm /I=1 /W=data_sig
87  wave w_sigma
88  duplicate /o w_sigma, w_sigma_curved
89 
90  display /k=1; appendimage data_norm
91  ModifyImage data_norm ctab= {xmin,xmax,Grays,0}
92  AppendMatrixContour fit_data_norm
93 
94  setdatafolder savedf
95  return 0
96 };
97 
98 variable record_results(variable index){
99  variable index
100 
101  dfref savedf = GetDataFolderDFR()
102  wave /sdfr=root: Tint, Tint_sig, Tcurv, Tcurv_sig, EFcurv, EFcurv_sig
103  wave w_coef_int, w_coef_curved
104  wave w_sigma_int, w_sigma_curved
105 
106  Tint[index] = w_coef_int[4]
107  Tint_sig[index] = w_sigma_int[4]
108  Tcurv[index] = w_coef_curved[4]
109  Tcurv_sig[index] = w_sigma_curved[4]
110  EFcurv[index] = w_coef_curved[3]
111  EFcurv_sig[index] = w_sigma_curved[3]
112 
113  setdatafolder savedf
114 };
115 
116 variable integrate_curved_edge(wave data, wave data_sig){
117  wave data
118  wave /z data_sig
119  //wave coef
120 
121  string name = nameofwave(data)
122 
123  duplicate /o data, data_out
124  redimension /n=(dimsize(data,0)) data_out
125  data_out = 0
126 
127  if (waveexists(data_sig))
128  duplicate /o data_sig, sig_out
129  redimension /n=(dimsize(data,0)) sig_out
130  sig_out = 0
131  endif
132 
133  wave ywgt = ad_profile_y(data, -inf, inf, "", noavg=1)
134  ywgt = 1 / ywgt / 4
135  //ywgt = 1 / 4
136  variable sum_ywgt = sum(ywgt)
137 
138  variable nx = dimsize(data, 0)
139  variable ny = dimsize(data, 1)
140  variable iy
141  variable yy
142  variable dx
143  variable dy
144  variable dp
145  variable dp_min = 0
146 
147  wave PassEnergy = :attr:PassEnergy
148  wave NumSlices = :attr:NumSlices
149 
150  for (iy = 0; iy < ny; iy += 1)
151  dy = dimoffset(data, 1) + dimdelta(data, 1) * iy
152  dy = dy / dimdelta(data, 1)
153  dx = slit_shift(dy * 902 / NumSlices[0], PassEnergy[0])
154  dp = round(dx / dimdelta(data, 0))// <= 0
155  dp_min = min(dp_min, dp)
156 
157  data_out[] = p+dp >= 0 ? data_out + data[p+dp][iy] * ywgt[iy] : data_out
158 
159  if (waveexists(data_sig))
160  sig_out = p+dp >= 0 ? sig_out + data_sig[p+dp][iy] * ywgt[iy] : sig_out
161  endif
162  endfor
163 
164  data_out /= sum_ywgt
165  data_out[0, -dp_min][] = nan
166 
167  if (waveexists(sig_out))
168  sig_out /= sum_ywgt
169  //sig_out[0, -dp_min] = nan
170  endif
171 };
172 
173 variable slit_correction(wave data, wave data_out, variable epass){
174  wave data// must be image with original dimensions (no cropping!)
175  wave /z data_out// 2D or 1D wave to receive the result
176  // X dimension must be identical to the one of data
177  // if 2D, Y dimension must be either identical to the one of data
178  // if 1D, the result will be the sum of the corrected slices
179  variable epass// pass energy
180 
181  if (!WaveExists(data_out))
182  string name = nameofwave(data) + "_corr"
183  duplicate /o data, $name
184  wave data_out = $name
185  //redimension /n=(dimsize(data,0)) data_out
186  endif
187  data_out = 0
188 
189  variable nx = dimsize(data, 0)
190  variable ny = dimsize(data, 1)
191  variable iy
192  variable yy
193  variable dx
194  variable dy
195  variable dp
196  variable dp_min = 0
197 
198  for (iy = 0; iy < ny; iy += 1)
199  dy = dimoffset(data, 1) + dimdelta(data, 1) * iy
200  dy = dy / dimdelta(data, 1)
201  dx = slit_shift(dy * 902 / ny, epass)
202  dp = round(dx / dimdelta(data, 0))// <= 0
203  dp_min = min(dp_min, dp)
204 
205  if (wavedims(data_out) >= 2)
206  data_out[][iy] = p+dp >= 0 ? data_out + data[p+dp][iy] : data_out
207  else
208  data_out = p+dp >= 0 ? data_out + data[p+dp][iy] : data_out
209  endif
210  endfor
211 
212  data_out[0, -dp_min][] = nan
213 };
214 
215 //------------------------------------------------------------------------------
216 threadsafe variable FermiFuncLinDOS2D_corr(variable w, threadsafe x, wave y){
217 // linear density of states below Fermi level
218 // 2D data with corrections:
219 // - straight slit (slit shift)
220 // - transmission function (polynomial)
221 //------------------------------------------------------------------------------
222  Wave w; Variable x; variable y
223  // w[0] = background far above the fermi level
224  // w[1] = slope of the linear background
225  // w[2] = amplitude
226  // w[3] = fermi level in eV
227  // w[4] = temperature in K
228  // w[5] = transmission - linear term
229  // w[6] = transmission - quadratic term
230  // w[7] = transmission - cubic term
231  // w[8] = pass energy (hold this value)
232  // w[9] = y scale: pixels / unit of y
233 
234  variable pos = w[3] + slit_shift(y * w[9], w[8])
235  variable transm = 1 + w[5] * y + w[6] * y^2 + w[7] * y^3
236  variable fermi = (w[1] * min(x - pos, 0) + w[2]) / ( exp( (x - pos) / (kBoltzmann * w[4]) ) + 1.0 )
237  return transm * (fermi + w[0])
238 end
239 
240 //------------------------------------------------------------------------------
241 threadsafe Function FermiFuncLinDOS_2Dcorr_old(w,x,y) : FitFunc
242 // linear density of states below Fermi level
243 // 2D data with a polynomial shift of the Fermi level in the second dimension
244 //------------------------------------------------------------------------------
245  Wave w; Variable x; variable y
246  // w[0] = background far above the fermi level
247  // w[1] = slope of the linear background
248  // w[2] = amplitude
249  // w[3] = fermi level in eV
250  // w[4] = temperature in K
251  // w[5] = shift - linear term
252  // w[6] = shift - quadratic term
253 
254  variable pos = w[3] + w[5] * y + w[6] * y^2
255  return w[0] + (w[1] * min(x - pos, 0) + w[2]) / ( exp( (x - pos) / (kBoltzmann * w[4]) ) + 1.0 )
256 };
257 
259 static const variable mcp_radius_pix = 555;
261 static const variable mcp_radius_mm = 20;
263 static const variable hemi_radius_mm = 200;
265 static const variable mcp_radius_epass = 0.04;
266 
267 threadsafe variable slit_shift(variable ypix, variable epass){
268  // calculates the energy shift due to straight slit
269  // the radius of the curve is 1/2 of the hemisphere radius
270  variable ypix// vertical (angle/position) pixels distance from center
271  // = slice coordinate * 902 / number of slices
272  variable epass// pass energy
273 
274  variable rpix = mcp_radius_pix * hemi_radius_mm / mcp_radius_mm
275  //variable rpix = mcp_radius_pix * hemi_radius_mm / 2 / mcp_radius_mm
276  variable rene = epass * mcp_radius_epass * hemi_radius_mm / 2 / mcp_radius_mm
277 
278  variable isin = asin(ypix / rpix)
279  variable dene = rene * (cos(isin) - 1)
280 
281  return dene
282 };
283 
284 variable show_shift(wave data){
285  wave data
286  variable epass
287 
288  variable ny = dimsize(data, 1)
289  make /o /n=(ny) shift_x
290  setscale /i x -ny/2, ny/2, "", shift_x
291  wave PassEnergy = :attr:PassEnergy
292  wave NumSlices = :attr:NumSlices
293 
294  shift_x = slit_shift(x * 902 / NumSlices[0], PassEnergy[0])
295 
296  variable ecenter = dimoffset(data, 0) + dimdelta(data, 0) * dimsize(data, 0) / 2
297  shift_x += ecenter
298 };
299 
306 variable analyser_energy_resolution(variable epass, variable slit){
307  variable epass
308  variable slit
309 
310  variable respow
311  if (epass < 4)
312  respow = 1110
313  else if (epass < 8)
314  respow = 1400
315  else
316  respow = 1750
317  endif
318 
319  return epass * max(0.2, slit) / 0.2 / respow
320 };
321 
threadsafe variable FermiFuncLinDOS2D_corr(variable w, threadsafe x, wave y)
+
threadsafe variable slit_shift(variable ypix, variable epass)
+
static const variable mcp_radius_pix
MCP radius seen by the camera in pixels.
+
static const variable mcp_radius_mm
physical size (radius) of the MCP in mm
+
threadsafe wave ad_profile_y(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along Y dimension, new destination wave.
+
variable analyse_curved_edge(wave data)
+
static const variable hemi_radius_mm
physical size (radius) of the hemisphere in mm
+
variable analyser_energy_resolution(variable epass, variable slit)
calculate the energy resolution of the analyser
+
variable slit_correction(wave data, wave data_out, variable epass)
+
static const variable mcp_radius_epass
energy range imaged on MCP relative to the pass energy
+
variable integrate_curved_edge(wave data, wave data_sig)
+
variable show_shift(wave data)
+
threadsafe wave ad_profile_x(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, new destination wave.
+
variable record_results(variable index)
+
+
+ + + + diff --git a/doc/html/files.html b/doc/html/files.html new file mode 100644 index 0000000..8009a37 --- /dev/null +++ b/doc/html/files.html @@ -0,0 +1,147 @@ + + + + + + +PEARL Procedures: File List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + +
 fermi-edge-analysis.ipfTools for analysing the Fermi edge measured by the Scienta EW4000 analyser
 pearl-anglescan-process.ipfProcessing and holographic mapping of angle scanned XPD data
 pearl-anglescan-tracker.ipf
 pearl-area-display.ipfVisualization tools for 2D and 3D data
 pearl-area-import.ipfHDF5 file import from EPICS area detectors
 pearl-area-profiles.ipfProfile extraction for multi-dimensional datasets acquired from area detectors
 pearl-arpes.ipfData acquisition and analysis package for ARPES at PEARL
 pearl-data-explorer.ipfPreview and import panel for PEARL data
 pearl-elog.ipfInterface for writing ELOG entries with Igor graphs as attachment
 pearl-fitfuncs.ipf
 pearl-gui-tools.ipf
 pearl-matrix-import.ipfData file import for omicron matrix (STM) files
 pearl-menu.ipf
 pearl-otf-import.ipf
 pearl-polar-coordinates.ipf
 pearl-pshell-import.ipfImport data from PShell
 pearl-scienta-preprocess.ipfPreprocessing functions for Scienta detector images
 pearl-tools.ipf
 pearl-vector-operations.ipf
+
+
+
+ + + + diff --git a/doc/html/files.js b/doc/html/files.js new file mode 100644 index 0000000..a60bace --- /dev/null +++ b/doc/html/files.js @@ -0,0 +1,22 @@ +var files = +[ + [ "fermi-edge-analysis.ipf", "fermi-edge-analysis_8ipf.html", "fermi-edge-analysis_8ipf" ], + [ "pearl-anglescan-process.ipf", "pearl-anglescan-process_8ipf.html", "pearl-anglescan-process_8ipf" ], + [ "pearl-anglescan-tracker.ipf", "pearl-anglescan-tracker_8ipf.html", "pearl-anglescan-tracker_8ipf" ], + [ "pearl-area-display.ipf", "pearl-area-display_8ipf.html", "pearl-area-display_8ipf" ], + [ "pearl-area-import.ipf", "pearl-area-import_8ipf.html", "pearl-area-import_8ipf" ], + [ "pearl-area-profiles.ipf", "pearl-area-profiles_8ipf.html", "pearl-area-profiles_8ipf" ], + [ "pearl-arpes.ipf", "pearl-arpes_8ipf.html", "pearl-arpes_8ipf" ], + [ "pearl-data-explorer.ipf", "pearl-data-explorer_8ipf.html", "pearl-data-explorer_8ipf" ], + [ "pearl-elog.ipf", "pearl-elog_8ipf.html", "pearl-elog_8ipf" ], + [ "pearl-fitfuncs.ipf", "pearl-fitfuncs_8ipf.html", "pearl-fitfuncs_8ipf" ], + [ "pearl-gui-tools.ipf", "pearl-gui-tools_8ipf.html", "pearl-gui-tools_8ipf" ], + [ "pearl-matrix-import.ipf", "pearl-matrix-import_8ipf.html", "pearl-matrix-import_8ipf" ], + [ "pearl-menu.ipf", "pearl-menu_8ipf.html", "pearl-menu_8ipf" ], + [ "pearl-otf-import.ipf", "pearl-otf-import_8ipf.html", "pearl-otf-import_8ipf" ], + [ "pearl-polar-coordinates.ipf", "pearl-polar-coordinates_8ipf.html", "pearl-polar-coordinates_8ipf" ], + [ "pearl-pshell-import.ipf", "pearl-pshell-import_8ipf.html", "pearl-pshell-import_8ipf" ], + [ "pearl-scienta-preprocess.ipf", "pearl-scienta-preprocess_8ipf.html", "pearl-scienta-preprocess_8ipf" ], + [ "pearl-tools.ipf", "pearl-tools_8ipf.html", "pearl-tools_8ipf" ], + [ "pearl-vector-operations.ipf", "pearl-vector-operations_8ipf.html", "pearl-vector-operations_8ipf" ] +]; \ No newline at end of file diff --git a/doc/html/folderclosed.png b/doc/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/doc/html/functions.html b/doc/html/functions.html new file mode 100644 index 0000000..4112e71 --- /dev/null +++ b/doc/html/functions.html @@ -0,0 +1,189 @@ + + + + + + +PEARL Procedures: Data Fields + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+
+
+ + + + diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html new file mode 100644 index 0000000..6714b9e --- /dev/null +++ b/doc/html/functions_vars.html @@ -0,0 +1,189 @@ + + + + + + +PEARL Procedures: Data Fields - Variables + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + diff --git a/doc/html/globals.html b/doc/html/globals.html new file mode 100644 index 0000000..dc1f1b3 --- /dev/null +++ b/doc/html/globals.html @@ -0,0 +1,393 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- a -

+
+
+ + + + diff --git a/doc/html/globals_b.html b/doc/html/globals_b.html new file mode 100644 index 0000000..23e8243 --- /dev/null +++ b/doc/html/globals_b.html @@ -0,0 +1,245 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- b -

+
+
+ + + + diff --git a/doc/html/globals_c.html b/doc/html/globals_c.html new file mode 100644 index 0000000..e3cbb04 --- /dev/null +++ b/doc/html/globals_c.html @@ -0,0 +1,226 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- c -

+
+
+ + + + diff --git a/doc/html/globals_d.html b/doc/html/globals_d.html new file mode 100644 index 0000000..054441a --- /dev/null +++ b/doc/html/globals_d.html @@ -0,0 +1,217 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- d -

+
+
+ + + + diff --git a/doc/html/globals_dup.js b/doc/html/globals_dup.js new file mode 100644 index 0000000..42eaf3d --- /dev/null +++ b/doc/html/globals_dup.js @@ -0,0 +1,25 @@ +var globals_dup = +[ + [ "a", "globals.html", null ], + [ "b", "globals_b.html", null ], + [ "c", "globals_c.html", null ], + [ "d", "globals_d.html", null ], + [ "e", "globals_e.html", null ], + [ "f", "globals_f.html", null ], + [ "g", "globals_g.html", null ], + [ "h", "globals_h.html", null ], + [ "i", "globals_i.html", null ], + [ "k", "globals_k.html", null ], + [ "l", "globals_l.html", null ], + [ "m", "globals_m.html", null ], + [ "n", "globals_n.html", null ], + [ "o", "globals_o.html", null ], + [ "p", "globals_p.html", null ], + [ "q", "globals_q.html", null ], + [ "r", "globals_r.html", null ], + [ "s", "globals_s.html", null ], + [ "t", "globals_t.html", null ], + [ "u", "globals_u.html", null ], + [ "v", "globals_v.html", null ], + [ "w", "globals_w.html", null ] +]; \ No newline at end of file diff --git a/doc/html/globals_e.html b/doc/html/globals_e.html new file mode 100644 index 0000000..2d70777 --- /dev/null +++ b/doc/html/globals_e.html @@ -0,0 +1,220 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- e -

+
+
+ + + + diff --git a/doc/html/globals_f.html b/doc/html/globals_f.html new file mode 100644 index 0000000..cace1d4 --- /dev/null +++ b/doc/html/globals_f.html @@ -0,0 +1,187 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- f -

+
+
+ + + + diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html new file mode 100644 index 0000000..78799c4 --- /dev/null +++ b/doc/html/globals_func.html @@ -0,0 +1,392 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+
+
+ + + + diff --git a/doc/html/globals_func.js b/doc/html/globals_func.js new file mode 100644 index 0000000..3dd8a5e --- /dev/null +++ b/doc/html/globals_func.js @@ -0,0 +1,24 @@ +var globals_func = +[ + [ "a", "globals_func.html", null ], + [ "b", "globals_func_b.html", null ], + [ "c", "globals_func_c.html", null ], + [ "d", "globals_func_d.html", null ], + [ "e", "globals_func_e.html", null ], + [ "f", "globals_func_f.html", null ], + [ "g", "globals_func_g.html", null ], + [ "h", "globals_func_h.html", null ], + [ "i", "globals_func_i.html", null ], + [ "k", "globals_func_k.html", null ], + [ "l", "globals_func_l.html", null ], + [ "m", "globals_func_m.html", null ], + [ "n", "globals_func_n.html", null ], + [ "o", "globals_func_o.html", null ], + [ "p", "globals_func_p.html", null ], + [ "q", "globals_func_q.html", null ], + [ "r", "globals_func_r.html", null ], + [ "s", "globals_func_s.html", null ], + [ "t", "globals_func_t.html", null ], + [ "u", "globals_func_u.html", null ], + [ "w", "globals_func_w.html", null ] +]; \ No newline at end of file diff --git a/doc/html/globals_func_b.html b/doc/html/globals_func_b.html new file mode 100644 index 0000000..aa8308b --- /dev/null +++ b/doc/html/globals_func_b.html @@ -0,0 +1,244 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- b -

+
+
+ + + + diff --git a/doc/html/globals_func_c.html b/doc/html/globals_func_c.html new file mode 100644 index 0000000..a648557 --- /dev/null +++ b/doc/html/globals_func_c.html @@ -0,0 +1,225 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- c -

+
+
+ + + + diff --git a/doc/html/globals_func_d.html b/doc/html/globals_func_d.html new file mode 100644 index 0000000..6eb4d33 --- /dev/null +++ b/doc/html/globals_func_d.html @@ -0,0 +1,216 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- d -

+
+
+ + + + diff --git a/doc/html/globals_func_e.html b/doc/html/globals_func_e.html new file mode 100644 index 0000000..81c3993 --- /dev/null +++ b/doc/html/globals_func_e.html @@ -0,0 +1,213 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- e -

+
+
+ + + + diff --git a/doc/html/globals_func_f.html b/doc/html/globals_func_f.html new file mode 100644 index 0000000..c61ee2d --- /dev/null +++ b/doc/html/globals_func_f.html @@ -0,0 +1,186 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- f -

+
+
+ + + + diff --git a/doc/html/globals_func_g.html b/doc/html/globals_func_g.html new file mode 100644 index 0000000..f666850 --- /dev/null +++ b/doc/html/globals_func_g.html @@ -0,0 +1,201 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- g -

+
+
+ + + + diff --git a/doc/html/globals_func_h.html b/doc/html/globals_func_h.html new file mode 100644 index 0000000..87cb36b --- /dev/null +++ b/doc/html/globals_func_h.html @@ -0,0 +1,168 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- h -

+
+
+ + + + diff --git a/doc/html/globals_func_i.html b/doc/html/globals_func_i.html new file mode 100644 index 0000000..241ea75 --- /dev/null +++ b/doc/html/globals_func_i.html @@ -0,0 +1,202 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- i -

+
+
+ + + + diff --git a/doc/html/globals_func_k.html b/doc/html/globals_func_k.html new file mode 100644 index 0000000..ee9368f --- /dev/null +++ b/doc/html/globals_func_k.html @@ -0,0 +1,159 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- k -

+
+
+ + + + diff --git a/doc/html/globals_func_l.html b/doc/html/globals_func_l.html new file mode 100644 index 0000000..9fb8398 --- /dev/null +++ b/doc/html/globals_func_l.html @@ -0,0 +1,206 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- l -

+
+
+ + + + diff --git a/doc/html/globals_func_m.html b/doc/html/globals_func_m.html new file mode 100644 index 0000000..3341471 --- /dev/null +++ b/doc/html/globals_func_m.html @@ -0,0 +1,204 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- m -

+
+
+ + + + diff --git a/doc/html/globals_func_n.html b/doc/html/globals_func_n.html new file mode 100644 index 0000000..2b41473 --- /dev/null +++ b/doc/html/globals_func_n.html @@ -0,0 +1,168 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- n -

+
+
+ + + + diff --git a/doc/html/globals_func_o.html b/doc/html/globals_func_o.html new file mode 100644 index 0000000..ab670e8 --- /dev/null +++ b/doc/html/globals_func_o.html @@ -0,0 +1,183 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- o -

+
+
+ + + + diff --git a/doc/html/globals_func_p.html b/doc/html/globals_func_p.html new file mode 100644 index 0000000..51f53d6 --- /dev/null +++ b/doc/html/globals_func_p.html @@ -0,0 +1,357 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- p -

+
+
+ + + + diff --git a/doc/html/globals_func_q.html b/doc/html/globals_func_q.html new file mode 100644 index 0000000..c2762eb --- /dev/null +++ b/doc/html/globals_func_q.html @@ -0,0 +1,159 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- q -

+
+
+ + + + diff --git a/doc/html/globals_func_r.html b/doc/html/globals_func_r.html new file mode 100644 index 0000000..3035959 --- /dev/null +++ b/doc/html/globals_func_r.html @@ -0,0 +1,191 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- r -

+
+
+ + + + diff --git a/doc/html/globals_func_s.html b/doc/html/globals_func_s.html new file mode 100644 index 0000000..1878da8 --- /dev/null +++ b/doc/html/globals_func_s.html @@ -0,0 +1,254 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- s -

+
+
+ + + + diff --git a/doc/html/globals_func_t.html b/doc/html/globals_func_t.html new file mode 100644 index 0000000..a09d23f --- /dev/null +++ b/doc/html/globals_func_t.html @@ -0,0 +1,177 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- t -

+
+
+ + + + diff --git a/doc/html/globals_func_u.html b/doc/html/globals_func_u.html new file mode 100644 index 0000000..040ddce --- /dev/null +++ b/doc/html/globals_func_u.html @@ -0,0 +1,189 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- u -

+
+
+ + + + diff --git a/doc/html/globals_func_w.html b/doc/html/globals_func_w.html new file mode 100644 index 0000000..1715626 --- /dev/null +++ b/doc/html/globals_func_w.html @@ -0,0 +1,159 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- w -

+
+
+ + + + diff --git a/doc/html/globals_g.html b/doc/html/globals_g.html new file mode 100644 index 0000000..34aafdd --- /dev/null +++ b/doc/html/globals_g.html @@ -0,0 +1,202 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- g -

+
+
+ + + + diff --git a/doc/html/globals_h.html b/doc/html/globals_h.html new file mode 100644 index 0000000..5fd42f2 --- /dev/null +++ b/doc/html/globals_h.html @@ -0,0 +1,172 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- h -

+
+
+ + + + diff --git a/doc/html/globals_i.html b/doc/html/globals_i.html new file mode 100644 index 0000000..d1213ef --- /dev/null +++ b/doc/html/globals_i.html @@ -0,0 +1,203 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- i -

+
+
+ + + + diff --git a/doc/html/globals_k.html b/doc/html/globals_k.html new file mode 100644 index 0000000..a754e28 --- /dev/null +++ b/doc/html/globals_k.html @@ -0,0 +1,245 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- k -

+
+
+ + + + diff --git a/doc/html/globals_l.html b/doc/html/globals_l.html new file mode 100644 index 0000000..5cfa9e0 --- /dev/null +++ b/doc/html/globals_l.html @@ -0,0 +1,207 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- l -

+
+
+ + + + diff --git a/doc/html/globals_m.html b/doc/html/globals_m.html new file mode 100644 index 0000000..7658075 --- /dev/null +++ b/doc/html/globals_m.html @@ -0,0 +1,214 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- m -

+
+
+ + + + diff --git a/doc/html/globals_n.html b/doc/html/globals_n.html new file mode 100644 index 0000000..af655fb --- /dev/null +++ b/doc/html/globals_n.html @@ -0,0 +1,169 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- n -

+
+
+ + + + diff --git a/doc/html/globals_o.html b/doc/html/globals_o.html new file mode 100644 index 0000000..e61847c --- /dev/null +++ b/doc/html/globals_o.html @@ -0,0 +1,184 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- o -

+
+
+ + + + diff --git a/doc/html/globals_p.html b/doc/html/globals_p.html new file mode 100644 index 0000000..313cc58 --- /dev/null +++ b/doc/html/globals_p.html @@ -0,0 +1,372 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- p -

+
+
+ + + + diff --git a/doc/html/globals_q.html b/doc/html/globals_q.html new file mode 100644 index 0000000..80955bc --- /dev/null +++ b/doc/html/globals_q.html @@ -0,0 +1,160 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- q -

+
+
+ + + + diff --git a/doc/html/globals_r.html b/doc/html/globals_r.html new file mode 100644 index 0000000..b1355f9 --- /dev/null +++ b/doc/html/globals_r.html @@ -0,0 +1,192 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- r -

+
+
+ + + + diff --git a/doc/html/globals_s.html b/doc/html/globals_s.html new file mode 100644 index 0000000..b51e9b8 --- /dev/null +++ b/doc/html/globals_s.html @@ -0,0 +1,255 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- s -

+
+
+ + + + diff --git a/doc/html/globals_t.html b/doc/html/globals_t.html new file mode 100644 index 0000000..eca0f2b --- /dev/null +++ b/doc/html/globals_t.html @@ -0,0 +1,178 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- t -

+
+
+ + + + diff --git a/doc/html/globals_u.html b/doc/html/globals_u.html new file mode 100644 index 0000000..fa2fa66 --- /dev/null +++ b/doc/html/globals_u.html @@ -0,0 +1,190 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- u -

+
+
+ + + + diff --git a/doc/html/globals_v.html b/doc/html/globals_v.html new file mode 100644 index 0000000..a1f973c --- /dev/null +++ b/doc/html/globals_v.html @@ -0,0 +1,161 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- v -

+
+
+ + + + diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html new file mode 100644 index 0000000..02bae15 --- /dev/null +++ b/doc/html/globals_vars.html @@ -0,0 +1,282 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- e -

+ + +

- h -

+ + +

- k -

+ + +

- m -

+ + +

- p -

+ + +

- v -

+
+
+ + + + diff --git a/doc/html/globals_w.html b/doc/html/globals_w.html new file mode 100644 index 0000000..58e57f5 --- /dev/null +++ b/doc/html/globals_w.html @@ -0,0 +1,160 @@ + + + + + + +PEARL Procedures: Globals + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- w -

+
+
+ + + + diff --git a/doc/html/group___arpes_package.html b/doc/html/group___arpes_package.html new file mode 100644 index 0000000..72456ba --- /dev/null +++ b/doc/html/group___arpes_package.html @@ -0,0 +1,173 @@ + + + + + + +PEARL Procedures: ARPES package + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ARPES package
+
+
+ +

data acquisition and analysis package for ARPES at PEARL. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  fermi-edge-analysis.ipf
 tools for analysing the Fermi edge measured by the Scienta EW4000 analyser.
 
file  pearl-anglescan-process.ipf
 processing and holographic mapping of angle scanned XPD data.
 
file  pearl-area-display.ipf
 visualization tools for 2D and 3D data.
 
file  pearl-area-import.ipf
 HDF5 file import from EPICS area detectors.
 
file  pearl-area-profiles.ipf
 profile extraction for multi-dimensional datasets acquired from area detectors.
 
file  pearl-data-explorer.ipf
 preview and import panel for PEARL data
 
file  pearl-elog.ipf
 interface for writing ELOG entries with Igor graphs as attachment.
 
file  pearl-pshell-import.ipf
 import data from PShell
 
file  pearl-scienta-preprocess.ipf
 preprocessing functions for Scienta detector images.
 
+

Detailed Description

+

data acquisition and analysis package for ARPES at PEARL.

+

The purpose of a package is to load a bunch of dependent procedure files. The ARPES package loads the following files which are helpful when working with ARPES data (any data from the Scienta analyser, that is) from PEARL.

+ +

Most of these files require the HDF5.XOP. The following files are loaded if the EPICS.XOP is present:

+
    +
  • pearl-area-live.ipf
  • +
  • pearl-epics.ipf
  • +
  • pearl-arpes-scans.ipf
  • +
+
+
+ + + + diff --git a/doc/html/group___arpes_package.js b/doc/html/group___arpes_package.js new file mode 100644 index 0000000..e2c025b --- /dev/null +++ b/doc/html/group___arpes_package.js @@ -0,0 +1,12 @@ +var group___arpes_package = +[ + [ "fermi-edge-analysis.ipf", "fermi-edge-analysis_8ipf.html", null ], + [ "pearl-anglescan-process.ipf", "pearl-anglescan-process_8ipf.html", null ], + [ "pearl-area-display.ipf", "pearl-area-display_8ipf.html", null ], + [ "pearl-area-import.ipf", "pearl-area-import_8ipf.html", null ], + [ "pearl-area-profiles.ipf", "pearl-area-profiles_8ipf.html", null ], + [ "pearl-data-explorer.ipf", "pearl-data-explorer_8ipf.html", null ], + [ "pearl-elog.ipf", "pearl-elog_8ipf.html", null ], + [ "pearl-pshell-import.ipf", "pearl-pshell-import_8ipf.html", null ], + [ "pearl-scienta-preprocess.ipf", "pearl-scienta-preprocess_8ipf.html", null ] +]; \ No newline at end of file diff --git a/doc/html/group___preparation_package.html b/doc/html/group___preparation_package.html new file mode 100644 index 0000000..9327e57 --- /dev/null +++ b/doc/html/group___preparation_package.html @@ -0,0 +1,133 @@ + + + + + + +PEARL Procedures: Sample preparation package + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Sample preparation package
+
+
+ +

PEARL sample preparation package. +More...

+

PEARL sample preparation package.

+

The purpose of a package is to load a bunch of dependent procedure files. The sample preparation package loads the following files.

+ +

The following files are loaded if the EPICS.XOP is present:

+
    +
  • pearl-epics.ipf
  • +
+
+
+ + + + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..04d370c --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,138 @@ + + + + + + +PEARL Procedures: Introduction + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Introduction
+
+
+

+Introduction

+

PEARL Procedures is a suite of Igor Pro procedures developed for data acquisition and data processing at the PEARL beamline at the Swiss Light Source.

+

+Installation

+

PEARL Procedures should be installed according to the regular Igor Pro guidelines. Please read the Igor help About Igor Pro User Files for details.

+
    +
  • Make a pearl-procs directory in your private or shared User Procedures folder, and copy the PEARL Procedures distribution there.
  • +
  • Create shortcuts of the pearl-arpes.ipf and pearl-menu.ipf files, and move them to the Igor Procedures folder next to your User Procedures folder.
  • +
  • Find the HDF5.XOP extension in the Igor Pro Folder under More Extensions/File Loaders, create a shortcut, and move the shortcut to the Igor Extensions folder next to your User Procedures folder.
  • +
  • Find the HDF5 Help.ihf next to HDF5.XOP, create a shortcut, and move the shortcut to the Igor Help Files folder next to your User Procedures folder.
  • +
+

+License Information

+

An open distribution of PEARL Procedures is available under the Apache License, Version 2.0 at https://git.psi.ch/pearl-public/igor-procs. Users of PEARL Procedures are requested to coordinate and share the development of the code with the original author. Please read and respect the respective license agreements.

+
Author
Matthias Muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+
Version
This documentation is compiled from version rev-distro-1.4.0-0-g80a01f2.
+ +
+
+ + + + diff --git a/doc/html/jquery.js b/doc/html/jquery.js new file mode 100644 index 0000000..d52a1c7 --- /dev/null +++ b/doc/html/jquery.js @@ -0,0 +1,68 @@ +/* + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/* + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/* + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/* + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/* + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/* + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + +
+
+
mainpage.dox File Reference
+
+
+
+ + + + + diff --git a/doc/html/modules.html b/doc/html/modules.html new file mode 100644 index 0000000..5ddf100 --- /dev/null +++ b/doc/html/modules.html @@ -0,0 +1,123 @@ + + + + + + +PEARL Procedures: Packages + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+ + + + + + +
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Packages
+
+
+
Packages are collections of procedure files to be loaded together. PEARL defines the following packages:
+ + +
 ARPES packageData acquisition and analysis package for ARPES at PEARL
+
+
+
+ + + + diff --git a/doc/html/modules.js b/doc/html/modules.js new file mode 100644 index 0000000..253ce8b --- /dev/null +++ b/doc/html/modules.js @@ -0,0 +1,4 @@ +var modules = +[ + [ "ARPES package", "group___arpes_package.html", "group___arpes_package" ] +]; \ No newline at end of file diff --git a/doc/html/namespace_pearl_anglescan_process.html b/doc/html/namespace_pearl_anglescan_process.html new file mode 100644 index 0000000..05b59f7 --- /dev/null +++ b/doc/html/namespace_pearl_anglescan_process.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlAnglescanProcess Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlAnglescanProcess Namespace Reference
+
+
+ +

processing and holographic mapping of angle scanned XPD data. +More...

+

Detailed Description

+

processing and holographic mapping of angle scanned XPD data.

+

PearlAnglescanProcess is declared in pearl-anglescan-process.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_anneal.html b/doc/html/namespace_pearl_anneal.html new file mode 100644 index 0000000..355f371 --- /dev/null +++ b/doc/html/namespace_pearl_anneal.html @@ -0,0 +1,129 @@ + + + + + + +PEARL Procedures: PearlAnneal Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlAnneal Namespace Reference
+
+
+ +

ramp generator for sample annealing +More...

+

Detailed Description

+

ramp generator for sample annealing

+

PearlAnneal is declared in pearl-anneal.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_area_display.html b/doc/html/namespace_pearl_area_display.html new file mode 100644 index 0000000..3cfe4da --- /dev/null +++ b/doc/html/namespace_pearl_area_display.html @@ -0,0 +1,154 @@ + + + + + + +PEARL Procedures: PearlAreaDisplay Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlAreaDisplay Namespace Reference
+
+
+ +

instant visualization of angle scan and manipulator position. +More...

+

Detailed Description

+

instant visualization of angle scan and manipulator position.

+
    +
  • 3D graphics in a Gizmo window
  • +
  • 2D graphics with profiles
  • +
  • Slicer panel
  • +
+

data dictionary of global variables in view_xxxx folder:

    +
  • gizmo_graphname = name of the gizmo window
  • +
  • slice_graphname = name of the slice/profiles graph window
  • +
  • slice_panelname = name of the slicer panel
  • +
+

+Miscellaneous

+
scienta HDF5 import, display, and slicer how-to
+
/// ad_display_brick(root:x03da_scienta_20130821_01560:data)
+/// ad_scale_scienta(root:x03da_scienta_20130821_01560:data)
+/// ad_scale_extra(root:x03da_scienta_20130821_01560:data,root:x03da_scienta_20130821_01560:MonoEnergy,root:x03da_scienta_20130821_01560:data)
+/// ad_display_brick(root:x03da_scienta_20130821_01560:data)
+/// ad_brick_slicer(root:x03da_scienta_20130821_01560:data, "gizmo_x03da_scienta_20130821_01")
+/// 
@author matthias muntwiler, matthias.muntwiler@psi.ch
+
+@copyright 2013-15 Paul Scherrer Institut @n
+Licensed under the Apache License, Version 2.0 (the "License"); @n
+  you may not use this file except in compliance with the License. @n
+  You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0  

PearlAreaDisplay is declared in pearl-area-display.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_area_import.html b/doc/html/namespace_pearl_area_import.html new file mode 100644 index 0000000..78502ab --- /dev/null +++ b/doc/html/namespace_pearl_area_import.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlAreaImport Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlAreaImport Namespace Reference
+
+
+ +

HDF5 file import from EPICS area detectors. +More...

+

Detailed Description

+

HDF5 file import from EPICS area detectors.

+

PearlAreaImport is declared in pearl-area-import.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_area_profiles.html b/doc/html/namespace_pearl_area_profiles.html new file mode 100644 index 0000000..dcd44ca --- /dev/null +++ b/doc/html/namespace_pearl_area_profiles.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlAreaProfiles Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlAreaProfiles Namespace Reference
+
+
+ +

profile extraction for multi-dimensional datasets acquired from area detectors. +More...

+

Detailed Description

+

profile extraction for multi-dimensional datasets acquired from area detectors.

+

PearlAnglescanTracker is declared in pearl-area-profiles.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_area_profiles_test.html b/doc/html/namespace_pearl_area_profiles_test.html new file mode 100644 index 0000000..20fcf99 --- /dev/null +++ b/doc/html/namespace_pearl_area_profiles_test.html @@ -0,0 +1,129 @@ + + + + + + +PEARL Procedures: PearlAreaProfilesTest Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlAreaProfilesTest Namespace Reference
+
+
+ +

profile extraction for multi-dimensional datasets acquired from area detectors. +More...

+

Detailed Description

+

profile extraction for multi-dimensional datasets acquired from area detectors.

+

PearlAreaProfilesTest is declared in pearl-area-profiles-test.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_arpes.html b/doc/html/namespace_pearl_arpes.html new file mode 100644 index 0000000..46d11ff --- /dev/null +++ b/doc/html/namespace_pearl_arpes.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlArpes Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlArpes Namespace Reference
+
+
+ +

data acquisition and analysis package for ARPES at PEARL. +More...

+

Detailed Description

+

data acquisition and analysis package for ARPES at PEARL.

+

PearlArpes is declared in pearl-arpes.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_data_explorer.html b/doc/html/namespace_pearl_data_explorer.html new file mode 100644 index 0000000..f103962 --- /dev/null +++ b/doc/html/namespace_pearl_data_explorer.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlDataExplorer Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlDataExplorer Namespace Reference
+
+
+ +

preview and import panel for PEARL data +More...

+

Detailed Description

+

preview and import panel for PEARL data

+

PearlDataExplorer is declared in pearl-data-explorer.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_elog.html b/doc/html/namespace_pearl_elog.html new file mode 100644 index 0000000..026ccb5 --- /dev/null +++ b/doc/html/namespace_pearl_elog.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlElog Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlElog Namespace Reference
+
+
+ +

interface for writing ELOG entries with Igor graphs as attachment. +More...

+

Detailed Description

+

interface for writing ELOG entries with Igor graphs as attachment.

+

PearlElog is declared in pearl-elog.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_matrix_import.html b/doc/html/namespace_pearl_matrix_import.html new file mode 100644 index 0000000..4a49165 --- /dev/null +++ b/doc/html/namespace_pearl_matrix_import.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlMatrixImport Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlMatrixImport Namespace Reference
+
+
+ +

data file import for omicron matrix (STM) files +More...

+

Detailed Description

+

data file import for omicron matrix (STM) files

+

PearlMatrixImport is declared in pearl-matrix-import.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_p_shell_import.html b/doc/html/namespace_pearl_p_shell_import.html new file mode 100644 index 0000000..d86a9b7 --- /dev/null +++ b/doc/html/namespace_pearl_p_shell_import.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlPShellImport Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlPShellImport Namespace Reference
+
+
+ +

import data from PShell +More...

+

Detailed Description

+

import data from PShell

+

PearlPShellImport is declared in pearl-pshell-import.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_preparation.html b/doc/html/namespace_pearl_preparation.html new file mode 100644 index 0000000..e202f35 --- /dev/null +++ b/doc/html/namespace_pearl_preparation.html @@ -0,0 +1,129 @@ + + + + + + +PEARL Procedures: PearlPreparation Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlPreparation Namespace Reference
+
+
+ +

PEARL sample preparation package. +More...

+

Detailed Description

+

PEARL sample preparation package.

+

PearlPreparation is declared in pearl-preparation.ipf.

+
+
+ + + + diff --git a/doc/html/namespace_pearl_scienta_preprocess.html b/doc/html/namespace_pearl_scienta_preprocess.html new file mode 100644 index 0000000..80746c1 --- /dev/null +++ b/doc/html/namespace_pearl_scienta_preprocess.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: PearlScientaPreprocess Namespace Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
PearlScientaPreprocess Namespace Reference
+
+
+ +

preprocessing functions for Scienta detector images. +More...

+

Detailed Description

+

preprocessing functions for Scienta detector images.

+

PearlScientaPreprocess is declared in pearl-scienta-preprocess.ipf.

+
+
+ + + + diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html new file mode 100644 index 0000000..ab0a39d --- /dev/null +++ b/doc/html/namespaces.html @@ -0,0 +1,137 @@ + + + + + + +PEARL Procedures: Namespace List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Namespace List
+
+
+
Here is a list of all namespaces with brief descriptions:
+ + + + + + + + + + + +
 NPearlAnglescanProcessProcessing and holographic mapping of angle scanned XPD data
 NPearlAreaDisplayInstant visualization of angle scan and manipulator position
 NPearlAreaImportHDF5 file import from EPICS area detectors
 NPearlAreaProfilesProfile extraction for multi-dimensional datasets acquired from area detectors
 NPearlArpesData acquisition and analysis package for ARPES at PEARL
 NPearlDataExplorerPreview and import panel for PEARL data
 NPearlElogInterface for writing ELOG entries with Igor graphs as attachment
 NPearlMatrixImportData file import for omicron matrix (STM) files
 NPearlPShellImportImport data from PShell
 NPearlScientaPreprocessPreprocessing functions for Scienta detector images
+
+
+
+ + + + diff --git a/doc/html/namespaces.js b/doc/html/namespaces.js new file mode 100644 index 0000000..e20adf0 --- /dev/null +++ b/doc/html/namespaces.js @@ -0,0 +1,13 @@ +var namespaces = +[ + [ "PearlAnglescanProcess", "namespace_pearl_anglescan_process.html", null ], + [ "PearlAreaDisplay", "namespace_pearl_area_display.html", null ], + [ "PearlAreaImport", "namespace_pearl_area_import.html", null ], + [ "PearlAreaProfiles", "namespace_pearl_area_profiles.html", null ], + [ "PearlArpes", "namespace_pearl_arpes.html", null ], + [ "PearlDataExplorer", "namespace_pearl_data_explorer.html", null ], + [ "PearlElog", "namespace_pearl_elog.html", null ], + [ "PearlMatrixImport", "namespace_pearl_matrix_import.html", null ], + [ "PearlPShellImport", "namespace_pearl_p_shell_import.html", null ], + [ "PearlScientaPreprocess", "namespace_pearl_scienta_preprocess.html", null ] +]; \ No newline at end of file diff --git a/doc/html/nav_f.png b/doc/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/doc/html/nav_g.png b/doc/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + if ($.browser.msie && $.browser.version<=8) { + // script.onload does not work with older versions of IE + script.onreadystatechange = function() { + if (script.readyState=='complete' || script.readyState=='loaded') { + func(); if (show) showRoot(); + } + } + } + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("img"); + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.width = 16; + imgNode.height = 22; + imgNode.border = 0; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.src = node.relpath+"arrowright.png"; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + imgNode.src = node.relpath+"arrowright.png"; + } else { + var span = document.createElement("span"); + span.style.display = 'inline-block'; + span.style.width = 16*(level+1)+'px'; + span.style.height = '22px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',0,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } if (imm || ($.browser.msie && $.browser.version>8)) { + // somehow slideDown jumps to the start of tree for IE9 :-( + $(node.getChildrenUL()).show(); + } else { + $(node.getChildrenUL()).slideDown("fast"); + } + if (node.isLast) { + node.plus_img.src = node.relpath+"arrowdown.png"; + } else { + node.plus_img.src = node.relpath+"arrowdown.png"; + } + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + gotoAnchor(anchor,aname,false); +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.src = node.relpath+"arrowdown.png"; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("img"); + o.node.plus_img.src = relpath+"arrowright.png"; + o.node.plus_img.width = 16; + o.node.plus_img.height = 22; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + $(window).load(function(){ + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + }); + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + +PEARL Procedures: Related Pages + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+ + + +
 ProjectionsFunctions of the anglescan package support the following map projections
 Todo List
+
+
+
+ + + + diff --git a/doc/html/pearl-anglescan-process-test_8ipf.html b/doc/html/pearl-anglescan-process-test_8ipf.html new file mode 100644 index 0000000..cf36572 --- /dev/null +++ b/doc/html/pearl-anglescan-process-test_8ipf.html @@ -0,0 +1,189 @@ + + + + + + +PEARL Procedures: pearl-anglescan-process-test.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-anglescan-process-test.ipf File Reference
+
+
+
#include "pearl-anglescan-process"
+#include "unit-testing"
+
+

Go to the source code of this file.

+ + + + + + +

+Functions

static variable test_convert_angles_ttpa ()
 
static variable test_hist_hemi_aziscan ()
 
+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static variable test_convert_angles_ttpa ()
+
+static
+
+ +

Definition at line 19 of file pearl-anglescan-process-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_hist_hemi_aziscan ()
+
+static
+
+ +

Definition at line 56 of file pearl-anglescan-process-test.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-anglescan-process-test_8ipf.js b/doc/html/pearl-anglescan-process-test_8ipf.js new file mode 100644 index 0000000..0d4ffc1 --- /dev/null +++ b/doc/html/pearl-anglescan-process-test_8ipf.js @@ -0,0 +1,5 @@ +var pearl_anglescan_process_test_8ipf = +[ + [ "test_convert_angles_ttpa", "pearl-anglescan-process-test_8ipf.html#a6df060f0518f3a30b184432d2cf274d2", null ], + [ "test_hist_hemi_aziscan", "pearl-anglescan-process-test_8ipf.html#a2370430e1ae1500d9d297c321b403520", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-anglescan-process-test_8ipf_source.html b/doc/html/pearl-anglescan-process-test_8ipf_source.html new file mode 100644 index 0000000..e0fd2b9 --- /dev/null +++ b/doc/html/pearl-anglescan-process-test_8ipf_source.html @@ -0,0 +1,210 @@ + + + + + + +PEARL Procedures: pearl-anglescan-process-test.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-anglescan-process-test.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 = PearlAnglescanProcessTest
+
4 #pragma version = 1.0
+
5 
+
6 #include "pearl-anglescan-process"
+
7 #include "unit-testing"
+
8 
+
9 // test suite for pearl-anglescan-process.ipf
+
10 
+
11 // unit testing framework: http://www.igorexchange.com/project/unitTesting
+
12 // run all test cases with RunTest("pearl-anglescan-process.ipf")
+
13 // if wave equalities fail, EnableDebugOutput() and read Igor help on equalWaves().
+
14 
+
15 // created: matthias.muntwiler@psi.ch, 2013-11-18
+
16 // Copyright (c) 2013 Paul Scherrer Institut
+
17 // $Id$
+
18 
+
19 static variable test_convert_angles_ttpa(){
+
20  // function parameters
+
21  variable ntests = 3
+
22  make /n=(ntests)/d/free i_theta, i_tilt, i_phi
+
23  make /n=3/d/free i_ana
+
24  make /n=1/d/free o_polar, o_azi
+
25  i_theta = {0, 90, 90}
+
26  i_tilt = {0, 0, 0}
+
27  i_phi = {0, 0, 10}
+
28  i_ana = {-30, 0, +30}
+
29 
+
30  make /n=(3,ntests)/d/free e_polar, e_azi
+
31  e_polar[][0] = {30, 0, 30}
+
32  e_azi[][0] = {-90, 0, 90}// 180, 90, 0
+
33 
+
34  e_polar[][1] = {90, 90, 90}
+
35  e_azi[][1] = {-30, 0, +30}
+
36 
+
37  e_polar[][2] = {90, 90, 90}
+
38  e_azi[][2] = {-20, 10, +40}
+
39 
+
40  variable phi0 = 0
+
41  e_azi += phi0
+
42 
+
43  convert_angles_ttpa2polar(i_theta, i_tilt, i_phi, i_ana, o_polar, o_azi)
+
44 
+
45 
+
46  CHECK_EQUAL_WAVES(o_polar, e_polar, tol=0.001)
+
47  CHECK_EQUAL_WAVES(o_azi, e_azi, tol=0.001)
+
48 
+
49  nvar /z errors = root:packages:unittesting:error_count
+
50  if ((nvar_exists(errors)) && (errors > 0))
+
51  print o_azi
+
52  print e_azi
+
53  endif
+
54 };
+
55 
+
56 static variable test_hist_hemi_aziscan(){
+
57  CHECK_EMPTY_FOLDER()
+
58 
+
59  make /n=360/d/free value, azi
+
60  azi = p
+
61  value = 1
+
62  variable polar = 45// dphi = 2
+
63 
+
64  make_hemi_grid(91, "")
+
65  wave w_index = index
+
66  wave w_nphis = nphis
+
67  wave w_dphi = dphi
+
68  wave w_values = values
+
69  wave w_azim = azim
+
70  wave w_polar = polar
+
71 
+
72  duplicate /free w_values, e_values
+
73  variable p1 = w_index[44]
+
74  variable p2 = w_index[45]
+
75  e_values = (p >= p1) && (p < p2) ? 1 : 0
+
76 
+
77  hemi_add_aziscan("", value, polar, azi)
+
78 
+
79  CHECK_EQUAL_WAVES(w_values, e_values, tol=0.001)
+
80 };
+
81 
+
static variable test_hist_hemi_aziscan()
+
variable make_hemi_grid(variable npol, string nickname, variable xpdplot=defaultValue)
create a hemispherical, constant solid angle grid
+
static variable test_convert_angles_ttpa()
+
variable hemi_add_aziscan(string nickname, wave values, variable polar, wave azi, wave weights=defaultValue)
add an azimuthal scan to a hemispherical scan grid.
+
variable convert_angles_ttpa2polar(wave theta, wave tilt, wave phi, wave analyser, wave polar, wave azi)
convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.
+
+
+ + + + diff --git a/doc/html/pearl-anglescan-process_8ipf.html b/doc/html/pearl-anglescan-process_8ipf.html new file mode 100644 index 0000000..1f1cd15 --- /dev/null +++ b/doc/html/pearl-anglescan-process_8ipf.html @@ -0,0 +1,2890 @@ + + + + + + +PEARL Procedures: pearl-anglescan-process.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-anglescan-process.ipf File Reference
+
+
+ +

processing and holographic mapping of angle scanned XPD data. +More...

+
#include "pearl-vector-operations"
+#include "pearl-polar-coordinates"
+#include <New Polar Graphs>
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlAnglescanProcess
 processing and holographic mapping of angle scanned XPD data.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

variable strip_delete_frames (wave strip, variable qlo, variable qhi, wave theta, wave tilt, wave phi)
 delete a contiguous range of frames from a strip. More...
 
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. More...
 
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. More...
 
variable normalize_strip_2d (wave strip, wave theta, variable theta_offset=defaultValue, variable smooth_method=defaultValue, variable smooth_factor=defaultValue, variable check=defaultValue)
 divide the strip by a two-dimensional normalization function. More...
 
variable crop_strip (wave strip, variable xlo, variable xhi)
 crop a strip at the sides. More...
 
variable pizza_service (wave data, string nickname, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar=defaultValue, variable nograph=defaultValue, variable folding=defaultValue, variable xpdplot=defaultValue)
 create a pizza plot from a measured (energy-integrated) data strip More...
 
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 More...
 
variable show_analyser_line (variable theta, variable tilt, variable phi, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar=defaultValue, variable nograph=defaultValue, variable xpdplot=defaultValue)
 calculate and display the line seen by the analyser for a specific emission angle More...
 
variable convert_angles_ttpd2polar (wave theta, wave tilt, wave phi, wave data, wave polar, wave azi)
 convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates. More...
 
variable convert_angles_ttpa2polar (wave theta, wave tilt, wave phi, wave analyser, wave polar, wave azi)
 convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates. More...
 
static variable line_average (wave source, wave dest)
 
static variable calc_nth (variable Theta_st, variable Theta_in, variable th, variable Phi_ran, variable Phi_ref, string Holomode)
 calculate the number of phis for a given theta More...
 
static variable calc_phi_step (variable Theta_in, variable th, variable Theta_st, variable Phi_ran, variable Phi_ref, string Holomode)
 calculate delta-phi for a given theta More...
 
static variable Calc_The_step (variable th, variable Theta_st, string Holomode)
 calculate delta-theta for a given theta More...
 
static variable CalcN_Theta (string HoloMode, variable Theta_in, variable Theta_ran, variable Theta_st)
 calculate the number of thetas for a pattern More...
 
variable make_hemi_grid (variable npol, string nickname, variable xpdplot=defaultValue)
 create a hemispherical, constant solid angle grid More...
 
string get_hemi_nickname (wave w)
 finds the nick name given any hemi wave More...
 
string get_hemi_prefix (wave w)
 finds the prefix given any hemi wave More...
 
dfr find_hemi_data (string nickname, string *prefix, string *intwave)
 finds the folder, prefix and name of holo waves given their nick name More...
 
variable clear_hemi_grid (string nickname)
 clear a hemispherical scan grid More...
 
variable duplicate_hemi_scan (string source_nickname, dfref dest_folder, string dest_nickname, variable xpdplot=defaultValue)
 duplicate a hemispherical scan dataset. More...
 
variable rotate_hemi_scan (string nickname, variable angle)
 azimuthally rotate a hemispherical scan dataset. More...
 
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. More...
 
static string display_polar_graph (string graphname, variable angle_offset=defaultValue, variable do_ticks=defaultValue)
 displays an empty polar graph More...
 
static string draw_hemi_axes (string graphname, variable do_grids=defaultValue)
 draw polar and azimuthal grids in an existing polar graph. More...
 
variable draw_diffraction_cone (string graphname, string groupname, variable theta_axis, variable theta_inner, variable phi)
 draw the circle of a diffraction cone in a stereographic polar graph. More...
 
string display_scanlines (string nickname, variable alpha_lo, variable alpha_hi, wave m_theta, wave m_tilt, wave m_phi, variable folding=defaultValue, variable projection=defaultValue)
 display a polar graph with lines indicating the angles covered by an angle scan. More...
 
threadsafe variable calc_graph_radius (variable polar, variable projection=defaultValue)
 calculate the projected polar angle More...
 
threadsafe variable calc_graph_polar (variable x, variable y, variable projection=defaultValue)
 calculate polar angle from Cartesian coordinate More...
 
threadsafe variable calc_graph_azi (variable x, variable y, variable projection=defaultValue, variable zeroAngle=defaultValue)
 calculate azimuthal angle from Cartesian coordinate More...
 
static variable update_polar_info (string graphname)
 update the angles info based on cursors A and B of a given polar graph window More...
 
static variable polar_graph_hook (WMWinHookStruct *s)
 polar graph window hook More...
 
variable set_polar_graph_cursor (string nickname, string cursorname, variable polar_angle, variable azim_angle, string graphname=defaultValue)
 
variable hemi_add_anglescan (string nickname, wave values, wave polar, wave azi, wave weights=defaultValue)
 add an arbitrary angle scan to a hemispherical scan grid. More...
 
variable hemi_add_aziscan (string nickname, wave values, variable polar, wave azi, wave weights=defaultValue)
 add an azimuthal scan to a hemispherical scan grid. More...
 
variable interpolate_hemi_scan (string nickname)
 interpolate a hemispherical scan onto a rectangular grid More...
 
variable quick_pizza_image (wave data, string nickname, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar=defaultValue, variable nograph=defaultValue, variable folding=defaultValue)
 map angle scan data onto a rectangular grid in stereographic projection More...
 
variable save_hemi_scan (string nickname, string pathname, string filename)
 save a hemispherical scan to an Igor text file More...
 
variable load_hemi_scan (string nickname, string pathname, string filename)
 load a hemispherical scan from an Igor text file More...
 
variable import_tpi_scan (string nickname, wave theta, wave phi, wave intensity, variable folding=defaultValue, variable npolar=defaultValue, variable nograph=defaultValue, variable xpdplot=defaultValue)
 import a hemispherical scan from theta-phi-intensity waves and display it More...
 
variable trim_hemi_scan (string nickname, variable theta_max)
 trim a hemispherical scan at grazing angle More...
 
wave hemi_polar_cut (string nickname, variable azim)
 extract a polar cut from a hemispherical scan. More...
 
wave hemi_azi_cut (string nickname, variable pol)
 extract an azimuthal cut from a hemispherical scan More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Variables

const variable kProjDist = 0
 
const variable kProjStereo = 1
 
const variable kProjArea = 2
 
const variable kProjGnom = 3
 
const variable kProjOrtho = 4
 
static const variable kProjScaleDist = 2
 
static const variable kProjScaleStereo = 2
 
static const variable kProjScaleArea = 2
 
static const variable kProjScaleGnom = 0.06744519021
 
static const variable kProjScaleOrtho = 2
 
+

Detailed Description

+

processing and holographic mapping of angle scanned XPD data.

+

the functions in this file map angle scanned data measured at PEARL onto a hemispherical angle grid which is compatible with XPDplot. the resulting data are in a canonical polar coordinate system (normal emission <=> polar angle = 0, azimuthal axis right-handed) which is anchored in the sample surface. the orientation of polar graphs (phi = 0 at 3 o'clock) created by this procedure corresponds to a top view of the sample surface at normal emission, and the handle of the sample plate pointing to the left (phi = 180). this is the canonical orientation of a spherical coordinate system where phi = 0 corresponds to the positive part of the x axis.

+
Note
the orientation of the sample coordinate system has changed in version 1.6. the change was necessary for compatibility with other data analysis software and calculation programs.
+
+data imported with version 1.5 and earlier, must be offset by 180 deg in phi to be compatible with the new version. data imported and displayed by the same code version will give the same picture but with different azimuthal axis. the new graph functions shows a warning if they are applied to code imported with earlier versions.
+

the measurement geometry is hard-coded but may be parametrized in the future. the theta rotation axis is perpendicular to the scattering plane. the angle dispersive axis of the analyser is parallel to the theta rotation axis. the tilt rotation axis is in the scattering plane. it rotates with theta. at normal emission it is perpendicular to the axis of the lens stack of the analyser. the phi rotation axis corresponds to the surface normal of the sample. it rotates with theta and with tilt. at normal emission it is parallel to the axis of the lens stack of the analyser.

+

coordinate transformations: (to be revised - v1.6)

*      theta_sample = theta_manipulator - theta_offset
+*      phi_sample = phi_manipulator - phi_offset
+* 

valid for theta_manipulator = normal emission only: (to be revised - v1.6)

*      theta_sample = | -(tilt_manipulator - tilt_offset) |
+*      phi_sample = 270 if tilt_manipulator - tilt_offset > 0
+*      phi_sample = 90 if tilt_manipulator - tilt_offset < 0
+* 
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ +
Version
1.6 canonical orientation of spherical coordinate system.
+ +

Definition in file pearl-anglescan-process.ipf.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable calc_graph_azi (variable x,
variable y,
variable projection = defaultValue,
variable zeroAngle = defaultValue 
)
+
+ +

calculate azimuthal angle from Cartesian coordinate

+
Parameters
+ + + + +
x,yprojected Cartesian coordinate
projectionmapping function from polar to cartesian coordinates. all supported projections are azimuthal, they have no effect on the azimuthal coordinate. see Projections for details.
    +
  • kProjDist = 0 azimuthal equidistant
  • +
  • kProjStereo = 1 stereographic (default)
  • +
  • kProjArea = 2 azimuthal equal-area
  • +
  • kProjGnom = 3 gnomonic (0 <= polar < 90)
  • +
  • kProjOrtho = 4 orthographic
  • +
+
zeroAnglezeroAngleWhere parameter of polar graphs
    +
  • 0 (default) zero is at the 3 o'clock position
  • +
  • 180 zero is at the 9 o'clock position
  • +
  • other values not tested
  • +
+
+
+
+
Returns
polar angle in degrees
+ +

Definition at line 2051 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable calc_graph_polar (variable x,
variable y,
variable projection = defaultValue 
)
+
+ +

calculate polar angle from Cartesian coordinate

+

this is the reverse mapping to calc_graph_radius()

+
Parameters
+ + + +
x,yprojected Cartesian coordinate
projectionmapping function from polar to cartesian coordinates. see Projections for details.
    +
  • kProjDist = 0 azimuthal equidistant
  • +
  • kProjStereo = 1 stereographic (default)
  • +
  • kProjArea = 2 azimuthal equal-area
  • +
  • kProjGnom = 3 gnomonic (0 <= polar < 90)
  • +
  • kProjOrtho = 4 orthographic
  • +
+
+
+
+
Returns
polar angle in degrees
+ +

Definition at line 1998 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
threadsafe variable calc_graph_radius (variable polar,
variable projection = defaultValue 
)
+
+ +

calculate the projected polar angle

+
Parameters
+ + + +
polarpolar angle in degrees
projectionmapping function from polar to cartesian coordinates. see Projections for details.
    +
  • kProjDist = 0 azimuthal equidistant
  • +
  • kProjStereo = 1 stereographic (default)
  • +
  • kProjArea = 2 azimuthal equal-area
  • +
  • kProjGnom = 3 gnomonic (0 <= polar < 90)
  • +
  • kProjOrtho = 4 orthographic
  • +
+
+
+
+
Returns
projected radius. the radius is scaled such that grazing emission maps to 2.
+ +

Definition at line 1953 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable calc_nth (variable Theta_st,
variable Theta_in,
variable th,
variable Phi_ran,
variable Phi_ref,
string Holomode 
)
+
+static
+
+ +

calculate the number of phis for a given theta

+

adapted from XPDplot 8.03

+ +

Definition at line 857 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable calc_phi_step (variable Theta_in,
variable th,
variable Theta_st,
variable Phi_ran,
variable Phi_ref,
string Holomode 
)
+
+static
+
+ +

calculate delta-phi for a given theta

+

adapted from XPDplot 8.03

+ +

Definition at line 886 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static variable Calc_The_step (variable th,
variable Theta_st,
string Holomode 
)
+
+static
+
+ +

calculate delta-theta for a given theta

+

adapted from XPDplot 8.03

+ +

Definition at line 930 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable CalcN_Theta (string HoloMode,
variable Theta_in,
variable Theta_ran,
variable Theta_st 
)
+
+static
+
+ +

calculate the number of thetas for a pattern

+

adapted from XPDplot 8.03

+ +

Definition at line 961 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable clear_hemi_grid (string nickname)
+
+ +

clear a hemispherical scan grid

+

values and weights waves are set to zero. the intensity wave is set to NaN.

+
Parameters
+ + +
nicknamefolder name or name prefix of holo waves. may be empty.
+
+
+ +

Definition at line 1240 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable convert_angles_ttpa2polar (wave theta,
wave tilt,
wave phi,
wave analyser,
wave polar,
wave azi 
)
+
+ +

convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.

+

the angles are in the manipulator coordinate system.

+
Parameters
+ + + + + + + +
[in]thetaoffset-corrected theta angle, normal emission = 0, grazing emission = 90. one dimensional wave.
[in]tiltoffset-corrected tilt angle, normal emission = 0 same dimension size and scale as theta
[in]phiphi angle, range -360 < phi < +360 offset correction is optional as long as the angles lie in the accepted range. same dimension size and scale as theta
[in]analyseranalyser angle scale corresponding to the slices scale of Scienta. one dimensional wave. this values are constant regardless of manipulator angle.
[out]polarwave to receive the polar coordinates.
[out]aziwave to receive the azimuthal coordinates.
+
+
+

for the output parameters polar and azi, you need to pass in existing numeric waves. dimension size does not matter, the waves are redimensioned by the function so that they have the same dimensions as the intensity data set. X dimension = analyser scale, Y dimension = manipulator scan.

+ +

Definition at line 796 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable convert_angles_ttpd2polar (wave theta,
wave tilt,
wave phi,
wave data,
wave polar,
wave azi 
)
+
+ +

convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.

+

similar to convert_angles_ttpa2polar() but reads the analyser angles from the X scale of data

+ +

Definition at line 757 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable crop_strip (wave strip,
variable xlo,
variable xhi 
)
+
+ +

crop a strip at the sides.

+

the strip is cropped in place, data outside the region of interest is lost.

+
Parameters
+ + + + +
[in,out]strip2D data, X-axis = analyser angle, Y-axis = arbitrary manipulator scan
[in]xlolowest analyser angle to keep (will be rounded to nearest existing point)
[in]xhihighest analyser angle to keep (will be rounded to nearest existing point)
+
+
+
Remarks
cropping should be done after smoothing and normalization operations to reduce artefacts.
+ +

Definition at line 417 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

the scan data must exist in the current data folder. azimuth = 0 should be at 9 o'clock. then the orientation is the same as the sample at normal emission and phi = 0, the handle of the sample plate pointing to the left.

+
Parameters
+ + + + + + + +
nicknamename prefix of holo waves. may be empty.
projectionmapping function from polar to cartesian coordinates
    +
  • 0 linear
  • +
  • 1 stereographic (default)
  • +
  • 2 azimuthal
  • +
  • 3 gnomonic (0 <= polar < 90).
  • +
+
graphtypetype of graph
    +
  • 1 (pol, az) trace in Igor "New Polar" (default).
  • +
  • 2 XPDplot (reserved, not implemented).
  • +
  • 3 matrix in Igor "New Polar". the matrix wave is a 2D wave with X and Y scaling corresponding to the selected projection. matrix waves can be created by interpolate_hemi_scan(). note: the pol and az waves are required as well.
  • +
+
do_ticksselect which ticks to draw. value must be the arithmetic OR of all selected items. default: 3
    +
  • 0 none
  • +
  • 1 major azimuthal
  • +
  • 2 minor azimuthal S
  • +
+
do_gridsselect which grids to draw. value must be the arithmetic OR of all selected items. default: 3
    +
  • 0 none
  • +
  • 1 radius at 0 and 90 degree azimuth
  • +
  • 2 circle at 30 and 60 degree polar
  • +
+
graphnamename of graph window. default: nickname if empty, a default name is assigned. if a window with this name is existing, the function brings it to the front, and does nothing else.
+
+
+
Returns
the name of the graph window
+ +

Definition at line 1450 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static string display_polar_graph (string graphname,
variable angle_offset = defaultValue,
variable do_ticks = defaultValue 
)
+
+static
+
+ +

displays an empty polar graph

+

the graph is drawn using Wavemetrics "New Polar Graphs.ipf".

+

initially the graph is empty. hemispherical scans are displayed by adding a trace that coveres the whole plot area, and setting the trace color to a function of the intensity. traces are added by calling WMPolarAppendTrace.

+

the following items of the graph > packages menu might be useful:

    +
  • modify polar graph
  • +
  • color table control
  • +
  • show polar cursors
  • +
  • polar graph legend
  • +
+

parameters can be changed programmatically as shown in the code of this function. after programmatic parameter changes, call WMPolarAxesRedrawGraphNow(graphname).

+
Parameters
+ + + + +
graphnamerequested name of new graph window. if empty, a default name is assigned. if a window with this name is existing, the function brings it to the front, and does nothing else.
angle_offsetazimuth (on screen) where angle 0 is plotted (zeroAngleWhere parameter of polar graphs). starting with version 1.6, the default is 0. for hemi grids created with earlier versions, it should be set to 180 for correct orientation.
do_ticksselect which ticks to draw. value must be the arithmetic OR of all selected items. default: 3
    +
  • 0 none
  • +
  • 1 major azimuthal
  • +
  • 2 minor azimuthal
  • +
+
+
+
+
Returns
the name of the graph window.
+
Version
1.7 interface change: the trace drawing code is moved to display_hemi_scan, so that this function can be reused by other graph types, e.g. display_scanlines.
+ +

Definition at line 1587 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string display_scanlines (string nickname,
variable alpha_lo,
variable alpha_hi,
wave m_theta,
wave m_tilt,
wave m_phi,
variable folding = defaultValue,
variable projection = defaultValue 
)
+
+ +

display a polar graph with lines indicating the angles covered by an angle scan.

+
Parameters
+ + + + + + + + + +
nicknamenick name for output data. this will become the name of a child folder containing the output.
alpha_lolow limit of the analyser angle.
alpha_hihigh limit of the analyser angle.
m_thetamanipulator theta angles, 0 = normal emission. size = dimsize(data, 1)
m_tiltmanipulator tilt angles, 0 = normal emission. size = dimsize(data, 1)
m_phimanipulator phi angles, 0 = azimuthal origin. size = dimsize(data, 1)
foldingrotational averaging, default = 1
projectionmapping function from polar to cartesian coordinates. see calc_graph_radius().
+
+
+
Remarks
this function is extremely slow.
+ +

Definition at line 1838 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable draw_diffraction_cone (string graphname,
string groupname,
variable theta_axis,
variable theta_inner,
variable phi 
)
+
+ +

draw the circle of a diffraction cone in a stereographic polar graph.

+

the diffraction cone consists of a circle marking the diffraction ring, and a dot marking the axis. the cone is drawn as a group of draw objects on the UserFront layer. the objects can be edited interactively.

+
Parameters
+ + + + + + +
graphnamename of graph window (not implemented yet).
groupnamename of a drawing group. if the group exists (from a previous cone) it is replaced. if the group doesn't exist, a new one is created.
theta_axispolar angle of the cone axis in degrees.
theta_innerpolar angle of the innermost point of the circle in degrees.
phiazimuthal angle of the cone axis in degrees.
+
+
+
Warning
EXPERIMENTAL! this function is under development. the interface and behaviour of this function may change significantly in future versions.
+ +

Definition at line 1774 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string draw_hemi_axes (string graphname,
variable do_grids = defaultValue 
)
+
+static
+
+ +

draw polar and azimuthal grids in an existing polar graph.

+

the function adds the following draw objects to a polar graph:

    +
  • concentric circles at polar angles 0, 30, and 60 degrees with labels.
  • +
  • radial axes at 0 and 90 degree azimuth.
  • +
+

the objects are added to the ProgFront drawing layer and will appear in front of the data trace. in interactive drawing mode, you can select the active drawing layer by clicking the tree icon while holding the Alt key.

+

the graph must have been created by display_polar_graph(). the function reads the projection mode from the window user data "projection".

+
Parameters
+ + + +
graphnamename of graph window.
do_gridsselect which optional grids to draw. value must be the arithmetic OR of all selected items. default: 3
    +
  • 0 none
  • +
  • 1 radius at 0 and 90 degree azimuth
  • +
  • 2 circle at 30 and 60 degree polar
  • +
+
+
+
+
Warning
EXPERIMENTAL! this function is under development. the interface and behaviour of this function may change significantly in future versions.
+ +

Definition at line 1702 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable duplicate_hemi_scan (string source_nickname,
dfref dest_folder,
string dest_nickname,
variable xpdplot = defaultValue 
)
+
+ +

duplicate a hemispherical scan dataset.

+

this function works only for hemi scans created by make_hemi_grid() (or compatible functions). the angle grid is recreated rather than copied point-by-point. the new dataset is independent from the original one.

+

if the version of the source dataset is pre 1.6, it is converted to version 1.6.

+
Parameters
+ + + + + +
source_nicknamename prefix for waves. source data must be in current data folder.
dest_folderdestination folder. folder must exist.
dest_nicknamename prefix for destination waves. must be unique in the current data folder. otherwise existing waves get overwritten. may be empty.
xpdplotXPDplot compatibility
    +
  • 0 (default) create the data structures required by this module
  • +
  • 1 create additional waves and notebook required by XPDplot
  • +
+
+
+
+ +

Definition at line 1287 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
dfr find_hemi_data (string nickname,
string * prefix,
string * intwave 
)
+
+ +

finds the folder, prefix and name of holo waves given their nick name

+

the function looks for holo waves in the following order:

    +
  1. if nickname is empty, check for prefix-less waves in current folder.
  2. +
  3. if nickname is the name of a child folder in the current data folder, clear the (prefix-less) waves in the child folder.
  4. +
  5. nickname is prefix of waves in current folder.
  6. +
  7. nickname is prefix of waves in root folder.
  8. +
+
Parameters
+ + + + +
[in]nicknamefolder name or name prefix of holo waves. may be empty.
[out]prefixname prefix of waves. may be empty.
[out]intwavename of intensity/values wave
+
+
+
Returns
reference of the data folder which contains the waves
+ +

Definition at line 1206 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string get_hemi_nickname (wave w)
+
+ +

finds the nick name given any hemi wave

+

the nick name is either the name of a child folder in the current data folder (PEARL specification), or a prefix of the hemi wave names (XPDplot specification).

+
Returns
the nick name
+ +

Definition at line 1150 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string get_hemi_prefix (wave w)
+
+ +

finds the prefix given any hemi wave

+

the prefix is the part of the wave name before the first underscore. the prefix is used by XPDplot where it is identical to the nick name. the prefix is empty in the PEARL specification.

+
Returns
the prefix
+ +

Definition at line 1175 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable hemi_add_anglescan (string nickname,
wave values,
wave polar,
wave azi,
wave weights = defaultValue 
)
+
+ +

add an arbitrary angle scan to a hemispherical scan grid.

+

the hemi grid must have been created in the current data folder by the make_hemi_grid function. the function determines the bin size at the given polar angle, and adds all data points which fall into a bin. a point which lies exactly on the upper boundary falls into the next bin. this function does not clear previous values before adding new data. values are added to the _tot wave, weights to the _wt wave. the intensity (_i) wave is calculated as _tot / _wt.

+ +

Definition at line 2197 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable hemi_add_aziscan (string nickname,
wave values,
variable polar,
wave azi,
wave weights = defaultValue 
)
+
+ +

add an azimuthal scan to a hemispherical scan grid.

+

the hemi grid must have been created in the current data folder by the make_hemi_grid function. the function determines the bin size at the given polar angle, and calculates the mean values of the data points which fall into a bin. a point which lies exactly on the upper boundary falls into the next bin.

+ +

Definition at line 2270 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
wave hemi_azi_cut (string nickname,
variable pol 
)
+
+ +

extract an azimuthal cut from a hemispherical scan

+

the function extracts all azimuthal angles that are present for the given polar angle.

+

the hemi grid must have been created in the current data folder by the make_hemi_grid function. correct ordering is required.

+
Parameters
+ + + +
nicknamename of the scan dataset. can be empty if no prefix is used. the dataset must be in the current datafolder.
polpolar angle in degrees
+
+
+
Returns
reference of the created wave. the wave has the same name as the intensity wave of the dataset with the suffix "_azi" and the azimuthal angle rounded to integer. it is created in the same datafolder as the original data.
+ +

Definition at line 2796 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
wave hemi_polar_cut (string nickname,
variable azim 
)
+
+ +

extract a polar cut from a hemispherical scan.

+

for each polar angle, the function first extracts all azimuthal angles. the intensity is then interpolated between the nearest neighbours of the given azimuth.

+

the hemi grid must have been created in the current data folder by the make_hemi_grid function. correct ordering is required.

+
Parameters
+ + + +
nicknamename of the scan dataset. can be empty if no prefix is used. the dataset must be in the current datafolder.
azimazimuthal angle in degrees
+
+
+
Returns
reference of the created wave. the wave has the same name as the intensity wave of the dataset with the suffix "_azi" and the azimuthal angle rounded to integer. it is created in the same datafolder as the original data.
+ +

Definition at line 2712 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable import_tpi_scan (string nickname,
wave theta,
wave phi,
wave intensity,
variable folding = defaultValue,
variable npolar = defaultValue,
variable nograph = defaultValue,
variable xpdplot = defaultValue 
)
+
+ +

import a hemispherical scan from theta-phi-intensity waves and display it

+

in the tpi format, the hemi scan data is represented by a triple of flat one-dimensional waves corresponding to the polar angle (theta), azimuthal angle (phi) and intensity. no specific sort order is required.

+
Parameters
+ + + + + + + + + +
nicknamenick name for output data
    +
  • in default mode, this will become the name of a child folder containing the output.
  • +
  • in XPDplot mode, this will become a prefix of the generated data in the root folder.
  • +
+
thetatheta angles, 0 = normal emission.
phiphi angles, 0 = azimuthal origin. size = dimsize(data, 1)
intensityintensity wave, see requirements above.
npolarnumber of polar angles, determines polar and azimuthal step size. default = 91 (1 degree steps)
foldingrotational averaging. example: 3 = average to 3-fold symmetry. default = 1.
nographdisplay a new graph window?
    +
  • 0 (default) display a new polar graph
  • +
  • 1 don't display a new graph
  • +
+
xpdplotXPDplot compatibility
    +
  • 0 (default) create waves in child folder $nickname
  • +
  • 1 create waves in root folder (compatible with XPDplot)
  • +
+
+
+
+ +

Definition at line 2621 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable interpolate_hemi_scan (string nickname)
+
+ +

interpolate a hemispherical scan onto a rectangular grid

+
Warning
experimental this function has been tested for one specific set of scan parameters. the interface and code may change at any time. the function depends on the ster_x and ster_y waves that are created by display_hemi_scan.
+ +

Definition at line 2371 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static variable line_average (wave source,
wave dest 
)
+
+static
+
+ +

Definition at line 839 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable load_hemi_scan (string nickname,
string pathname,
string filename 
)
+
+ +

load a hemispherical scan from an Igor text file

+
Todo:
function not implemented
+ +

Definition at line 2572 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable make_hemi_grid (variable npol,
string nickname,
variable xpdplot = defaultValue 
)
+
+ +

create a hemispherical, constant solid angle grid

+

all necessary waves are created in the current data folder with step size 90 / (npol - 1)

+

adapted from XPDplot 8.03

+
Parameters
+ + + + +
npolnumber of polar angles, determines polar and azimuthal step size. recommended 91 for 1-degree steps.
nicknamename prefix for waves. nick name must be unique in the current data folder. otherwise existing waves get overwritten. may be empty.
xpdplotXPDplot compatibility
    +
  • 0 (default) create the data structures required by this module
  • +
  • 1 create additional waves and notebook required by XPDplot
  • +
+
+
+
+ +

Definition at line 999 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable normalize_strip_2d (wave strip,
wave theta,
variable theta_offset = defaultValue,
variable smooth_method = defaultValue,
variable smooth_factor = defaultValue,
variable check = defaultValue 
)
+
+ +

divide the strip by a two-dimensional normalization function.

+
Warning
experimental. this function is under development.
+
Parameters
+ + +
checkenable output of intermediate results
    +
  • 0 (default) don't create additional waves
  • +
  • 1 create check waves in the current folder
  • +
  • 2 calculate check waves only, do not modify strip
  • +
+
+
+
+
Returns
if check waves are enabled, the following waves are created (overwritten if existing):
    +
  • check_dist average theta distribution
  • +
  • check_smoo smoothed distribution used to normalize the strip
  • +
+
+ +

Definition at line 357 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

this is a simple way to remove the polar angle dependence. the strip is normalized in place, previous data is overwritten.

Parameters
+ + + + + + + +
[in,out]strip2D data, X-axis = analyser angle, Y-axis = arbitrary manipulator scan
[in]thetapolar manipulator angle, 0 = normal emission, 90 = grazing emission
[in]theta_offset
[in]smooth_methodsmoothing method
    +
  • 0 none
  • +
  • 1 binomial (requires monotonic theta), see Igor's Smooth operation
  • +
  • 2 boxcar (requires monotonic theta), see Igor's Smooth operation
  • +
  • 3 polynomial fit per slice
  • +
  • 4 (default) Loess, see Igor's Loess operation
  • +
+caution: binomial and boxcar smoothing are not aware of theta. this may give unpredictable results if theta is non-monotonic.
[in]smooth_factorsmoothing parameter, depends on smooth_method
    +
  • binomial/boxcar: see Igor's Smooth operation
  • +
  • loess: see Igor's Loess operation, 0 <= smooth_factor <= 1, default 0.5
  • +
  • polynomial fit: polynomial degree, 1 = linear (default), 2 = quadratic
  • +
+
checkenable output of intermediate results
    +
  • 0 (default) don't create additional waves
  • +
  • 1 create check waves in the current folder
  • +
  • 2 calculate check waves only, do not modify strip
  • +
+
+
+
+
Returns
if check waves are enabled, the following waves are created (overwritten if existing):
    +
  • check_dist average theta distribution
  • +
  • check_smoo smoothed distribution used to normalize the strip
  • +
+
+ +

Definition at line 275 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

this is a simple way to remove the effect of the angle-dependence of the analyser transmission function. the strip is normalized in place, previous data is overwritten.

+
Parameters
+ + + + + +
[in,out]strip2D data, X-axis = analyser angle, Y-axis = arbitrary manipulator scan
[in]smooth_methodsmoothing method
    +
  • 0 none
  • +
  • 1 (default) binomial, see Igor's Smooth operation
  • +
  • 2 boxcar, see Igor's Smooth operation
  • +
  • 3 scienta_ang_transm() function fit
  • +
  • 4 LOESS smoothing, see Igor's Loess operation
  • +
+
[in]smooth_factornum parameter of Igor's Smooth operation. the default value depends on smooth_method. it is 0.5 for LOESS smoothing, 2 otherwise.
[in]checkenable output of intermediate results
    +
  • 0 (default) don't create additional waves
  • +
  • 1 create check waves in the current folder
  • +
  • 2 calculate check waves only, do not modify strip
  • +
+
+
+
+
Returns
if check waves are enabled, the following waves are created (overwritten if existing):
    +
  • check_dist average X distribution
  • +
  • check_smoo smoothed distribution used to normalize the strip
  • +
+
+ +

Definition at line 185 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable pizza_service (wave data,
string nickname,
variable theta_offset,
variable tilt_offset,
variable phi_offset,
variable npolar = defaultValue,
variable nograph = defaultValue,
variable folding = defaultValue,
variable xpdplot = defaultValue 
)
+
+ +

create a pizza plot from a measured (energy-integrated) data strip

+

accepts angle-scan data as returned by adh5_load_reduced(), maps them onto a hemispherical scan grid, and displays a polar graph.

+
Parameters
+ + + + + + + + + + +
data2D intensity wave, see requirements above
    +
  • X-axis analyser angle
  • +
  • Y-axis manipulator scan. no specific ordering required. manipulator angle waves (ManipulatorTheta, ManipulatorTilt, ManipulatorPhi) must be in the subfolder attr below the data wave.
  • +
+
nicknamenick name for output data
    +
  • in default mode, this will become the name of a child folder containing the output.
  • +
  • in XPDplot mode, this will become a prefix of the generated data in the root folder.
  • +
+
theta_offsetmanipulator theta angle corresponding to normal emission. the offset is subtracted from the ManipulatorTheta wave before processing.
tilt_offsetmanipulator tilt angle corresponding to normal emission the offset is subtracted from the ManipulatorTilt wave before processing.
phi_offsetmanipulator phi angle corresponding to phi_result = 0 the offset is subtracted from the ManipulatorPhi wave before processing.
npolarnumber of polar angles, determines polar and azimuthal step size. default = 91 (1 degree steps)
foldingrotational averaging, default = 1
nographdisplay a new graph window?
    +
  • 0 (default) display a new polar graph
  • +
  • 1 don't display a new graph
  • +
+
xpdplotXPDplot compatibility
    +
  • 0 (default) create waves in child folder $nickname
  • +
  • 1 create waves in root folder (compatible with XPDplot)
  • +
+
+
+
+
Attention
if you modify the structure of the data wave, e.g. delete some angles, this function cannot be used because the manipulator settings do not correspond to the original manipulator waves! instead, create your own manipulator waves and use pizza_service_2().
+ +

Definition at line 477 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+

accepts angle-scan data as returned by adh5_load_reduced(), maps them onto a hemispherical scan grid, and displays a polar graph.

+

the behaviour of this function is the same as pizza_service() except that the manipulator waves are specified explicitly.

+
Parameters
+ + + + + + + + + + +
data2D intensity wave, see requirements above
    +
  • X-axis analyser angle
  • +
  • Y-axis manipulator scan. no specific ordering required. manipulator angle waves (ManipulatorTheta, ManipulatorTilt, ManipulatorPhi) must be in the subfolder attr below the data wave.
  • +
+
nicknamenick name for output data
    +
  • in default mode, this will become the name of a child folder containing the output.
  • +
  • in XPDplot mode, this will become a prefix of the generated data in the root folder.
  • +
+
m_thetamanipulator theta angles, 0 = normal emission. size = dimsize(data, 1)
m_tiltmanipulator tilt angles, 0 = normal emission. size = dimsize(data, 1)
m_phimanipulator phi angles, 0 = azimuthal origin. size = dimsize(data, 1)
npolarnumber of polar angles, determines polar and azimuthal step size. default = 91 (1 degree steps)
foldingrotational averaging, default = 1
nographdisplay a new graph window?
    +
  • 0 (default) display a new polar graph
  • +
  • 1 don't display a new graph
  • +
+
xpdplotXPDplot compatibility
    +
  • 0 (default) create waves in child folder $nickname
  • +
  • 1 create waves in root folder (compatible with XPDplot)
  • +
+
+
+
+ +

Definition at line 570 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable polar_graph_hook (WMWinHookStruct * s)
+
+static
+
+ +

polar graph window hook

+

this hook converts the cursor positions to polar coordinates and displays them in a text box on the graph. the text box is visible while the cursor info box is visible.

+ +

Definition at line 2131 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable quick_pizza_image (wave data,
string nickname,
variable theta_offset,
variable tilt_offset,
variable phi_offset,
variable npolar = defaultValue,
variable nograph = defaultValue,
variable folding = defaultValue 
)
+
+ +

map angle scan data onto a rectangular grid in stereographic projection

+

accepts angle-scan data as returned by adh5_load_reduced, maps them onto a rectangular grid in stereographic projection

+
Parameters
+ + +
data2D data wave, X-axis = analyser angle, Y-axis = manipulator scan (no specific ordering required)
+
+
+
Precondition
manipulator angles as attributes in attr folder next to the data wave
+
Warning
EXPERIMENTAL
+ +

Definition at line 2425 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable rotate_hemi_scan (string nickname,
variable angle 
)
+
+ +

azimuthally rotate a hemispherical scan dataset.

+

this function works only for hemi scans created by make_hemi_grid() (or compatible functions).

+
Parameters
+ + + +
nicknamename prefix for waves. source data must be in current data folder.
angleazimuthal rotation angle in degrees.
+
+
+ +

Definition at line 1371 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable save_hemi_scan (string nickname,
string pathname,
string filename 
)
+
+ +

save a hemispherical scan to an Igor text file

+ +

Definition at line 2536 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable set_polar_graph_cursor (string nickname,
string cursorname,
variable polar_angle,
variable azim_angle,
string graphname = defaultValue 
)
+
+ +

Definition at line 2151 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable show_analyser_line (variable theta,
variable tilt,
variable phi,
variable theta_offset,
variable tilt_offset,
variable phi_offset,
variable npolar = defaultValue,
variable nograph = defaultValue,
variable xpdplot = defaultValue 
)
+
+ +

calculate and display the line seen by the analyser for a specific emission angle

+

this can be used to compare to an hemispherical plot and check the manipulator angle.

+
Parameters
+ + + + + + + + + + +
thetamanipulator theta angle
tiltmanipulator tilt angle
phimanipulator phi angle
theta_offsetmanipulator theta angle corresponding to normal emission
tilt_offsetmanipulator tilt angle corresponding to normal emission
phi_offsetmanipulator phi angle corresponding to phi_result = 0
npolarnumber of polar angles, determines polar and azimuthal step size. default = 91 (1 degree steps)
nographdisplay a new graph window?
    +
  • 0 (default) display a new polar graph
  • +
  • 1 don't display a new graph
  • +
+
xpdplotXPDplot compatibility
    +
  • 0 (default) create waves in child folder $nickname
  • +
  • 1 create waves in root folder (compatible with XPDplot)
  • +
+
+
+
+
Remarks
the function creates angle scan data under the nickname analyser.
+ +

Definition at line 687 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable strip_delete_frames (wave strip,
variable qlo,
variable qhi,
wave theta,
wave tilt,
wave phi 
)
+
+ +

delete a contiguous range of frames from a strip.

+

this can be used to remove a region of bad frames due to, e.g., measurement problems. the function operates on 2D intensity data and manipulator coordinates at the same time.

+
Parameters
+ + + + + + + +
[in,out]strip2D data, X-axis = analyser angle, Y-axis = arbitrary manipulator scan. the result is written to the original wave.
[in,out]theta1D data, manipulator scan. the result is written to the original wave.
[in,out]tilt1D data, manipulator scan. the result is written to the original wave.
[in,out]phi1D data, manipulator scan. the result is written to the original wave.
[in]qlopoint index of first frame to delete.
[in]qhipoint index of last frame to delete. qhi must be greater or equal than qlo.
+
+
+ +

Definition at line 105 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable trim_hemi_scan (string nickname,
variable theta_max 
)
+
+ +

trim a hemispherical scan at grazing angle

+

the function recalaculates the values wave from totals and weights but sets elements above a given polar angle to nan.

+
Parameters
+ + + +
nicknamename of the scan dataset. can be empty if no prefix is used. the dataset must be in the current datafolder.
theta_maxhighest polar angle to keep (0...90 degrees).
+
+
+ +

Definition at line 2670 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable update_polar_info (string graphname)
+
+static
+
+ +

update the angles info based on cursors A and B of a given polar graph window

+

the function reads the projection mode from the user data of the graph window and the zeroAngleWhere variable from the associated WMPolarGraph data folder.

+

the calculated angles are written to the csrA_theta, csrA_phi, csrB_theta, and csrB_phi global variables in the polar graph data folder. the angles text box of the graph updates from to these variables dynamically.

+
Parameters
+ + +
graphnamename of polar graph window
+
+
+ +

Definition at line 2096 of file pearl-anglescan-process.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
const variable kProjArea = 2
+
+ +

Definition at line 1928 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + +
const variable kProjDist = 0
+
+ +

Definition at line 1926 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + +
const variable kProjGnom = 3
+
+ +

Definition at line 1929 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + +
const variable kProjOrtho = 4
+
+ +

Definition at line 1930 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kProjScaleArea = 2
+
+static
+
+ +

Definition at line 1934 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kProjScaleDist = 2
+
+static
+
+ +

Definition at line 1932 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kProjScaleGnom = 0.06744519021
+
+static
+
+ +

Definition at line 1936 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kProjScaleOrtho = 2
+
+static
+
+ +

Definition at line 1937 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kProjScaleStereo = 2
+
+static
+
+ +

Definition at line 1933 of file pearl-anglescan-process.ipf.

+ +
+
+ +
+
+ + + + +
const variable kProjStereo = 1
+
+ +

Definition at line 1927 of file pearl-anglescan-process.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-anglescan-process_8ipf.js b/doc/html/pearl-anglescan-process_8ipf.js new file mode 100644 index 0000000..89906e2 --- /dev/null +++ b/doc/html/pearl-anglescan-process_8ipf.js @@ -0,0 +1,56 @@ +var pearl_anglescan_process_8ipf = +[ + [ "calc_graph_azi", "pearl-anglescan-process_8ipf.html#a4fc744e24e3e9c5efb17f14ab622bcae", null ], + [ "calc_graph_polar", "pearl-anglescan-process_8ipf.html#ae2b036a06ffac8d2bb292a65401f8a9a", null ], + [ "calc_graph_radius", "pearl-anglescan-process_8ipf.html#a75219b38ea58012abcffc848d536faa4", null ], + [ "calc_nth", "pearl-anglescan-process_8ipf.html#a9624070f3e938378631432430d47a389", null ], + [ "calc_phi_step", "pearl-anglescan-process_8ipf.html#a999a9cd7d00d3e1ec8e768228a664ad1", null ], + [ "Calc_The_step", "pearl-anglescan-process_8ipf.html#a1fb6aa7870dfbf0ed92660b7aae579e0", null ], + [ "CalcN_Theta", "pearl-anglescan-process_8ipf.html#ac0def1ded61f9cd758df0c99f4ff9470", null ], + [ "clear_hemi_grid", "pearl-anglescan-process_8ipf.html#a3ec6935a5903d0974c93a2072d743013", null ], + [ "convert_angles_ttpa2polar", "pearl-anglescan-process_8ipf.html#a3cc7eddf5c6b0658260cfb32dd2c026d", null ], + [ "convert_angles_ttpd2polar", "pearl-anglescan-process_8ipf.html#a2b38c6c9b6e60593ba69d3773b6bc779", null ], + [ "crop_strip", "pearl-anglescan-process_8ipf.html#ab65d25af7476ed18f7bf7359614a912b", null ], + [ "display_hemi_scan", "pearl-anglescan-process_8ipf.html#ae57302acfc822c4817f2b7eef55efea2", null ], + [ "display_polar_graph", "pearl-anglescan-process_8ipf.html#a46fd99d35a43601c39af6096d4e4f770", null ], + [ "display_scanlines", "pearl-anglescan-process_8ipf.html#a1f4f74a8ae557c56e1e3aacd0b45f3f1", null ], + [ "draw_diffraction_cone", "pearl-anglescan-process_8ipf.html#afedad38a418cee5d1fb9e08aae2160a0", null ], + [ "draw_hemi_axes", "pearl-anglescan-process_8ipf.html#af00d9061e410ad033a9fd1f0ca561e0d", null ], + [ "duplicate_hemi_scan", "pearl-anglescan-process_8ipf.html#aa5b1e2ab1dd43a73b7157406b803887e", null ], + [ "find_hemi_data", "pearl-anglescan-process_8ipf.html#aa26c9ed4c4d703e07788d980edc2406d", null ], + [ "get_hemi_nickname", "pearl-anglescan-process_8ipf.html#a987811346894d8d81fc590b2f5ccec49", null ], + [ "get_hemi_prefix", "pearl-anglescan-process_8ipf.html#a1442bc23122d52ba9c77e0f9baaad1da", null ], + [ "hemi_add_anglescan", "pearl-anglescan-process_8ipf.html#a4952bc53e3d6d272d25b5e35e91696b5", null ], + [ "hemi_add_aziscan", "pearl-anglescan-process_8ipf.html#a4641c716180d737700c6df87f5f8974e", null ], + [ "hemi_azi_cut", "pearl-anglescan-process_8ipf.html#ab6ac1268de338040028dca8d0ddc967c", null ], + [ "hemi_polar_cut", "pearl-anglescan-process_8ipf.html#aa486e16909d01e2251eeb4d635b972b1", null ], + [ "import_tpi_scan", "pearl-anglescan-process_8ipf.html#a5265fd61f86eb72dd877e4190bfb4adf", null ], + [ "interpolate_hemi_scan", "pearl-anglescan-process_8ipf.html#a5491cdee24910f6bad0d3af3c70f888b", null ], + [ "line_average", "pearl-anglescan-process_8ipf.html#aa54a550eccad2c8ccd82d2b4167f7a92", null ], + [ "load_hemi_scan", "pearl-anglescan-process_8ipf.html#a89f73edcd51a675f4c3933cd0242484e", null ], + [ "make_hemi_grid", "pearl-anglescan-process_8ipf.html#a902ac3a24e33f651e83ee03d31707da7", null ], + [ "normalize_strip_2d", "pearl-anglescan-process_8ipf.html#ac617c3b400488b656493af8ca08f1791", null ], + [ "normalize_strip_theta", "pearl-anglescan-process_8ipf.html#a9b56897bd92d926d65f4c67bef1d41bb", null ], + [ "normalize_strip_x", "pearl-anglescan-process_8ipf.html#a48b7d774ed8d3f4329e9923e18e580e8", null ], + [ "pizza_service", "pearl-anglescan-process_8ipf.html#afed227ae79873fd32c96afbf606d1965", null ], + [ "pizza_service_2", "pearl-anglescan-process_8ipf.html#a229770447193d4fd12032b235aab4d28", null ], + [ "polar_graph_hook", "pearl-anglescan-process_8ipf.html#ac4dbd1ece37b2cf22fa976a153977288", null ], + [ "quick_pizza_image", "pearl-anglescan-process_8ipf.html#a0b9e2b025e1d55d2a064edccf6c1c3e3", null ], + [ "rotate_hemi_scan", "pearl-anglescan-process_8ipf.html#a5162488b366e217195d8f8bd7cdde0ce", null ], + [ "save_hemi_scan", "pearl-anglescan-process_8ipf.html#a48cbd596656bc6d849c53afb4c58b90d", null ], + [ "set_polar_graph_cursor", "pearl-anglescan-process_8ipf.html#a70b0e243bcbd549e2b1da74aab605629", null ], + [ "show_analyser_line", "pearl-anglescan-process_8ipf.html#a01bac9e7d4ba743c3c34177a05070466", null ], + [ "strip_delete_frames", "pearl-anglescan-process_8ipf.html#a13e0d37ae23f68cdc5da3d84cb4beed8", null ], + [ "trim_hemi_scan", "pearl-anglescan-process_8ipf.html#a5dc0cc7db9d3d7a6b3fa3f1b04d84a5e", null ], + [ "update_polar_info", "pearl-anglescan-process_8ipf.html#a1baaa3ffd9495ed427b43cbfe6e1edf8", null ], + [ "kProjArea", "pearl-anglescan-process_8ipf.html#a207c56ac03cc18bf1bfde88dbfe2666f", null ], + [ "kProjDist", "pearl-anglescan-process_8ipf.html#aae45cc49d67f79dcedc4420f82acea4c", null ], + [ "kProjGnom", "pearl-anglescan-process_8ipf.html#a4a40c73c0e03545e0050ea370e9c57d3", null ], + [ "kProjOrtho", "pearl-anglescan-process_8ipf.html#a3b3bd11c35d5f850b34937ab6c45f659", null ], + [ "kProjScaleArea", "pearl-anglescan-process_8ipf.html#afa14187803f5b428a96c8234e04ab217", null ], + [ "kProjScaleDist", "pearl-anglescan-process_8ipf.html#a04e75675884236b6ed8244d7575d3a13", null ], + [ "kProjScaleGnom", "pearl-anglescan-process_8ipf.html#ab6670abb621d01994c0b9974f58be843", null ], + [ "kProjScaleOrtho", "pearl-anglescan-process_8ipf.html#aa5487fdee22e0da61a511c14239262f5", null ], + [ "kProjScaleStereo", "pearl-anglescan-process_8ipf.html#aed66bda9701d8a69b2174fac974aa665", null ], + [ "kProjStereo", "pearl-anglescan-process_8ipf.html#ac151c6f989d6a568fdef0acb791f84db", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-anglescan-process_8ipf_source.html b/doc/html/pearl-anglescan-process_8ipf_source.html new file mode 100644 index 0000000..1bcd8cc --- /dev/null +++ b/doc/html/pearl-anglescan-process_8ipf_source.html @@ -0,0 +1,188 @@ + + + + + + +PEARL Procedures: pearl-anglescan-process.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-anglescan-process.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 = PearlAnglescanProcess
5 #include "pearl-vector-operations"
6 #include "pearl-polar-coordinates"
7 #include <New Polar Graphs>
8 
9 // copyright (c) 2013-16 Paul Scherrer Institut
10 //
11 // Licensed under the Apache License, Version 2.0 (the "License");
12 // you may not use this file except in compliance with the License.
13 // You may obtain a copy of the License at
14 // http:///www.apache.org/licenses/LICENSE-2.0
15 //
16 // Please acknowledge the use of this code.
17 
76 
81 
82 
105 variable strip_delete_frames(wave strip, variable qlo, variable qhi, wave theta, wave tilt, wave phi){
106  wave strip// 2D data, X-axis = analyser angle, Y-axis = arbitrary manipulator scan
107  variable qlo
108  variable qhi
109  wave theta
110  wave tilt
111  wave phi
112 
113  if (qlo > qhi)
114  return -1
115  endif
116 
117  // source indices
118  variable snx = dimsize(strip, 0)
119  variable sny = dimsize(strip, 1)
120  variable sq1lo = 0
121  variable sq1hi = max(qlo-1, 0)
122  variable sq2lo = min(qhi+1, sny - 1)
123  variable sq2hi = dimsize(strip, 1) - 1
124 
125  // dest indices
126  variable dnx = snx
127  variable dny = sny - (sq2lo - sq1hi + 1)
128  variable dq1lo = 0
129  variable dq1hi = sq1hi
130  variable dq2lo = dq1hi + 1
131  variable dq2hi = dny - 1
132  variable q1ofs = sq1lo - dq1lo
133  variable q2ofs = sq2lo - dq2lo
134 
135  duplicate /free strip, strip_copy
136  redimension /n=(dnx,dny) strip
137  strip[][dq1lo,dq1hi] = strip_copy[p][q + q1ofs]
138  strip[][dq2lo,dq2hi] = strip_copy[p][q + q2ofs]
139 
140  duplicate /free theta, theta_copy
141  redimension /n=(dny) theta
142  theta[dq1lo,dq1hi] = theta_copy[p + q1ofs]
143  theta[dq2lo,dq2hi] = theta_copy[p + q2ofs]
144 
145  duplicate /free tilt, tilt_copy
146  redimension /n=(dny) tilt
147  tilt[dq1lo,dq1hi] = tilt_copy[p + q1ofs]
148  tilt[dq2lo,dq2hi] = tilt_copy[p + q2ofs]
149 
150  duplicate /free phi, phi_copy
151  redimension /n=(dny) phi
152  phi[dq1lo,dq1hi] = phi_copy[p + q1ofs]
153  phi[dq2lo,dq2hi] = phi_copy[p + q2ofs]
154 
155  return 0
156 };
157 
185 variable normalize_strip_x(wave strip, variable smooth_method = defaultValue, variable smooth_factor = defaultValue, variable check = defaultValue){
186  wave strip
187  variable smooth_method
188  variable smooth_factor
189  variable check
190 
191  if (ParamIsDefault(smooth_method))
192  smooth_method = 1
193  endif
194  if (ParamIsDefault(smooth_factor))
195  switch(smooth_method)
196  case 4:
197  smooth_factor = 0.5
198  break
199  default:
200  smooth_factor = 2
201  endswitch
202  endif
203  if (ParamIsDefault(check))
204  check = 0
205  endif
206 
207  // average over all scan positions
208  wave dist = ad_profile_x(strip, -inf, inf, "")
209  variable div = mean(dist)
210  dist /= div
211 
212  if (check)
213  duplicate /o dist, check_dist
214  endif
215 
216  // smooth distribution function
217  switch(smooth_method)
218  case 1:
219  Smooth /B /E=3 smooth_factor, dist
220  break
221  case 2:
222  Smooth /E=3 smooth_factor, dist
223  break
224  case 3:
225  make /n=1 /d /free fit_params
226  fit_scienta_ang_transm(dist, fit_params)
227  dist = scienta_ang_transm(fit_params, x)
228  break
229  case 4:
230  loess /smth=(smooth_factor) srcWave=dist
231  break
232  endswitch
233 
234  if (check)
235  duplicate /o dist, check_smoo
236  endif
237 
238  // divide
239  if (check != 2)
240  strip /= dist[p]
241  endif
242 };
243 
275 variable normalize_strip_theta(wave strip, wave theta, variable theta_offset = defaultValue, variable smooth_method = defaultValue, variable smooth_factor = defaultValue, variable check = defaultValue){
276  wave strip
277  wave theta
278  variable theta_offset
279  variable smooth_method
280  variable smooth_factor
281  variable check
282 
283  if (ParamIsDefault(check))
284  check = 0
285  endif
286  if (ParamIsDefault(theta_offset))
287  theta_offset = 0
288  endif
289  if (ParamIsDefault(smooth_method))
290  smooth_method = 4
291  endif
292  if (ParamIsDefault(smooth_factor))
293  smooth_factor = 0.5
294  endif
295 
296  // average over analyser angles
297  wave dist = ad_profile_y(strip, -inf, inf, "")
298 
299  // smooth distribution function
300  duplicate /free dist, dist_smoo
301  duplicate /free theta, theta_int
302  theta_int = theta - theta_offset
303  setscale /p x theta_int[0], theta_int[1] - theta_int[0], waveunits(theta,-1), dist, dist_smoo
304  variable nx = dimsize(strip, 0)
305  variable ix
306 
307  switch(smooth_method)
308  case 1:
309  Smooth /B /E=3 smooth_factor, dist_smoo
310  break
311  case 2:
312  Smooth /E=3 smooth_factor, dist_smoo
313  break
314  case 4:
315  loess /dest=dist_smoo /smth=(smooth_factor) srcWave=dist, factors={theta_int}
316  break
317  case 3:
318  for (ix = 0; ix < nx; ix += 1)
319  dist = strip[ix][p]
320  if (smooth_factor > 1)
321  CurveFit /nthr=0 /q /w=2 poly smooth_factor+1, dist /x=theta_int /d=dist_smoo
322  else
323  CurveFit /nthr=0 /q /w=2 line, dist /x=theta_int /d=dist_smoo
324  endif
325  strip[ix,ix][] /= dist_smoo[q]
326  endfor
327  dist_smoo = 1
328  break
329  endswitch
330 
331  // divide
332  if (check != 2)
333  strip /= dist_smoo[q]
334  endif
335 
336  // check
337  if (check)
338  duplicate /o dist, check_dist
339  duplicate /o dist_smoo, check_smoo
340  setscale /p x dimoffset(dist,0), dimdelta(dist,0), waveunits(dist,0), check_dist, check_smoo
341  endif
342 };
343 
357 variable normalize_strip_2d(wave strip, wave theta, variable theta_offset = defaultValue, variable smooth_method = defaultValue, variable smooth_factor = defaultValue, variable check = defaultValue){
358  wave strip
359  wave theta
360  variable theta_offset
361  variable smooth_method
362  variable smooth_factor
363  variable check
364 
365  if (ParamIsDefault(check))
366  check = 0
367  endif
368  if (ParamIsDefault(theta_offset))
369  theta_offset = 0
370  endif
371  if (ParamIsDefault(smooth_method))
372  smooth_method = 4
373  endif
374  if (ParamIsDefault(smooth_factor))
375  smooth_factor = 0.5
376  endif
377 
378  variable nx = dimsize(strip, 0)
379  variable ny = dimsize(strip, 1)
380 
381  duplicate /free strip, dist, alpha_int, theta_int
382  theta_int = theta[q] - theta_offset
383  alpha_int = dimoffset(strip, 0) + p * dimdelta(strip, 0)
384  redimension /n=(nx * ny) dist, alpha_int, theta_int
385 
386  switch(smooth_method)
387  case 4:
388  loess /dest=dist_smoo /smth=(smooth_factor) srcWave=dist, factors={alpha_int, theta_int}
389  redimension /n=(nx, ny) dist_smoo
390  break
391  default:
392  Abort "undefined smooth method"
393  break
394  endswitch
395 
396  // divide
397  if (check != 2)
398  strip /= dist_smoo
399  endif
400 
401  // check
402  if (check)
403  //duplicate /o dist, check_dist
404  duplicate /o dist_smoo, check_smoo
405  endif
406 };
407 
417 variable crop_strip(wave strip, variable xlo, variable xhi){
418  wave strip
419  variable xlo
420  variable xhi
421 
422  variable plo = round((xlo - dimoffset(strip, 0)) / dimdelta(strip, 0))
423  variable phi = round((xhi - dimoffset(strip, 0)) / dimdelta(strip, 0))
424  xlo = plo * dimdelta(strip, 0) + dimoffset(strip, 0)
425  xhi = phi * dimdelta(strip, 0) + dimoffset(strip, 0)
426  variable nx = phi - plo + 1
427  variable ny = dimsize(strip, 1)
428 
429  duplicate /free strip, strip_copy
430  redimension /n=(nx,ny) strip
431  strip = strip_copy[p + plo][q]
432  setscale /i x xlo, xhi, waveunits(strip, 0), strip
433 };
434 
477 variable pizza_service(wave data, string nickname, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar = defaultValue, variable nograph = defaultValue, variable folding = defaultValue, variable xpdplot = defaultValue){
478  wave data
479  string nickname
480  variable theta_offset
481  variable tilt_offset
482  variable phi_offset
483  variable npolar
484  variable nograph
485  variable folding
486  variable xpdplot
487 
488  if (ParamIsDefault(npolar))
489  npolar = 91
490  endif
491  if (ParamIsDefault(nograph))
492  nograph = 0
493  endif
494  if (ParamIsDefault(folding))
495  folding = 1
496  endif
497  if (ParamIsDefault(xpdplot))
498  xpdplot = 0
499  endif
500 
501  // sort out data folder structure
502  dfref saveDF = GetDataFolderDFR()
503  dfref dataDF = GetWavesDataFolderDFR(data)
504  setdatafolder dataDF
505  if (DataFolderExists(":attr"))
506  setdatafolder :attr
507  endif
508  dfref attrDF = GetDataFolderDFR()
509 
510  wave /sdfr=attrDF ManipulatorTheta
511  wave /sdfr=attrDF ManipulatorTilt
512  wave /sdfr=attrDF ManipulatorPhi
513 
514  if ((dimsize(ManipulatorTheta, 0) != dimsize(data, 1)) || (dimsize(ManipulatorTilt, 0) != dimsize(data, 1)) || (dimsize(ManipulatorPhi, 0) != dimsize(data, 1)))
515  Abort "Warning: The dimension size of the manipulator waves does not match the Y dimension of the data wave!\rIf you restructured the data wave, please use pizza_service_2 with properly scaled manipulator waves."
516  endif
517 
518  duplicate /free ManipulatorTheta, m_theta
519  duplicate /free ManipulatorTilt, m_tilt
520  duplicate /free ManipulatorPhi, m_phi
521 
522  m_theta -= theta_offset
523  m_tilt -= tilt_offset
524  m_phi -= phi_offset
525 
526  pizza_service_2(data, nickname, m_theta, m_tilt, m_phi, npolar=npolar, nograph=nograph, folding=folding, xpdplot=xpdplot)
527 
528  setdatafolder saveDF
529 };
530 
570 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){
571  wave data
572  string nickname
573  wave m_theta
574  wave m_tilt
575  wave m_phi
576  variable npolar
577  variable nograph
578  variable folding
579  variable xpdplot
580 
581  if (ParamIsDefault(npolar))
582  npolar = 91
583  endif
584  if (ParamIsDefault(nograph))
585  nograph = 0
586  endif
587  if (ParamIsDefault(folding))
588  folding = 1
589  endif
590  if (ParamIsDefault(xpdplot))
591  xpdplot = 0
592  endif
593 
594  if ((dimsize(m_theta, 0) != dimsize(data, 1)) || (dimsize(m_tilt, 0) != dimsize(data, 1)) || (dimsize(m_phi, 0) != dimsize(data, 1)))
595  Abort "Warning: The dimension size of the manipulator waves does not match the Y dimension of the data wave!"
596  endif
597 
598  string graphname = "graph_" + nickname
599  string outprefix = nickname
600 
601  // sort out data folder structure
602  dfref saveDF = GetDataFolderDFR()
603  dfref dataDF = GetWavesDataFolderDFR(data)
604  setdatafolder dataDF
605 
606  if (xpdplot)
607  setdatafolder root:
608  outprefix = nickname
609  else
610  setdatafolder dataDF
611  newdatafolder /s/o $nickname
612  outprefix = ""
613  endif
614  dfref destDF = GetDataFolderDFR()
615 
616  // performance monitoring
617  variable timerRefNum
618  variable /g pol_perf_secs
619  timerRefNum = startMSTimer
620 
621  duplicate /free m_tilt, corr_tilt
622  duplicate /free m_phi, corr_phi
623  corr_tilt = -m_tilt// checked 140702
624  corr_phi = m_phi// checked 140702
625 
626  make /n=1/d/free d_polar, d_azi
627 
628  convert_angles_ttpd2polar(m_theta, corr_tilt, corr_phi, data, d_polar, d_azi)
629  d_azi += 180// changed 151030 (v1.6)
630  make_hemi_grid(npolar, outprefix, xpdplot=xpdplot)
631  variable ifold
632  for (ifold = 0; ifold < folding; ifold += 1)
633  d_azi = d_azi >= 360 ? d_azi - 360 : d_azi
634  hemi_add_anglescan(outprefix, data, d_polar, d_azi)
635  d_azi += 360 / folding
636  endfor
637 
638  // normalize folding
639  if (strlen(outprefix))
640  string s_prefix = outprefix + "_"
641  string s_int = s_prefix + "i"
642  else
643  s_prefix = ""
644  s_int = "values"
645  endif
646  if (folding > 1)
647  wave values = $s_int
648  values /= folding
649  endif
650 
651  if (!nograph)
652  display_hemi_scan(outprefix, graphname = graphname)
653  endif
654 
655  if (timerRefNum >= 0)
656  pol_perf_secs = stopMSTimer(timerRefNum) / 1e6
657  endif
658 
659  setdatafolder saveDF
660 };
661 
687 variable show_analyser_line(variable theta, variable tilt, variable phi, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar = defaultValue, variable nograph = defaultValue, variable xpdplot = defaultValue){
688  variable theta
689  variable tilt
690  variable phi
691  variable theta_offset
692  variable tilt_offset
693  variable phi_offset
694  variable npolar
695  variable nograph
696  variable xpdplot
697 
698  string nickname = "analyser"
699 
700  if (ParamIsDefault(npolar))
701  npolar = 91
702  endif
703  if (ParamIsDefault(nograph))
704  nograph = 0
705  endif
706  if (ParamIsDefault(xpdplot))
707  xpdplot = 0
708  endif
709  string graphname = "graph_" + nickname
710  string outprefix = nickname
711 
712  // sort out data folder structure
713  dfref saveDF = GetDataFolderDFR()
714  dfref dataDF = saveDF
715  if (xpdplot)
716  setdatafolder root:
717  outprefix = nickname
718  else
719  setdatafolder dataDF
720  newdatafolder /s/o $nickname
721  outprefix = ""
722  endif
723  dfref destDF = GetDataFolderDFR()
724 
725  make /n=1 /free m_theta
726  make /n=1 /free m_tilt
727  make /n=1 /free m_phi
728  m_theta = theta - theta_offset
729  m_tilt = tilt - tilt_offset
730  m_tilt *= -1// checked 140702
731  m_phi = phi - phi_offset
732  //m_phi *= -1 // checked 140702
733 
734  make /n=60 /free data
735  setscale /i x -30, 30, data
736  data = x
737  make /n=1/d/free d_polar, d_azi
738 
739  convert_angles_ttpa2polar(m_theta, m_tilt, m_phi, data, d_polar, d_azi)
740  d_azi += 180// changed 151030 (v1.6)
741  d_azi = d_azi >= 360 ? d_azi - 360 : d_azi
742  make_hemi_grid(npolar, outprefix, xpdplot=xpdplot)
743  hemi_add_anglescan(outprefix, data, d_polar, d_azi)
744 
745  if (!nograph)
746  display_hemi_scan(outprefix, graphname = graphname)
747  endif
748 
749  setdatafolder saveDF
750 };
751 
756 
757 variable convert_angles_ttpd2polar(wave theta, wave tilt, wave phi, wave data, wave polar, wave azi){
758  wave theta, tilt, phi// see convert_angles_ttpa2polar
759  wave data// in, 1D or 2D
760  // X-scale must be set to analyser angle scale
761  wave polar, azi// see convert_angles_ttpa2polar
762 
763  make /n=(dimsize(data, 0)) /d /free ana
764  setscale /p x dimoffset(data, 0), dimdelta(data, 0), waveunits(data, 0), ana
765  ana = x
766  convert_angles_ttpa2polar(theta, tilt, phi, ana, polar, azi)
767 };
768 
796 variable convert_angles_ttpa2polar(wave theta, wave tilt, wave phi, wave analyser, wave polar, wave azi){
797  wave theta
798  wave tilt
799  wave phi
800  wave analyser
801  wave polar, azi
802 
803  variable nn = numpnts(theta)
804  variable na = numpnts(analyser)
805  redimension /n=(na, nn) polar, azi
806 
807  variable radius = 1// don't need to specify - everything is scalable
808 
809  // step 1: calculate cartesian detection vectors at normal emission
810  // this is simply a polar-cartesian mapping, independent of the manipulator
811  // phi=0 is in the polar rotation plane
812  make /n=(3,na) /d /free w_orig_polar, w_orig_cart, w_rot_cart, w_rot_polar
813  w_orig_polar[0][] = radius
814  w_orig_polar[1][] = analyser[q]
815  w_orig_polar[2][] = 0
816  polar2cart_wave(w_orig_polar, w_orig_cart)
817  // if the angle-dispersive axis was horizontal, we'd need to rotate the detector
818  //rotate_z_wave(w_orig_cart, 90)
819 
820  variable ii
821  for (ii = 0; ii < nn; ii += 1)
822  // step 2: rotate the detection vectors according to the manipulator angles
823  // the order of rotations is important because we rotate about fixed axes
824  // y-axis = tilt rotation axis
825  // x-axis = polar rotation axis
826  // z-axis = normal emission = azimuthal rotation axis
827  w_rot_cart = w_orig_cart
828  rotate_y_wave(w_rot_cart, -tilt[ii])
829  rotate_x_wave(w_rot_cart, -theta[ii])
830  rotate_z_wave(w_rot_cart, -phi[ii] - 90)
831  // map the vectors back to the sample coordinate system
832  cart2polar_wave(w_rot_cart, w_rot_polar)
833  // copy to output
834  polar[][ii] = w_rot_polar[1][p]
835  azi[][ii] = w_rot_polar[2][p]
836  endfor
837 };
838 
839 static variable line_average(wave source, wave dest){
840  // is this function used?
841  wave source
842  wave dest
843 
844  variable ii
845  variable nn = dimsize(source, 1)
846  make /n=(dimsize(source, 0))/d/free line
847  for (ii = 0; ii < nn; ii += 1)
848  line = source[p][ii]
849  wavestats /q line
850  dest[][ii] = line[p] / v_max
851  endfor
852 };
853 
857 static variable calc_nth(variable Theta_st, variable Theta_in, variable th, variable Phi_ran, variable Phi_ref, string Holomode){
858  Variable Theta_st, Theta_in, th, Phi_ran, Phi_ref
859  String Holomode
860  Variable The_step
861  Variable deg2rad=0.01745329
862 
863  if ( cmpstr(Holomode, "Stereographic") == 0)
864  The_step =trunc( Phi_ran*sin(th*deg2rad)*Phi_ref/Theta_st )
865  if(th==90)
866  The_step =trunc( Phi_ran*sin(th*pi/180)*Phi_ref/Theta_st )
867  endif
868  else
869  if (cmpstr(Holomode, "Parallel") == 0)
870  The_step=trunc( Phi_ran*tan(th*deg2rad)*Phi_ref/Theta_st )
871  else
872  if ( cmpstr(Holomode, "h") == 0)
873  The_step=trunc( th/Theta_in*Phi_ran/Theta_st )
874  else
875  //altro
876  endif
877  endif
878  endif
879 
880  return(The_step)
881 };
882 
886 static variable calc_phi_step(variable Theta_in, variable th, variable Theta_st, variable Phi_ran, variable Phi_ref, string Holomode){
887  Variable Theta_in, th, Theta_st, Phi_ran, Phi_ref
888  String Holomode
889 
890  Variable Phi_st
891  Variable deg2rad=0.01745329
892 
893  if ( cmpstr(Holomode, "Stereographic") == 0 )
894  if ((th < 0.5) || (trunc(Phi_ran*sin(th*deg2rad)*Phi_ref/Theta_st) == 0))
895  Phi_st=0.0
896  else
897  Phi_st=Phi_ran/(trunc(Phi_ran*sin(th*deg2rad)*Phi_ref/Theta_st))
898  endif
899  if(th==90)
900  Phi_st=2.0
901  endif
902  endif
903 
904  if ( cmpstr(Holomode, "Parallel") == 0 )
905  if((th < 0.5) || (trunc(Phi_ran*tan(th*deg2rad)*Phi_ref/Theta_st) == 0))
906  Phi_st=0.0
907  else
908  Phi_st=Phi_ran/(trunc(Phi_ran*tan(th*deg2rad)*Phi_ref/Theta_st))
909  endif
910  endif
911 
912  if ( cmpstr(Holomode, "h") == 0 )
913  if((th < 0.5) || (trunc(Phi_ran*sin(th*deg2rad)*Phi_ref/Theta_st) == 0))
914  Phi_st=0.0
915  else
916  Phi_st=Phi_ran/trunc(th/Theta_in*Phi_ran/Theta_st)
917  endif
918  endif
919 
920  if (Phi_st==0)
921  Phi_st=360
922  endif
923 
924  return(Phi_st)
925 };
926 
930 static variable Calc_The_step(variable th, variable Theta_st, string Holomode){
931  String Holomode
932  Variable th, Theta_st
933 
934  Variable deg2rad=0.01745329, dt_loc,The_step
935 
936  if ( (cmpstr(Holomode, "Stereographic")) ==0 )
937  The_step=Theta_st
938  endif
939 
940  if ( (cmpstr(Holomode, "h")) ==0 )
941  The_step=Theta_st
942  endif
943 
944  if ( cmpstr(Holomode, "Parallel") == 0 )
945  if(th < 89.5)
946  dt_loc = Theta_st/cos(th*deg2rad)
947  if(dt_loc > 10)
948  dt_loc=10
949  endif
950  The_step=dt_loc
951  else
952  The_step=10
953  endif
954  endif
955  return(The_step)
956 };
957 
961 static variable CalcN_Theta(string HoloMode, variable Theta_in, variable Theta_ran, variable Theta_st){
962  String HoloMode
963  Variable Theta_in,Theta_ran,Theta_st
964  Variable n_theta, aux, aux1,ii
965 
966  aux = Theta_in
967  aux1= Theta_in - Theta_ran
968  ii = 0
969  do
970  aux = aux - Calc_The_step(aux, Theta_st, HoloMode)
971  if(aux<=Theta_in-Theta_ran)
972  aux=Theta_in-Theta_ran
973  endif
974  ii = ii+1
975  while((aux>aux1)%&(Theta_in-aux<=Theta_ran))//
976  n_theta=ii+1
977  Return(n_theta)
978 };
979 
999 variable make_hemi_grid(variable npol, string nickname, variable xpdplot = defaultValue){
1000  variable npol
1001  string nickname
1002  variable xpdplot
1003 
1004  if (ParamIsDefault(xpdplot))
1005  xpdplot = 0
1006  endif
1007 
1008  string HoloMode = "h"
1009  variable Theta_in = 90
1010  variable Theta_ran = 90
1011  variable Theta_st = 90 / (npol - 1)
1012  variable Phi_ran = 360
1013  variable Phi_ref = 1
1014  variable Phi_in = 0
1015 
1016  variable n_theta = CalcN_Theta(HoloMode, Theta_in, Theta_ran, Theta_st)
1017 
1018  // wave names
1019  if (strlen(nickname))
1020  string s_prefix = nickname + "_"
1021  string s_int = s_prefix + "i"// Intensity wave (counts/sec)
1022  else
1023  s_prefix = ""
1024  s_int = "values"// "i" is not a valid wave name
1025  endif
1026  string s_polar = s_prefix + "pol"// thetas for each int-point of the holo
1027  string s_azim = s_prefix + "az"// phis for each int-point of the holo
1028 
1029  string s_index = s_prefix + "index"// starting index for each theta
1030  string s_theta = s_prefix + "th"// theta values
1031  string s_dphi = s_prefix + "dphi"// delta phis at each theta
1032  string s_nphis = s_prefix + "nphis"// number of phis at each theta
1033 
1034  string s_HoloData = s_prefix + "data"// All holo exp.- parameter information
1035  string s_HoloInfo = s_prefix + "info"
1036 
1037  // the following two waves are used by the pearl-anglescan procedures but not by XPDplot
1038  string s_tot = s_prefix + "tot"// accumulated counts at each point
1039  string s_weight = s_prefix + "wt"// total accumulation time at each point (arb. units)
1040 
1041  make /O/D/n=(n_theta) $s_index /wave=index
1042  make /O/D/n=(n_theta) $s_theta /wave=theta
1043  make /O/D/n=(n_theta) $s_dphi /wave=dphi
1044  make /O/D/n=(n_theta) $s_nphis /wave=nphis
1045 
1046  //---------- calculate phi-step-size for this theta:
1047  variable aux = Calc_The_step(Theta_in, Theta_st, HoloMode)
1048  dphi[0] = calc_phi_step(Theta_in, Theta_in, aux, Phi_ran, Phi_ref, HoloMode)
1049  Theta[0] = Theta_in
1050  nphis[0] = calc_nth(aux, Theta_in, Theta_in, Phi_ran, Phi_ref, HoloMode)
1051  Index[0] = nphis[0]
1052 
1053  //---------- calculate number of phis, phi-step, and starting-index for each theta:
1054  variable ii = 1
1055  do
1056  Theta[ii] = Theta[ii-1] - aux
1057  if(Theta[ii] <= Theta_in-Theta_ran)
1058  Theta[ii] = Theta_in-Theta_ran
1059  endif
1060  aux = Calc_The_step(Theta[ii], Theta_st, HoloMode)
1061  dphi[ii] = calc_phi_step(Theta_in, Theta[ii], aux, Phi_ran, Phi_ref, HoloMode)
1062  nphis[ii] = calc_nth(aux, Theta_in, Theta[ii], Phi_ran, Phi_ref, HoloMode)
1063  Index[ii] = Index[ii-1] + nphis[ii]
1064  ii=ii+1
1065  while(ii < n_theta)
1066 
1067  if (Index[n_theta-1]==Index[n_theta-2])
1068  Index[n_theta-1]=Index[n_theta-2]+1
1069  nphis[n_theta-1]=1
1070  endif
1071 
1072  variable NumPoints = sum(nphis, 0, numpnts(nphis))
1073 
1074  //---------- calculate theta and phi for each data point:
1075  make /O/D/N=(NumPoints) $s_polar /wave=polar, $s_azim /wave=azim
1076  note azim, "version=1.6"
1077 
1078  ii = 0
1079  variable StartIndex = 0
1080  variable EndIndex
1081  do
1082  EndIndex=Index[ii]
1083  Polar[StartIndex, EndIndex-1]=Theta[ii]
1084  Azim[StartIndex, EndIndex-1]= mod(Phi_ran+(x-StartIndex)*dphi[ii]+Phi_in,Phi_ran)
1085  ii = ii + 1
1086  StartIndex = EndIndex
1087  while(ii < n_theta)
1088 
1089  duplicate /o azim, $s_int /wave=values
1090  duplicate /o azim, $s_tot /wave=totals
1091  duplicate /o azim, $s_weight /wave=weights
1092  values = nan
1093  totals = 0
1094  weights = 0
1095 
1096  // XPDplot metadata
1097  if (xpdplot)
1098  string s_FileName = ""
1099  string s_Comment = "created by pearl-anglescan-process.ipf"
1100  string s_HoloMode = "Stereographic"
1101  variable /g gb_SpectraFile = 0
1102 
1103  Make/O/D/n=22 $s_HoloData /wave=HoloData
1104  HoloData[0] = NaN// v_StartKE
1105  HoloData[1] = NaN// v_StoppKE
1106  HoloData[6] = NumPoints
1107  HoloData[7] = Theta_in
1108  HoloData[8] = Theta_ran
1109  HoloData[9] = Theta_st
1110  HoloData[11] = Phi_in
1111  HoloData[12] = Phi_ran
1112  HoloData[13] = Theta_st
1113  HoloData[15] = Phi_ref
1114  HoloData[16] = Phi_ran
1115  HoloData[17] = 0// v_HoloBit (stereographic)
1116 
1117  Make/O/T/n=22 $s_HoloInfo /wave=HoloInfo
1118  HoloInfo[0] = s_FileName
1119  HoloInfo[1] = s_Comment
1120  HoloInfo[10] = s_HoloMode
1121  HoloInfo[11] = ""// s_MeasuringMode
1122 
1123  // notebook for XPDplot
1124  if (WinType(NickName) == 5)
1125  Notebook $NickName selection={startOfFile, endOfFile}
1126  Notebook $NickName text=""
1127  else
1128  NewNotebook /F=0 /K=1 /N=$NickName /W=(5,40,341,260)
1129  Notebook $NickName defaultTab=140
1130  Notebook $NickName statusWidth=300
1131  Notebook $NickName backRGB=(56797,56797,56797)
1132  Notebook $NickName pageMargins={80,80,80,80}
1133  Notebook $NickName fSize=10
1134  Notebook $NickName fStyle=0,textRGB=(65535,0,26214)
1135  Notebook $NickName textRGB=(65535,0,26214)
1136  endif
1137  Notebook $NickName text = "File:\t" + s_FileName + "\r"
1138  Notebook $NickName text = "*** " + s_Comment + " ***\r\r"
1139  Notebook $NickName text = "Angle-Mode:\t" + s_HoloMode + "\r"
1140  Notebook $NickName text = "XPDplot Nickname:\t" + NickName + "\r"
1141  endif
1142 };
1143 
1150 string get_hemi_nickname(wave w){
1151  wave w
1152 
1153  string prefix = get_hemi_prefix(w)
1154  string wname = nameofwave(w)
1155  string nickname
1156 
1157  if (strlen(prefix))
1158  nickname = prefix
1159  else
1160  string s_wave_df = GetWavesDataFolder(w, 1)
1161  dfref parent_df = $(s_wave_df + "::")
1162  nickname = GetDataFolder(0, parent_df)
1163  endif
1164 
1165  return nickname
1166 };
1167 
1175 string get_hemi_prefix(wave w){
1176  wave w
1177 
1178  string wname = nameofwave(w)
1179  string prefix
1180  if (ItemsInList(wname, "_") >= 2)
1181  prefix = StringFromList(0, wname, "_")
1182  else
1183  prefix = ""
1184  endif
1185 
1186  return prefix
1187 };
1188 
1206 dfr find_hemi_data(string nickname, string* prefix, string* intwave){
1207  string nickname
1208  string &prefix
1209  string &intwave
1210 
1211  dfref datadf
1212  prefix = ""
1213  intwave = "values"
1214  if (strlen(nickname))
1215  if (DataFolderExists(nickname))
1216  datadf = $nickname
1217  else
1218  datadf = getdatafolderdfr()
1219  prefix = nickname + "_"
1220  intwave = prefix + "i"
1221  if (exists(intwave) != 1)
1222  datadf = root:
1223  endif
1224  endif
1225  else
1226  datadf = getdatafolderdfr()
1227  prefix = ""
1228  intwave = "values"
1229  endif
1230  return datadf
1231 };
1232 
1240 variable clear_hemi_grid(string nickname){
1241  string nickname
1242 
1243  dfref datadf
1244  string s_prefix
1245  string s_int
1246  datadf = find_hemi_data(nickname, s_prefix, s_int)
1247 
1248  string s_totals = s_prefix + "tot"
1249  string s_weights = s_prefix + "wt"
1250 
1251  wave /sdfr=datadf /z w_values = $s_int
1252  wave /sdfr=datadf /z w_totals = $s_totals
1253  wave /sdfr=datadf /z w_weights = $s_weights
1254 
1255  if (waveexists(w_totals))
1256  w_totals = 0
1257  endif
1258  if (waveexists(w_weights))
1259  w_weights = 0
1260  endif
1261  if (waveexists(w_values))
1262  w_values = nan
1263  endif
1264 };
1265 
1287 variable duplicate_hemi_scan(string source_nickname, dfref dest_folder, string dest_nickname, variable xpdplot = defaultValue){
1288  string source_nickname
1289  dfref dest_folder
1290  string dest_nickname
1291  variable xpdplot
1292 
1293  if (ParamIsDefault(xpdplot))
1294  xpdplot = 0
1295  endif
1296 
1297  dfref savedf = getdatafolderdfr()
1298 
1299  // source data
1300  if (strlen(source_nickname))
1301  string s_prefix = source_nickname + "_"
1302  string s_int = s_prefix + "i"
1303  else
1304  s_prefix = ""
1305  s_int = "values"
1306  endif
1307  string s_polar = s_prefix + "pol"
1308  string s_azim = s_prefix + "az"
1309  string s_theta = s_prefix + "th"
1310  string s_tot = s_prefix + "tot"
1311  string s_weight = s_prefix + "wt"
1312  string s_matrix = s_prefix + "matrix"
1313 
1314  wave theta1 = $s_theta
1315  wave polar1 = $s_polar
1316  wave azim1 = $s_azim
1317  wave tot1 = $s_tot
1318  wave weight1 = $s_weight
1319  wave values1 = $s_int
1320  wave /z matrix1 = $s_matrix
1321 
1322  variable npol = numpnts(theta1)
1323 
1324  setdatafolder dest_folder
1325  make_hemi_grid(npol, dest_nickname, xpdplot=xpdplot)
1326 
1327  // dest data
1328  if (strlen(dest_nickname))
1329  s_prefix = dest_nickname + "_"
1330  s_int = s_prefix + "i"
1331  else
1332  s_prefix = ""
1333  s_int = "values"
1334  endif
1335  s_polar = s_prefix + "pol"
1336  s_azim = s_prefix + "az"
1337  s_theta = s_prefix + "th"
1338  s_tot = s_prefix + "tot"
1339  s_weight = s_prefix + "wt"
1340  s_matrix = s_prefix + "matrix"
1341 
1342  wave theta2 = $s_theta
1343  wave polar2 = $s_polar
1344  wave azim2 = $s_azim
1345  wave tot2 = $s_tot
1346  wave weight2 = $s_weight
1347  wave values2 = $s_int
1348 
1349  tot2 = tot1
1350  weight2 = weight1
1351  values2 = values1
1352  if (waveexists(matrix1))
1353  duplicate /o matrix1, $s_matrix
1354  endif
1355 
1356  if (!(NumberByKey("version", note(azim1), "=", "\r") >= 1.6))
1357  azim2 += 180// changed 151030 (v1.6)
1358  azim2 = azim2 >= 360 ? azim2 - 360 : azim2
1359  endif
1360 
1361  setdatafolder saveDF
1362 };
1363 
1371 variable rotate_hemi_scan(string nickname, variable angle){
1372  string nickname
1373  variable angle
1374 
1375  dfref savedf = getdatafolderdfr()
1376 
1377  if (strlen(nickname))
1378  string s_prefix = nickname + "_"
1379  string s_int = s_prefix + "i"
1380  else
1381  s_prefix = ""
1382  s_int = "values"
1383  endif
1384  string s_polar = s_prefix + "pol"
1385  string s_azim = s_prefix + "az"
1386  string s_tot = s_prefix + "tot"
1387  string s_weight = s_prefix + "wt"
1388 
1389  wave polar = $s_polar
1390  wave azim = $s_azim
1391  wave tot = $s_tot
1392  wave weight = $s_weight
1393  wave values = $s_int
1394 
1395  azim += angle
1396  azim = azim < 0 ? azim + 360 : azim
1397  azim = azim >= 360 ? azim - 360 : azim
1398 
1399  duplicate /free polar, neg_polar
1400  neg_polar = -polar
1401  sort {neg_polar, azim}, polar, azim, tot, weight, values
1402 
1403  setdatafolder saveDF
1404 };
1405 
1450 string display_hemi_scan(string nickname, variable projection = defaultValue, variable graphtype = defaultValue, variable do_ticks = defaultValue, variable do_grids = defaultValue, string graphname = defaultValue){
1451  string nickname
1452  variable projection
1453  variable graphtype
1454  variable do_ticks
1455  variable do_grids
1456  string graphname
1457 
1458  if (ParamIsDefault(projection))
1459  projection = 1
1460  endif
1461  if (ParamIsDefault(graphtype))
1462  graphtype = 1
1463  endif
1464  if (ParamIsDefault(do_ticks))
1465  do_ticks = 3
1466  endif
1467  if (ParamIsDefault(do_grids))
1468  do_grids = 3
1469  endif
1470  if (ParamIsDefault(graphname))
1471  if (strlen(nickname) > 0)
1472  graphname = nickname
1473  else
1474  graphname = GetDataFolder(0)
1475  endif
1476  endif
1477 
1478  // hemi grid waves
1479  if (strlen(nickname))
1480  string s_prefix = nickname + "_"
1481  string s_int = s_prefix + "i"
1482  else
1483  s_prefix = ""
1484  s_int = "values"
1485  endif
1486  string s_polar = s_prefix + "pol"
1487  string s_azim = s_prefix + "az"
1488  string s_matrix = s_prefix + "matrix"
1489 
1490  wave /z values = $s_int
1491  wave /z azim = $s_azim
1492  wave /z polar = $s_polar
1493  wave /z matrix = $s_matrix
1494 
1495  string s_ster_rad = s_prefix + "ster_rad"
1496  duplicate /o polar, $s_ster_rad /wave=ster_rad
1497  ster_rad = calc_graph_radius(polar, projection=projection)
1498 
1499  string s_ster_x = s_prefix + "ster_x"
1500  string s_ster_y = s_prefix + "ster_y"
1501  duplicate /o azim, $s_ster_x /wave=ster_x, $s_ster_y /wave=ster_y
1502  ster_x = ster_rad * cos(azim * pi / 180)
1503  ster_y = ster_rad * sin(azim * pi / 180)
1504 
1505  variable azim_offset = 0
1506  if (!(NumberByKey("version", note(azim), "=", "\r") >= 1.6))
1507  DoAlert /T="display hemi scan" 0, "your dataset doesn't include the version 1.6 flag. if it was created with an earlier version that might be okay. please check that the orientation is correct!"
1508  azim_offset = 180// changed 151030 (v1.6)
1509  endif
1510 
1511  string s_trace
1512  switch(graphtype)
1513  case 1:
1514  graphname = display_polar_graph(graphname, angle_offset=azim_offset, do_ticks=do_ticks)
1515 
1516  s_trace = WMPolarAppendTrace(graphname, ster_rad, azim, 360)
1517  ModifyGraph /W=$graphname mode($s_trace)=2, lsize($s_trace)=2
1518  ModifyGraph /W=$graphname zColor($s_trace)={values,*,*,BlueGreenOrange,0}
1519 
1520  ColorScale /W=$graphname /C /N=text0 /E=2 /F=0 /B=1 /A=RB /X=0.00 /Y=0.00 trace=polarY0
1521  ColorScale /W=$graphname /C /N=text0 side=2, width=5, heightPct=40, frame=0.50, lblMargin=0
1522  ColorScale /W=$graphname /C /N=text0 nticks=2, minor=1, tickLen=4.00, tickThick=0.50
1523 
1524  SetWindow $graphname, userdata(projection)=num2str(projection)
1525  draw_hemi_axes(graphname, do_grids=do_grids)
1526  break
1527  case 3:
1528  graphname = display_polar_graph(graphname, angle_offset=azim_offset, do_ticks=do_ticks)
1529 
1530  s_trace = WMPolarAppendTrace(graphname, ster_rad, azim, 360)
1531  ModifyGraph /W=$graphname mode($s_trace)=0, lsize($s_trace)=0
1532  AppendImage /L=VertCrossing /B=HorizCrossing matrix
1533 
1534  ColorScale /W=$graphname /C /N=text0 /E=2 /F=0 /B=1 /A=RB /X=0.00 /Y=0.00 image=$s_matrix
1535  ColorScale /W=$graphname /C /N=text0 side=2, width=5, heightPct=40, frame=0.50, lblMargin=0
1536  ColorScale /W=$graphname /C /N=text0 nticks=2, minor=1, tickLen=4.00, tickThick=0.50
1537 
1538  SetWindow $graphname, userdata(projection)=num2str(projection)
1539  draw_hemi_axes(graphname, do_grids=do_grids)
1540  break
1541  endswitch
1542 
1543  return graphname
1544 };
1545 
1587 static string display_polar_graph(string graphname, variable angle_offset = defaultValue, variable do_ticks = defaultValue){
1588 
1589  string graphname
1590  variable angle_offset
1591  variable do_ticks
1592 
1593  dfref savedf = GetDataFolderDFR()
1594 
1595  if (ParamIsDefault(angle_offset))
1596  angle_offset = 0
1597  endif
1598  if (ParamIsDefault(do_ticks))
1599  do_ticks = 3
1600  endif
1601 
1602  if ((strlen(graphname) == 0) || (wintype(graphname) == 0))
1603  Display /k=1 /W=(10,45,360,345)
1604  DoWindow /C $graphname
1605  graphname = WMNewPolarGraph("", graphname)
1606  WMPolarGraphSetVar(graphname, "zeroAngleWhere", angle_offset)
1607 
1608  WMPolarGraphSetVar(graphname, "angleAxisThick", 0.5)
1609  WMPolarGraphSetStr(graphname, "doMajorAngleTicks", "manual")
1610  WMPolarGraphSetVar(graphname, "majorAngleInc", 30)// major ticks in 30 deg steps
1611  WMPolarGraphSetVar(graphname, "minorAngleTicks", 2)// minor ticks in 10 deg steps
1612  WMPolarGraphSetStr(graphname, "angleTicksLocation", "Outside")
1613  WMPolarGraphSetVar(graphname, "doAngleTickLabelSubRange", 1)
1614  WMPolarGraphSetVar(graphname, "angleTickLabelRangeStart", 0)
1615  WMPolarGraphSetVar(graphname, "angleTickLabelRangeExtent", 90)
1616  WMPolarGraphSetStr(graphname, "angleTickLabelNotation", "%g")
1617 
1618  WMPolarGraphSetVar(graphname, "doPolarGrids", 0)
1619  WMPolarGraphSetVar(graphname, "doRadiusTickLabels", 0)
1620  WMPolarGraphSetStr(graphname, "radiusAxesWhere", " Off")// note the leading spaces, cf. WMPolarAnglesForRadiusAxes
1621  WMPolarGraphSetStr(graphname, "radiusTicksLocation", "Off")
1622 
1623  WMPolarGraphSetVar(graphname, "majorTickLength", 2)
1624  WMPolarGraphSetVar(graphname, "majorTickThick", 0.5)
1625  WMPolarGraphSetVar(graphname, "minorTickLength", 1)
1626  WMPolarGraphSetVar(graphname, "minorTickThick", 0.5)
1627  WMPolarGraphSetVar(graphname, "tickLabelOpaque", 0)
1628  WMPolarGraphSetVar(graphname, "tickLabelFontSize", 7)
1629 
1630  // changes
1631  if (do_ticks & 1)
1632  WMPolarGraphSetStr(graphname, "angleTicksLocation", "Outside")
1633  else
1634  WMPolarGraphSetStr(graphname, "angleTicksLocation", "Off")
1635  endif
1636  if (do_ticks & 2)
1637  WMPolarGraphSetVar(graphname, "doMinorAngleTicks", 1)
1638  else
1639  WMPolarGraphSetVar(graphname, "doMinorAngleTicks", 0)
1640  endif
1641 
1642  DoWindow /T $graphname, graphname
1643 
1644  // cursor info in angles
1645  string graphdf = "root:packages:WMPolarGraphs:" + graphname
1646  setdatafolder graphdf
1647  // current theta, phi coordinates are stored in global variables in the package folder of the graph
1648  variable /g csrA_theta
1649  variable /g csrA_phi
1650  variable /g csrB_theta
1651  variable /g csrB_phi
1652  // the text box is hidden initially. it shows up and hides with the cursor info box.
1653  string tb
1654  tb = "\\{"
1655  tb = tb + "\"A = (%.1f, %.1f)\","
1656  tb = tb + graphdf + ":csrA_theta,"
1657  tb = tb + graphdf + ":csrA_phi"
1658  tb = tb + "}"
1659  TextBox /W=$graphname /A=LT /B=1 /E=2 /F=0 /N=tb_angles /X=1 /Y=1 /V=0 tb
1660  tb = "\\{"
1661  tb = tb + "\"B = (%.1f, %.1f)\","
1662  tb = tb + graphdf + ":csrB_theta,"
1663  tb = tb + graphdf + ":csrB_phi"
1664  tb = tb + "}"
1665  AppendText /W=$graphname /N=tb_angles tb
1666  // updates are triggered by a window hook
1667  SetWindow $graphname, hook(polar_graph_hook)=PearlAnglescanProcess#polar_graph_hook
1668  else
1669  // graph window exists
1670  DoWindow /F $graphname
1671  endif
1672 
1673  setdatafolder savedf
1674  return graphname
1675 };
1676 
1702 static string draw_hemi_axes(string graphname, variable do_grids = defaultValue){
1703  string graphname
1704  variable do_grids
1705 
1706  if (ParamIsDefault(do_grids))
1707  do_grids = 3
1708  endif
1709 
1710  dfref savedf = GetDataFolderDFR()
1711 
1712  string sproj = GetUserData(graphname, "", "projection")
1713  variable projection = str2num("0" + sproj)
1714 
1715  SetDrawLayer /W=$graphname ProgFront
1716 
1717  // polar axis
1718  SetDrawEnv /W=$graphname xcoord=HorizCrossing, ycoord=VertCrossing
1719  SetDrawEnv /W=$graphname linethick= 0.5
1720  SetDrawEnv /W=$graphname dash=2
1721  SetDrawEnv /W=$graphname fillpat=0
1722  SetDrawEnv /W=$graphname fname="default", fsize=7
1723  SetDrawEnv /W=$graphname textxjust=1, textyjust=1
1724  //SetDrawEnv /W=$graphname linefgc=(65535,65535,65535)
1725  SetDrawEnv /W=$graphname save
1726 
1727  if (do_grids & 1)
1728  DrawLine /W=$graphname 0, -2, 0, 2
1729  DrawLine /W=$graphname -2, 0, 2, 0
1730  endif
1731 
1732  variable radi
1733  if (do_grids & 2)
1734  radi = calc_graph_radius(0.5, projection=projection)
1735  DrawOval /W=$graphname -radi, radi, radi, -radi
1736  radi = calc_graph_radius(30, projection=projection)
1737  DrawOval /W=$graphname -radi, radi, radi, -radi
1738  radi = calc_graph_radius(60, projection=projection)
1739  DrawOval /W=$graphname -radi, radi, radi, -radi
1740 
1741  SetDrawEnv /W=$graphname textxjust= 1,textyjust= 2
1742  SetDrawEnv /W=$graphname save
1743  radi = calc_graph_radius(30, projection=projection)
1744  DrawText /W=$graphname radi, -0.1, "30"
1745  radi = calc_graph_radius(60, projection=projection)
1746  DrawText /W=$graphname radi, -0.1, "60"
1747  endif
1748 
1749  setdatafolder savedf
1750 };
1751 
1774 variable draw_diffraction_cone(string graphname, string groupname, variable theta_axis, variable theta_inner, variable phi){
1775  string graphname
1776  string groupname
1777 
1778  variable theta_axis
1779  variable theta_inner
1780  variable phi
1781 
1782  variable r_axis = calc_graph_radius(theta_axis)
1783  variable r_inner = calc_graph_radius(theta_inner)
1784  variable r_outer = calc_graph_radius(2 * theta_axis - theta_inner)
1785 
1786  SetDrawEnv push
1787  SetDrawLayer UserFront
1788  DrawAction getgroup=$groupname, delete
1789  SetDrawEnv gstart, gname=$groupname
1790  variable xc, yc, xr, yr
1791 
1792  // cone periphery
1793  variable r_center = (r_outer + r_inner) / 2
1794  variable r_radius = (r_outer - r_inner) / 2
1795  xc = r_center * cos(phi * pi / 180)
1796  yc = r_center * sin(phi * pi / 180)
1797  xr = r_radius
1798  yr = r_radius
1799  SetDrawEnv xcoord=HorizCrossing, ycoord=VertCrossing
1800  SetDrawEnv dash=11, fillpat=0
1801  DrawOval xc - xr, yc - yr, xc + xr, yc + yr
1802 
1803  // cone axis
1804  xc = r_axis * cos(phi * pi / 180)
1805  yc = r_axis * sin(phi * pi / 180)
1806  r_radius = calc_graph_radius(2)
1807  xr = r_radius
1808  yr = r_radius
1809  SetDrawEnv xcoord=HorizCrossing, ycoord=VertCrossing
1810  SetDrawEnv fillfgc=(0,0,0)
1811  DrawOval xc - xr, yc - yr, xc + xr, yc + yr
1812 
1813  SetDrawEnv gstop
1814  SetDrawEnv pop
1815 };
1816 
1838 string display_scanlines(string nickname, variable alpha_lo, variable alpha_hi, wave m_theta, wave m_tilt, wave m_phi, variable folding = defaultValue, variable projection = defaultValue){
1839  string nickname
1840  variable alpha_lo
1841  variable alpha_hi
1842  wave m_theta
1843  wave m_tilt
1844  wave m_phi
1845  variable folding
1846  variable projection
1847 
1848  if (ParamIsDefault(folding))
1849  folding = 1
1850  endif
1851  if (ParamIsDefault(projection))
1852  projection = 1
1853  endif
1854 
1855  // sort out data folder structure
1856  dfref saveDF = GetDataFolderDFR()
1857  newdatafolder /s/o $nickname
1858  string graphname = "graph_" + nickname
1859 
1860  duplicate /free m_tilt, loc_m_tilt
1861  loc_m_tilt = -m_tilt
1862 
1863  make /n=1 /d /free d_polar, d_azi
1864  variable n_alpha = round(alpha_hi - alpha_lo) + 1
1865  make /n=(n_alpha) /d /free analyser
1866  setscale /i x alpha_lo, alpha_hi, "", analyser
1867  analyser = x
1868 
1869  convert_angles_ttpa2polar(m_theta, loc_m_tilt, m_phi, analyser, d_polar, d_azi)
1870  duplicate /free d_polar, d_radius
1871  d_radius = calc_graph_radius(d_polar, projection=projection)
1872  d_azi += 180// changed 151030 (v1.6)
1873 
1874  graphname = display_polar_graph(graphname)
1875  SetWindow $graphname, userdata(projection)=num2str(projection)
1876 
1877  variable ifold
1878  variable iang
1879  variable nang = numpnts(m_theta)
1880  string s_rad
1881  string s_azi
1882  string s_trace
1883  for (ifold = 0; ifold < folding; ifold += 1)
1884  d_azi = d_azi >= 360 ? d_azi - 360 : d_azi
1885  for (iang = 0; iang < nang; iang += 1)
1886  sprintf s_rad, "rad_%d_%d", ifold, iang
1887  duplicate /o analyser, $s_rad
1888  wave w_rad = $s_rad
1889  w_rad = d_radius[p][iang]
1890 
1891  sprintf s_azi, "azi_%d_%d", ifold, iang
1892  duplicate /o analyser, $s_azi
1893  wave w_azi = $s_azi
1894  w_azi = d_azi[p][iang]
1895 
1896  if (numtype(sum(w_rad)) == 0)
1897  s_trace = WMPolarAppendTrace(graphname, w_rad, w_azi, 360)
1898  ModifyGraph /w=$graphname mode($s_trace)=0, lsize($s_trace)=0.5
1899  endif
1900  endfor
1901  d_azi += 360 / folding
1902  endfor
1903 
1904  draw_hemi_axes(graphname)
1905 
1906  setdatafolder saveDF
1907  return graphname
1908 };
1909 
1926 const variable kProjDist = 0;
1927 const variable kProjStereo = 1;
1928 const variable kProjArea = 2;
1929 const variable kProjGnom = 3;
1930 const variable kProjOrtho = 4;
1931 
1932 static const variable kProjScaleDist = 2;
1933 static const variable kProjScaleStereo = 2;
1934 static const variable kProjScaleArea = 2;
1935 // scaled so that radius(gnom) = radius(stereo) for polar = 88
1936 static const variable kProjScaleGnom = 0.06744519021;
1937 static const variable kProjScaleOrtho = 2;
1938 
1953 threadsafe variable calc_graph_radius(variable polar, variable projection = defaultValue){
1954  variable polar
1955  variable projection
1956 
1957  if (ParamIsDefault(projection))
1958  projection = 1
1959  endif
1960 
1961  variable radius
1962  switch(projection)
1963  case kProjStereo:// stereographic
1964  radius = kProjScaleStereo * tan(polar / 2 * pi / 180)
1965  break
1966  case kProjArea:// equal area
1967  radius = kProjScaleArea * sin(polar / 2 * pi / 180)
1968  break
1969  case kProjGnom:// gnomonic
1970  radius = polar < 90 ? kProjScaleGnom * tan(polar * pi / 180) : inf
1971  break
1972  case kProjOrtho:// orthographic
1973  radius = kProjScaleOrtho * sin(polar * pi / 180)
1974  break
1975  default:// equidistant
1976  radius = kProjScaleDist * polar / 90
1977  endswitch
1978 
1979  return radius
1980 };
1981 
1998 threadsafe variable calc_graph_polar(variable x, variable y, variable projection = defaultValue){
1999  variable x
2000  variable y
2001  variable projection
2002 
2003  if (ParamIsDefault(projection))
2004  projection = 1
2005  endif
2006 
2007  variable radius
2008  variable polar
2009 
2010  radius = sqrt(x^2 + y^2)
2011  switch(projection)
2012  case kProjStereo:// stereographic
2013  polar = 2 * atan(radius / kProjScaleStereo) * 180 / pi
2014  break
2015  case kProjArea:// equal area
2016  polar = 2 * asin(radius / kProjScaleArea) * 180 / pi
2017  break
2018  case kProjGnom:// gnomonic
2019  polar = atan(radius / kProjScaleGnom) * 180 / pi
2020  break
2021  case kProjOrtho:// orthographic
2022  polar = asin(radius / kProjScaleOrtho) * 180 / pi
2023  break
2024  default:// equidistant
2025  polar = 90 * radius / kProjScaleDist
2026  endswitch
2027 
2028  return polar
2029 };
2030 
2051 threadsafe variable calc_graph_azi(variable x, variable y, variable projection = defaultValue, variable zeroAngle = defaultValue){
2052  variable x
2053  variable y
2054  variable projection
2055  variable zeroAngle
2056 
2057  if (ParamIsDefault(projection))
2058  projection = 1
2059  endif
2060  if (ParamIsDefault(zeroAngle))
2061  zeroAngle = 0
2062  endif
2063 
2064  variable azi
2065  if (x > 0)
2066  azi = atan(y / x) * 180 / pi
2067  else
2068  azi = atan(y / x) * 180 / pi + 180
2069  endif
2070 
2071  azi += zeroAngle
2072  if (azi < 0)
2073  azi += 360
2074  endif
2075  if (azi >= 360)
2076  azi -= 360
2077  endif
2078  if (numtype(azi) != 0)
2079  azi = 0
2080  endif
2081 
2082  return azi
2083 };
2084 
2096 static variable update_polar_info(string graphname){
2097  string graphname
2098 
2099  dfref savedf = GetDataFolderDFR()
2100 
2101  string graphdf = "root:packages:WMPolarGraphs:" + graphname
2102  setdatafolder graphdf
2103 
2104  nvar csrA_theta
2105  nvar csrA_phi
2106  nvar csrB_theta
2107  nvar csrB_phi
2108 
2109  string sproj = GetUserData(graphname, "", "projection")
2110  variable projection = str2num("0" + sproj)
2111  nvar zeroAngleWhere
2112 
2113  variable x = hcsr(A, graphname)
2114  variable y = vcsr(A, graphname)
2115  csrA_theta = calc_graph_polar(x, y, projection=projection)
2116  csrA_phi = calc_graph_azi(x, y, projection=projection, zeroAngle=zeroAngleWhere)
2117 
2118  x = hcsr(B, graphname)
2119  y = vcsr(B, graphname)
2120  csrB_theta = calc_graph_polar(x, y, projection=projection)
2121  csrB_phi = calc_graph_azi(x, y, projection=projection, zeroAngle=zeroAngleWhere)
2122 
2123  setdatafolder savedf
2124 };
2125 
2131 static variable polar_graph_hook(WMWinHookStruct* s){
2132  STRUCT WMWinHookStruct &s
2133 
2134  Variable hookResult = 0
2135 
2136  switch(s.eventCode)
2137  case 7:// cursor moved
2138  update_polar_info(s.winname)
2139  break
2140  case 20:// show info
2141  TextBox /W=$s.winname /N=tb_angles /C /V=1
2142  break
2143  case 21:// hide info
2144  TextBox /W=$s.winname /N=tb_angles /C /V=0
2145  break
2146  endswitch
2147 
2148  return hookResult// 0 if nothing done, else 1
2149 };
2150 
2151 variable set_polar_graph_cursor(string nickname, string cursorname, variable polar_angle, variable azim_angle, string graphname = defaultValue){
2152  string nickname
2153  string cursorname
2154  variable polar_angle
2155  variable azim_angle
2156  string graphname
2157 
2158  if (ParamIsDefault(graphname))
2159  if (strlen(nickname) > 0)
2160  graphname = nickname
2161  else
2162  graphname = GetDataFolder(0)
2163  endif
2164  endif
2165 
2166  if (strlen(nickname))
2167  string s_prefix = nickname + "_"
2168  else
2169  s_prefix = ""
2170  endif
2171  string s_polar = s_prefix + "pol"
2172  string s_azim = s_prefix + "az"
2173  wave /z azim = $s_azim
2174  wave /z polar = $s_polar
2175 
2176  FindLevel /P /Q polar, polar_angle
2177  if (v_flag == 0)
2178  variable polar_level = floor(v_levelx)
2179  FindLevel /P /Q /R=[polar_level] azim, azim_angle
2180  if (v_flag == 0)
2181  variable azim_level = round(v_levelx)
2182  string tracename = "polarY0"
2183  Cursor /W=$graphname /P $cursorname $traceName azim_level
2184  endif
2185  endif
2186 };
2187 
2197 variable hemi_add_anglescan(string nickname, wave values, wave polar, wave azi, wave weights = defaultValue){
2198  string nickname// name prefix of holo waves.
2199  // may be empty.
2200  wave values// intensity values
2201  // the wave can be one- or two-dimensional.
2202  // no specific order required, the function sorts the arrays internally
2203  wave polar// polar coordinates. allowed range 0 <= theta <= 90
2204  // dimensions corresponding to value.
2205  wave azi// azimuthal coordinates. allowed range -360 <= phi < +360
2206  // dimensions corresponding to value.
2207  wave weights// total accumulation time of each point of values. default = 1
2208 
2209  if (ParamIsDefault(weights))
2210  duplicate /free values, weights
2211  weights = 1
2212  endif
2213 
2214  // quick check whether hemi grid is existing
2215  if (strlen(nickname))
2216  string s_prefix = nickname + "_"
2217  string s_int = s_prefix + "i"
2218  else
2219  s_prefix = ""
2220  s_int = "values"
2221  endif
2222  string s_polar = s_prefix + "pol"
2223  string s_azim = s_prefix + "az"
2224  string s_theta = s_prefix + "th"
2225 
2226  wave /z w_values = $s_int
2227  wave /z w_azim = $s_azim
2228  wave /z w_polar = $s_polar
2229  wave /z w_theta = $s_theta
2230  if (!waveexists(w_values) || !waveexists(w_azim) || !waveexists(w_polar))
2231  abort "Missing hemispherical scan grid. Please call make_hemi_grid() first."
2232  endif
2233 
2234  // make internal copies, one-dimensional, ordered in theta
2235  duplicate /free values, values_copy
2236  duplicate /free polar, polar_copy
2237  duplicate /free azi, azi_copy
2238  duplicate /free weights, weights_copy
2239  variable nn = dimsize(values, 0) * max(dimsize(values, 1), 1)
2240  redimension /n=(nn) values_copy, polar_copy, azi_copy, weights_copy
2241  sort /r polar_copy, polar_copy, azi_copy, values_copy, weights_copy
2242 
2243  variable pol
2244  variable pol_st = abs(w_theta[1] - w_theta[0])
2245  variable pol1, pol2
2246 
2247  duplicate /free azi_copy, azi_slice
2248  duplicate /free values_copy, values_slice
2249  duplicate /free weights_copy, weights_slice
2250  for (pol = 90; pol >= 0; pol -= pol_st)
2251  pol1 = pol - pol_st / 2
2252  pol2 = pol + pol_st / 2
2253  extract /free /indx polar_copy, sel, (pol1 < polar_copy) && (polar_copy <= pol2)
2254  if (numpnts(sel) > 0)
2255  redimension /n=(numpnts(sel)) azi_slice, values_slice, weights_slice
2256  azi_slice = azi_copy[sel]
2257  values_slice = values_copy[sel]
2258  weights_slice = weights_copy[sel]
2259  hemi_add_aziscan(nickname, values_slice, pol, azi_slice, weights=weights_slice)
2260  endif
2261  endfor
2262 };
2263 
2270 variable hemi_add_aziscan(string nickname, wave values, variable polar, wave azi, wave weights = defaultValue){
2271  string nickname// name prefix of holo waves.
2272  // may be empty.
2273  wave values// intensity values of the azimuthal scan at the positions given in the azi parameter
2274  variable polar// polar angle where to add the azi scan
2275  wave azi// angle positions of the azimuthal scan
2276  // acceptable range: >= -360 and < +360
2277  // no specific order required, the function sorts the array internally
2278  wave weights// total accumulation time of each point of values. default = 1
2279 
2280  if (ParamIsDefault(weights))
2281  duplicate /free values, weights
2282  weights = 1
2283  endif
2284 
2285  // hemi grid waves
2286  if (strlen(nickname))
2287  string s_prefix = nickname + "_"
2288  string s_int = s_prefix + "i"
2289  else
2290  s_prefix = ""
2291  s_int = "values"
2292  endif
2293  string s_totals = s_prefix + "tot"
2294  string s_weights = s_prefix + "wt"
2295  string s_polar = s_prefix + "pol"
2296  string s_azim = s_prefix + "az"
2297  string s_index = s_prefix + "index"
2298  string s_theta = s_prefix + "th"
2299  string s_dphi = s_prefix + "dphi"
2300  string s_nphis = s_prefix + "nphis"
2301 
2302  wave w_polar = $s_polar
2303  wave w_azim = $s_azim
2304  wave w_values = $s_int
2305  wave w_totals = $s_totals
2306  wave w_weights = $s_weights
2307  wave w_index = $s_index
2308  wave w_theta = $s_theta
2309  wave w_dphi = $s_dphi
2310  wave w_nphis = $s_nphis
2311 
2312  // destination slice coordinates
2313  //polar = round(polar)
2314  //variable ipol = 90 - polar
2315  variable ipol = BinarySearch(w_theta, polar)
2316  if (ipol < 0)
2317  abort "assertion failed in hemi_add_aziscan(): polar angle not found in grid."
2318  endif
2319 
2320  variable d1, d2
2321  if (ipol >= 1)
2322  d1 = w_index[ipol - 1]
2323  else
2324  d1 = 0
2325  endif
2326  d2 = w_index[ipol] - 1
2327  variable nd = d2 - d1 + 1
2328  variable dphi = w_dphi[ipol]
2329  variable az1, az2
2330 
2331  // source slice coordinates
2332  // order the slice from -dphi/2 to 360-dphi/2
2333  azi = azi < 0 ? azi + 360 : azi
2334  azi = azi >= 360 - dphi/2 ? azi - 360 : azi
2335  duplicate /free values, sel_values
2336  duplicate /free weights, sel_weights
2337 
2338  // loop over destination
2339  variable id
2340  variable v1, v2, w1, w2
2341  for (id = 0; id < nd; id += 1)
2342  az1 = (id - 0.5) * dphi
2343  az2 = (id + 0.5) * dphi
2344  extract /free /indx azi, sel, (az1 <= azi) && (azi < az2)
2345  if (numpnts(sel) > 0)
2346  redimension /n=(numpnts(sel)) sel_values, sel_weights
2347  sel_values = values[sel]
2348  sel_weights = weights[sel]
2349  v1 = w_totals[d1 + id]
2350  w1 = w_weights[d1 + id]
2351  if ((numtype(v1) == 2) || (w1 <= 0))
2352  v1 = 0
2353  w1 = 0
2354  endif
2355  v2 = sum(sel_values)
2356  w2 = sum(sel_weights)
2357  w_totals[d1 + id] = v1 + v2
2358  w_weights[d1 + id] = w1 + w2
2359  endif
2360  endfor
2361  w_values[d1, d1 + nd - 1] = w_totals[p] / w_weights[p]
2362 };
2363 
2371 variable interpolate_hemi_scan(string nickname){
2372  string nickname
2373 
2374  if (strlen(nickname))
2375  string s_prefix = nickname + "_"
2376  string s_int = s_prefix + "i"
2377  else
2378  s_prefix = ""
2379  s_int = "values"
2380  endif
2381 
2382  string s_polar = s_prefix + "pol"
2383  string s_azim = s_prefix + "az"
2384  string s_ster_x = s_prefix + "ster_x"
2385  string s_ster_y = s_prefix + "ster_y"
2386 
2387  wave values = $s_int
2388  wave azim = $s_azim
2389  wave polar = $s_polar
2390  wave ster_x = $s_ster_x
2391  wave ster_y = $s_ster_y
2392 
2393  variable min_ster_x = wavemin(ster_x)
2394  variable max_ster_x = wavemax(ster_x)
2395  variable x0 = min_ster_x
2396  variable xn = 181
2397  variable dx = (max_ster_x - min_ster_x) / (xn - 1)
2398  make /n=(numpnts(ster_x), 3) /free triplet
2399  triplet[][0] = ster_x[p]
2400  triplet[][1] = ster_y[p]
2401  triplet[][2] = values[p]
2402  //ImageInterpolate /stw /s={x0, dx, xn, x0, dx, xn} voronoi triplet
2403 
2404  variable size = 181
2405  make /n=(size, size) /d /o $(s_prefix + "matrix") /wave=matrix
2406  make /n=(size, size) /free mnorm
2407  ImageFromXYZ /as {ster_x, ster_y, values}, matrix, mnorm
2408  matrix /= mnorm
2409  matrixfilter NanZapMedian, matrix
2410  matrixfilter gauss, matrix
2411 
2412  matrix = (x^2 + y^2) < 4 ? matrix : nan
2413 };
2414 
2425 variable quick_pizza_image(wave data, string nickname, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar = defaultValue, variable nograph = defaultValue, variable folding = defaultValue){
2426  wave data// 2D intensity wave, see requirements above
2427  string nickname// nick name for output data
2428  // in default mode, this will be the name of a child folder containing the output
2429  // in XPDplot mode, this will be a prefix of the generated data in the root folder
2430  variable theta_offset// manipulator theta angle corresponding to normal emission
2431  variable tilt_offset// manipulator tilt angle corresponding to normal emission
2432  variable phi_offset// manipulator phi angle corresponding to phi_result = 0
2433  variable npolar// number of polar angles, determines polar and azimuthal step size
2434  // default = 91 (1 degree steps)
2435  variable nograph// 0 (default) = display a new polar graph
2436  // 1 = don't display a new graph (if a graph is existing from a previous call, it will update)
2437  variable folding// rotational averaging, default = 1
2438 
2439  if (ParamIsDefault(npolar))
2440  npolar = 91
2441  endif
2442  if (ParamIsDefault(nograph))
2443  nograph = 0
2444  endif
2445  if (ParamIsDefault(folding))
2446  folding = 1
2447  endif
2448  string graphname = "graph_" + nickname
2449  string s_prefix = ""
2450 
2451  // sort out data folder structure
2452  dfref saveDF = GetDataFolderDFR()
2453  dfref dataDF = GetWavesDataFolderDFR(data)
2454  setdatafolder dataDF
2455  if (DataFolderExists(":attr"))
2456  setdatafolder :attr
2457  endif
2458  dfref attrDF = GetDataFolderDFR()
2459  setdatafolder dataDF
2460  newdatafolder /s/o $nickname
2461  dfref destDF = GetDataFolderDFR()
2462 
2463  // performance monitoring
2464  variable timerRefNum
2465  variable /g xyz_perf_secs
2466  timerRefNum = startMSTimer
2467 
2468  wave /sdfr=attrDF ManipulatorTheta
2469  wave /sdfr=attrDF ManipulatorTilt
2470  wave /sdfr=attrDF ManipulatorPhi
2471  duplicate /free ManipulatorTheta, m_theta
2472  duplicate /free ManipulatorTilt, m_tilt
2473  duplicate /free ManipulatorPhi, m_phi
2474  m_theta -= theta_offset
2475  m_tilt -= tilt_offset
2476  m_tilt *= -1// checked 140702
2477  m_phi -= phi_offset
2478  //m_phi *= -1 // checked 140702
2479 
2480  make /n=1/d/free d_polar, d_azi
2481  convert_angles_ttpd2polar(m_theta, m_tilt, m_phi, data, d_polar, d_azi)
2482  d_azi += 180// changed 151030 (v1.6)
2483  d_azi = d_azi >= 360 ? d_azi - 360 : d_azi
2484 
2485  duplicate /free data, values
2486  variable nn = dimsize(values, 0) * max(dimsize(values, 1), 1)
2487  redimension /n=(nn) values, d_polar, d_azi
2488  duplicate /o d_polar, ster_rad, ster_x, ster_y
2489 
2490  variable projection = 1
2491  switch(projection)
2492  case 1:// stereographic
2493  ster_rad = 2 * tan(d_polar / 2 * pi / 180)
2494  break
2495  case 2:// azimuthal
2496  ster_rad = 2 * cos((180 - d_polar) / 2 * pi / 180)
2497  break
2498  endswitch
2499  string s_ster_x = s_prefix + "ster_x"
2500  string s_ster_y = s_prefix + "ster_y"
2501 
2502  nn = 401
2503  make /n=(nn, nn) /d /o matrix
2504  make /n=(nn, nn) /free mnorm
2505  setscale /i x -2, +2, matrix, mnorm
2506  setscale /i y -2, +2, matrix, mnorm
2507  matrix = 0
2508  mnorm = 0
2509 
2510  variable ifold
2511  for (ifold = 0; ifold < folding; ifold += 1)
2512  ster_x = ster_rad * cos(d_azi * pi / 180)
2513  ster_y = ster_rad * sin(d_azi * pi / 180)
2514  ImageFromXYZ {ster_x, ster_y, values}, matrix, mnorm
2515  d_azi = d_azi >= 180 ? d_azi + 360 / folding - 180 : d_azi + 360 / folding
2516  endfor
2517 
2518  matrix /= mnorm
2519  matrixfilter /n=5 NanZapMedian matrix
2520  matrixfilter /n=3 gauss matrix
2521 
2522  if (!nograph)
2523  display /k=1
2524  appendimage matrix
2525  modifygraph width={Plan,1,bottom,left}
2526  endif
2527 
2528  if (timerRefNum >= 0)
2529  xyz_perf_secs = stopMSTimer(timerRefNum) / 1e6
2530  endif
2531 
2532  setdatafolder saveDF
2533 };
2534 
2536 variable save_hemi_scan(string nickname, string pathname, string filename){
2537  string nickname
2538  string pathname
2539  string filename
2540 
2541  dfref savedf = getdatafolderdfr()
2542 
2543  // source data
2544  if (strlen(nickname))
2545  string s_prefix = nickname + "_"
2546  string s_int = s_prefix + "i"
2547  else
2548  s_prefix = ""
2549  s_int = "values"
2550  endif
2551  string s_polar = s_prefix + "pol"
2552  string s_azim = s_prefix + "az"
2553  string s_theta = s_prefix + "th"
2554  string s_tot = s_prefix + "tot"
2555  string s_weight = s_prefix + "wt"
2556 
2557  wave theta1 = $s_theta
2558  wave polar1 = $s_polar
2559  wave azim1 = $s_azim
2560  wave tot1 = $s_tot
2561  wave weight1 = $s_weight
2562  wave values1 = $s_int
2563 
2564  save /m="\r\n" /o /p=$pathname /t theta1, polar1, azim1, tot1, weight1, values1 as filename
2565 
2566  setdatafolder saveDF
2567 };
2568 
2572 variable load_hemi_scan(string nickname, string pathname, string filename){
2573  string nickname
2574  string pathname
2575  string filename
2576 
2577  dfref savedf = getdatafolderdfr()
2578 
2579  //loadwave /p=$pathname /t theta1, polar1, azim1, tot1, weight1, values1 as filename
2580  //LoadWave /t/p=pearl_explorer_filepath/q filename
2581  //svar waves = s_wavenames
2582  //if (v_flag > 0)
2583  // string /g pearl_explorer_import = "load_itx_file"
2584  //endif
2585 
2586  setdatafolder saveDF
2587 };
2588 
2621 variable import_tpi_scan(string nickname, wave theta, wave phi, wave intensity, variable folding = defaultValue, variable npolar = defaultValue, variable nograph = defaultValue, variable xpdplot = defaultValue){
2622  string nickname
2623  wave theta
2624  wave phi
2625  wave intensity
2626 
2627  variable folding
2628  variable npolar
2629  variable nograph
2630  variable xpdplot
2631 
2632  if (ParamIsDefault(npolar))
2633  npolar = 91
2634  endif
2635  if (ParamIsDefault(nograph))
2636  nograph = 0
2637  endif
2638  if (ParamIsDefault(folding))
2639  folding = 1
2640  endif
2641  if (ParamIsDefault(xpdplot))
2642  xpdplot = 0
2643  endif
2644 
2645  make_hemi_grid(npolar, nickname, xpdplot=xpdplot)
2646 
2647  variable ifold
2648  duplicate /free phi, fold_phi
2649  for (ifold = 0; ifold < folding; ifold += 1)
2650  hemi_add_anglescan(nickname, intensity, theta, fold_phi)
2651  fold_phi = fold_phi >= 180 ? fold_phi + 360 / folding - fold_phi : fold_phi + 360 / folding
2652  endfor
2653 
2654  if (nograph==0)
2655  display_hemi_scan(nickname)
2656  endif
2657 };
2658 
2670 variable trim_hemi_scan(string nickname, variable theta_max){
2671  string nickname
2672  variable theta_max
2673 
2674  if (strlen(nickname))
2675  string s_prefix = nickname + "_"
2676  string s_int = s_prefix + "i"
2677  else
2678  s_prefix = ""
2679  s_int = "values"
2680  endif
2681  string s_totals = s_prefix + "tot"
2682  string s_weights = s_prefix + "wt"
2683  string s_polar = s_prefix + "pol"
2684 
2685  wave w_polar = $s_polar
2686  wave w_values = $s_int
2687  wave w_totals = $s_totals
2688  wave w_weights = $s_weights
2689 
2690  w_values = w_polar <= theta_max ? w_totals / w_weights : nan
2691 };
2692 
2712 wave hemi_polar_cut(string nickname, variable azim){
2713  string nickname
2714  variable azim
2715 
2716  if (strlen(nickname))
2717  string s_prefix = nickname + "_"
2718  string s_int = s_prefix + "i"
2719  else
2720  s_prefix = ""
2721  s_int = "values"
2722  endif
2723  string s_totals = s_prefix + "tot"
2724  string s_weights = s_prefix + "wt"
2725  string s_polar = s_prefix + "pol"
2726  string s_azim = s_prefix + "az"
2727  string s_index = s_prefix + "index"
2728  string s_theta = s_prefix + "th"
2729  string s_dphi = s_prefix + "dphi"
2730  string s_nphis = s_prefix + "nphis"
2731  string s_cut
2732  sprintf s_cut, "%s_azi%03u", s_int, round(azim)
2733 
2734  wave w_polar = $s_polar
2735  wave w_azim = $s_azim
2736  wave w_values = $s_int
2737  wave w_totals = $s_totals
2738  wave w_weights = $s_weights
2739  wave w_index = $s_index
2740  wave w_theta = $s_theta
2741  wave w_dphi = $s_dphi
2742  wave w_nphis = $s_nphis
2743 
2744  variable npol = numpnts(w_theta)
2745  variable ipol
2746  variable pol_st = abs(w_theta[1] - w_theta[0])
2747  variable pol
2748  variable pol1, pol2
2749  variable nsel
2750  make /n=(npol) /o $s_cut
2751  wave w_cut = $s_cut
2752  setscale /i x w_theta[0], w_theta[numpnts(w_theta)-1], "deg", w_cut
2753  make /n=1 /free azi_slice
2754  make /n=1 /free values_slice
2755 
2756  for (ipol = 0; ipol < npol; ipol += 1)
2757  pol = w_theta[ipol]
2758  pol1 = pol - pol_st / 2
2759  pol2 = pol + pol_st / 2
2760  extract /free /indx w_polar, sel, (pol1 < w_polar) && (w_polar <= pol2)
2761  nsel = numpnts(sel)
2762  if (nsel > 0)
2763  redimension /n=(nsel+2) azi_slice, values_slice
2764  azi_slice[1, nsel] = w_azim[sel[p-1]]
2765  azi_slice[0] = azi_slice[nsel] - 360
2766  azi_slice[nsel+1] = azi_slice[1] + 360
2767  values_slice[1, nsel] = w_values[sel[p-1]]
2768  values_slice[0] = values_slice[nsel]
2769  values_slice[nsel+1] = values_slice[1]
2770  w_cut[ipol] = interp(azim, azi_slice, values_slice)
2771  else
2772  w_cut[ipol] = nan
2773  endif
2774  endfor
2775  return w_cut
2776 };
2777 
2796 wave hemi_azi_cut(string nickname, variable pol){
2797  string nickname
2798  variable pol
2799 
2800  if (strlen(nickname))
2801  string s_prefix = nickname + "_"
2802  string s_int = s_prefix + "i"
2803  else
2804  s_prefix = ""
2805  s_int = "values"
2806  endif
2807  string s_totals = s_prefix + "tot"
2808  string s_weights = s_prefix + "wt"
2809  string s_polar = s_prefix + "pol"
2810  string s_azim = s_prefix + "az"
2811  string s_index = s_prefix + "index"
2812  string s_theta = s_prefix + "th"
2813  string s_dphi = s_prefix + "dphi"
2814  string s_nphis = s_prefix + "nphis"
2815  string s_cut
2816  sprintf s_cut, "%s_pol%03u", s_int, round(pol)
2817 
2818  wave w_polar = $s_polar
2819  wave w_azim = $s_azim
2820  wave w_values = $s_int
2821  wave w_totals = $s_totals
2822  wave w_weights = $s_weights
2823  wave w_index = $s_index
2824  wave w_theta = $s_theta
2825  wave w_dphi = $s_dphi
2826  wave w_nphis = $s_nphis
2827 
2828  variable pol_st = abs(w_theta[1] - w_theta[0])
2829  variable pol1, pol2
2830  variable nsel
2831 
2832  pol1 = pol - pol_st / 2
2833  pol2 = pol + pol_st / 2
2834  extract /free /indx w_polar, sel, (pol1 < w_polar) && (w_polar <= pol2)
2835  nsel = numpnts(sel)
2836  if (nsel > 0)
2837  make /n=(nsel) /o $s_cut
2838  wave w_cut = $s_cut
2839  w_cut = w_values[sel]
2840  setscale /i x w_azim[sel[0]], w_azim[sel[nsel-1]], "", w_cut
2841  return w_cut
2842  else
2843  return $""
2844  endif
2845 };
2846 
wave fit_scienta_ang_transm(wave data, wave params)
+
wave hemi_polar_cut(string nickname, variable azim)
extract a polar cut from a hemispherical scan.
+
variable trim_hemi_scan(string nickname, variable theta_max)
trim a hemispherical scan at grazing angle
+
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
+
static const variable kProjScaleOrtho
+
variable polar2cart_wave(wave in, wave out)
+
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.
+
variable normalize_strip_2d(wave strip, wave theta, variable theta_offset=defaultValue, variable smooth_method=defaultValue, variable smooth_factor=defaultValue, variable check=defaultValue)
divide the strip by a two-dimensional normalization function.
+
variable crop_strip(wave strip, variable xlo, variable xhi)
crop a strip at the sides.
+
const variable kProjGnom
+
threadsafe wave ad_profile_y(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along Y dimension, new destination wave.
+
variable make_hemi_grid(variable npol, string nickname, variable xpdplot=defaultValue)
create a hemispherical, constant solid angle grid
+
variable hemi_add_anglescan(string nickname, wave values, wave polar, wave azi, wave weights=defaultValue)
add an arbitrary angle scan to a hemispherical scan grid.
+
string get_hemi_nickname(wave w)
finds the nick name given any hemi wave
+
variable interpolate_hemi_scan(string nickname)
interpolate a hemispherical scan onto a rectangular grid
+
string get_hemi_prefix(wave w)
finds the prefix given any hemi wave
+
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 CalcN_Theta(string HoloMode, variable Theta_in, variable Theta_ran, variable Theta_st)
calculate the number of thetas for a pattern
+
dfr find_hemi_data(string nickname, string *prefix, string *intwave)
finds the folder, prefix and name of holo waves given their nick name
+
variable convert_angles_ttpd2polar(wave theta, wave tilt, wave phi, wave data, wave polar, wave azi)
convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.
+
variable clear_hemi_grid(string nickname)
clear a hemispherical scan grid
+
static const variable kProjScaleDist
+
threadsafe variable calc_graph_polar(variable x, variable y, variable projection=defaultValue)
calculate polar angle from Cartesian coordinate
+
static variable Calc_The_step(variable th, variable Theta_st, string Holomode)
calculate delta-theta for a given theta
+
const variable kProjArea
+
static variable line_average(wave source, wave dest)
+
threadsafe variable calc_graph_radius(variable polar, variable projection=defaultValue)
calculate the projected polar angle
+
threadsafe variable scienta_ang_transm(wave w, variable x)
+
variable pizza_service(wave data, string nickname, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar=defaultValue, variable nograph=defaultValue, variable folding=defaultValue, variable xpdplot=defaultValue)
create a pizza plot from a measured (energy-integrated) data strip
+
variable rotate_x_wave(wave inout, variable angle)
+
variable cart2polar_wave(wave in, wave out)
+
string display_scanlines(string nickname, variable alpha_lo, variable alpha_hi, wave m_theta, wave m_tilt, wave m_phi, variable folding=defaultValue, variable projection=defaultValue)
display a polar graph with lines indicating the angles covered by an angle scan.
+
wave hemi_azi_cut(string nickname, variable pol)
extract an azimuthal cut from a hemispherical scan
+
variable draw_diffraction_cone(string graphname, string groupname, variable theta_axis, variable theta_inner, variable phi)
draw the circle of a diffraction cone in a stereographic polar graph.
+
variable hemi_add_aziscan(string nickname, wave values, variable polar, wave azi, wave weights=defaultValue)
add an azimuthal scan to a hemispherical scan grid.
+
static const variable kProjScaleGnom
+
variable rotate_y_wave(wave inout, variable angle)
+
variable rotate_hemi_scan(string nickname, variable angle)
azimuthally rotate a hemispherical scan dataset.
+
static const variable kProjScaleStereo
+
processing and holographic mapping of angle scanned XPD data.
+
static string display_polar_graph(string graphname, variable angle_offset=defaultValue, variable do_ticks=defaultValue)
displays an empty polar graph
+
const variable kProjOrtho
+
variable save_hemi_scan(string nickname, string pathname, string filename)
save a hemispherical scan to an Igor text file
+
const variable kProjStereo
+
variable quick_pizza_image(wave data, string nickname, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar=defaultValue, variable nograph=defaultValue, variable folding=defaultValue)
map angle scan data onto a rectangular grid in stereographic projection
+
static variable polar_graph_hook(WMWinHookStruct *s)
polar graph window hook
+
const variable kProjDist
+
threadsafe variable calc_graph_azi(variable x, variable y, variable projection=defaultValue, variable zeroAngle=defaultValue)
calculate azimuthal angle from Cartesian coordinate
+
variable strip_delete_frames(wave strip, variable qlo, variable qhi, wave theta, wave tilt, wave phi)
delete a contiguous range of frames from a strip.
+
variable rotate_z_wave(wave inout, variable angle)
+
static variable calc_nth(variable Theta_st, variable Theta_in, variable th, variable Phi_ran, variable Phi_ref, string Holomode)
calculate the number of phis for a given theta
+
static const variable kProjScaleArea
+
variable show_analyser_line(variable theta, variable tilt, variable phi, variable theta_offset, variable tilt_offset, variable phi_offset, variable npolar=defaultValue, variable nograph=defaultValue, variable xpdplot=defaultValue)
calculate and display the line seen by the analyser for a specific emission angle ...
+
variable convert_angles_ttpa2polar(wave theta, wave tilt, wave phi, wave analyser, wave polar, wave azi)
convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.
+
static string draw_hemi_axes(string graphname, variable do_grids=defaultValue)
draw polar and azimuthal grids in an existing polar graph.
+
variable duplicate_hemi_scan(string source_nickname, dfref dest_folder, string dest_nickname, variable xpdplot=defaultValue)
duplicate a hemispherical scan dataset.
+
variable set_polar_graph_cursor(string nickname, string cursorname, variable polar_angle, variable azim_angle, string graphname=defaultValue)
+
static variable update_polar_info(string graphname)
update the angles info based on cursors A and B of a given polar graph window
+
variable import_tpi_scan(string nickname, wave theta, wave phi, wave intensity, variable folding=defaultValue, variable npolar=defaultValue, variable nograph=defaultValue, variable xpdplot=defaultValue)
import a hemispherical scan from theta-phi-intensity waves and display it
+
variable load_hemi_scan(string nickname, string pathname, string filename)
load a hemispherical scan from an Igor text file
+
threadsafe wave ad_profile_x(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, new destination wave.
+
static variable calc_phi_step(variable Theta_in, variable th, variable Theta_st, variable Phi_ran, variable Phi_ref, string Holomode)
calculate delta-phi for a given theta
+
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.
+
+
+ + + + diff --git a/doc/html/pearl-anglescan-tracker_8ipf.html b/doc/html/pearl-anglescan-tracker_8ipf.html new file mode 100644 index 0000000..56b88e6 --- /dev/null +++ b/doc/html/pearl-anglescan-tracker_8ipf.html @@ -0,0 +1,1581 @@ + + + + + + +PEARL Procedures: pearl-anglescan-tracker.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-anglescan-tracker.ipf File Reference
+
+
+
#include "pearl-area-profiles"
+#include "pearl-area-import"
+#include "pearl-scienta-preprocess"
+#include "pearl-anglescan-process"
+#include <New Polar Graphs>
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

static variable AfterCompiledHook ()
 initialize package data once when the procedure is first loaded More...
 
static variable init_package ()
 
static variable save_prefs ()
 save persistent package data to the preferences file. More...
 
static variable load_prefs ()
 load persistent package data from the preferences file. More...
 
static variable IgorQuitHook (string app)
 disconnect EPICS channels before Igor quits. More...
 
variable ast_setup ()
 set up data structures, display graph, and try to connect to analyser. More...
 
variable ast_prepare (variable theta_offset=defaultValue, variable tilt_offset=defaultValue, variable phi_offset=defaultValue)
 prepare for new measurement and clear the data buffer. More...
 
variable ast_set_processing (string reduction_func, string reduction_params)
 set the data processing parameters More...
 
variable ast_add_image (wave image, variable theta, variable tilt, variable phi)
 process and add a detector image to the tracker scan. More...
 
variable ast_export (dfref folder, string nickname, variable xpdplot=defaultValue)
 export tracker data to a separate, independent data set. More...
 
variable ast_import (string nickname)
 import tracker data from an existing angle scan dataset. More...
 
variable ast_update_detector (variable theta, variable tilt, variable phi, variable range)
 update the current position indicator. More...
 
variable ast_close ()
 stop tracker, close graph, release data structures. More...
 
static variable setup_data ()
 
static variable extend_data (variable num_slices)
 extend the data buffer for the next polar scan More...
 
static variable setup_detector ()
 
static variable add_image_data (wave image, variable theta, variable tilt, variable phi)
 reduce a detector image and add the result to the data buffer. More...
 
static variable process_image_data ()
 process the data buffer to generate the tracker dataset. More...
 
static variable update_detector (variable theta, variable tilt, variable phi, variable range)
 update the current position indicator. More...
 
static variable setup_graph ()
 create the graph window. More...
 
static variable update_data_graph ()
 
static variable update_detector_graph ()
 
static variable epics_connect ()
 connect the angle scan tracker to EPICS More...
 
static variable epics_disconnect_chid (string chid_var_name)
 
static variable epics_disconnect ()
 
static variable ast_window_hook (WMWinHookStruct *s)
 window hook More...
 
variable ast_callback_data (variable chan)
 callback function for new analyser data from EPICS. More...
 
variable ast_callback_detector (variable chan)
 callback function for new detector state from EPICS. More...
 
variable ast_callback_manip (variable chan)
 callback function for new manipulator position from EPICS. More...
 
static variable bp_capture (WMButtonAction *ba)
 
static variable toggle_capture ()
 
static variable update_capture ()
 
static variable pmp_data (WMPopupAction *pa)
 
static variable pmp_data_mouseup (WMPopupAction *pa)
 
static variable export_tracker_data ()
 export tracker data (with prompt) More...
 
static variable import_tracker_data ()
 import tracker data (with prompt) More...
 
static variable save_tracker_data ()
 save tracker data to file (with prompt) More...
 
static variable load_tracker_data ()
 import tracker data from file (with prompt) More...
 
static variable pmp_parameters (WMPopupAction *pa)
 
static variable pmp_parameters_mouseup (WMPopupAction *pa)
 
static variable edit_reduction_params ()
 
static variable edit_offsets ()
 
+ + + + + + + + + +

+Variables

 version
 
static const string package_path = "root:packages:pearl_anglescan_tracker:"
 data folder path More...
 
static const string prefs_objects = "projection;theta_offset;tilt_offset;phi_offset;reduction_func;reduction_params"
 semicolon-separated list of persistent variable, string, and wave names More...
 
+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable add_image_data (wave image,
variable theta,
variable tilt,
variable phi 
)
+
+static
+
+ +

reduce a detector image and add the result to the data buffer.

+
Parameters
+ + + + + +
imagedetector image with correct X (energy) and Y (angle) scaling
thetapolar angle of manipulator
tilttilt angle of manipulator
phiazimuthal angle of manipulator
+
+
+

the manipulator angles are corrected by the preset offsets internally.

+ +

Definition at line 453 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable AfterCompiledHook ()
+
+static
+
+ +

initialize package data once when the procedure is first loaded

+ +

Definition at line 73 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ast_add_image (wave image,
variable theta,
variable tilt,
variable phi 
)
+
+ +

process and add a detector image to the tracker scan.

+
Parameters
+ + + + + +
imagedetector image with correct X (energy) and Y (angle) scaling
thetapolar angle of manipulator
tilttilt angle of manipulator
phiazimuthal angle of manipulator
+
+
+

the manipulator angles are corrected by the preset offsets internally.

+ +

Definition at line 285 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ast_callback_data (variable chan)
+
+ +

callback function for new analyser data from EPICS.

+ +

Definition at line 846 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ast_callback_detector (variable chan)
+
+ +

callback function for new detector state from EPICS.

+

save the manipulator position at the beginning of image acquisition. it is used by ast_callback_data().

+ +

Definition at line 951 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ast_callback_manip (variable chan)
+
+ +

callback function for new manipulator position from EPICS.

+ +

Definition at line 980 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ast_close ()
+
+ +

stop tracker, close graph, release data structures.

+ +

Definition at line 360 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable ast_export (dfref folder,
string nickname,
variable xpdplot = defaultValue 
)
+
+ +

export tracker data to a separate, independent data set.

+

the exported data can then be used for further processing. the data is exported to the current data folder, or root if XPDplot compatibility is requested.

+
Parameters
+ + + + +
folderdestination folder path
nicknamename prefix for waves
xpdplotxpdplot compatibility, see make_hemi_grid() for details
    +
  • 0 (default)
  • +
  • 1 create additional waves and notebook required by XPDplot
  • +
+
+
+
+ +

Definition at line 307 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ast_import (string nickname)
+
+ +

import tracker data from an existing angle scan dataset.

+
Parameters
+ + +
nicknamename prefix for waves. data must be in current data folder.
+
+
+ +

Definition at line 329 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable ast_prepare (variable theta_offset = defaultValue,
variable tilt_offset = defaultValue,
variable phi_offset = defaultValue 
)
+
+ +

prepare for new measurement and clear the data buffer.

+

optionally, set new manipulator offsets. the offsets are the manipulator readback coordinates where the sample surface is oriented in normal emission, and the handle of the sample plate points horizontally to the left (9 o'clock).

+
Parameters
+ + + + +
theta_offsetset new theta offset. default: no change.
tilt_offsetset new tilt offset. default: no change.
phi_offsetset new phi offset. default: no change.
+
+
+ +

Definition at line 211 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ast_set_processing (string reduction_func,
string reduction_params 
)
+
+ +

set the data processing parameters

+

the parameters will be effective for subsequent measurements only. previously acquired data is not affected. the processing parameters are saved with the preferences.

+
Parameters
+ + + +
reduction_funcname of custom reduction function, e.g. "int_linbg_reduction". any user-defined function with the same signature as adh5_default_reduction() is allowed.
reduction_paramsparameter string for the reduction function. the format depends on the actual function. for int_linbg_reduction, e.g., "Lcrop=0.1;Hcrop=0.1;Lsize=0.2;Hsize=0.2;Cpos=0.5;Csize=0.4".
+
+
+ +

Definition at line 261 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ast_setup ()
+
+ +

set up data structures, display graph, and try to connect to analyser.

+ +

Definition at line 194 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ast_update_detector (variable theta,
variable tilt,
variable phi,
variable range 
)
+
+ +

update the current position indicator.

+
Parameters
+ + + + + +
thetapolar angle of manipulator
tilttilt angle of manipulator
phiazimuthal angle of manipulator
rangeangle range (60 or 45)
+
+
+

the manipulator angles are corrected by the preset offsets internally.

+ +

Definition at line 349 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ast_window_hook (WMWinHookStruct * s)
+
+static
+
+ +

window hook

+

disconnects from EPICS when the window is closed.

+ +

Definition at line 831 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_capture (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1013 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable edit_offsets ()
+
+static
+
+ +

Definition at line 1234 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable edit_reduction_params ()
+
+static
+
+ +

Definition at line 1218 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_connect ()
+
+static
+
+ +

connect the angle scan tracker to EPICS

+

the tracker uses channels of the analyser and the manipulator.

+

if the EPICS XOP is not loaded, the function does nothing. if channels are not available, the function exits with an error code after a timeout of 5 seconds. the Igor run-time error status is reset to suppress the error dialog.

+
Returns
zero if successful, non-zero if an error occurred
+
Todo:
the X03DA channel names are hard-coded.
+ +

Definition at line 675 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_disconnect ()
+
+static
+
+ +

Definition at line 801 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable epics_disconnect_chid (string chid_var_name)
+
+static
+
+ +

Definition at line 787 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable export_tracker_data ()
+
+static
+
+ +

export tracker data (with prompt)

+ +

Definition at line 1095 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable extend_data (variable num_slices)
+
+static
+
+ +

extend the data buffer for the next polar scan

+

call this function if the buffer is full.

+
Parameters
+ + +
num_slicesnumber of slices that the measurement contains
+
+
+ +

Definition at line 402 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable IgorQuitHook (string app)
+
+static
+
+ +

disconnect EPICS channels before Igor quits.

+ +

Definition at line 188 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable import_tracker_data ()
+
+static
+
+ +

import tracker data (with prompt)

+ +

Definition at line 1125 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable init_package ()
+
+static
+
+ +

Definition at line 98 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable load_prefs ()
+
+static
+
+ +

load persistent package data from the preferences file.

+

the preferences file is an Igor packed experiment file in a special preferences folder.

+

this function is called automatically when the procedure is first compiled, or whenever the user clicks the corresponding button.

+ +

Definition at line 163 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable load_tracker_data ()
+
+static
+
+ +

import tracker data from file (with prompt)

+ +

Definition at line 1165 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pmp_data (WMPopupAction * pa)
+
+static
+
+ +

Definition at line 1061 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pmp_data_mouseup (WMPopupAction * pa)
+
+static
+
+ +

Definition at line 1075 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pmp_parameters (WMPopupAction * pa)
+
+static
+
+ +

Definition at line 1184 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pmp_parameters_mouseup (WMPopupAction * pa)
+
+static
+
+ +

Definition at line 1198 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable process_image_data ()
+
+static
+
+ +

process the data buffer to generate the tracker dataset.

+ +

Definition at line 502 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable save_prefs ()
+
+static
+
+ +

save persistent package data to the preferences file.

+

this function is called when the user clicks the corresponding button.

+ +

Definition at line 139 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable save_tracker_data ()
+
+static
+
+ +

save tracker data to file (with prompt)

+ +

Definition at line 1154 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable setup_data ()
+
+static
+
+ +

Definition at line 372 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable setup_detector ()
+
+static
+
+ +

Definition at line 434 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable setup_graph ()
+
+static
+
+ +

create the graph window.

+ +

Definition at line 589 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable toggle_capture ()
+
+static
+
+ +

Definition at line 1027 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable update_capture ()
+
+static
+
+ +

Definition at line 1045 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable update_data_graph ()
+
+static
+
+ +

Definition at line 640 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable update_detector (variable theta,
variable tilt,
variable phi,
variable range 
)
+
+static
+
+ +

update the current position indicator.

+
Parameters
+ + + + + +
thetapolar angle of manipulator
tilttilt angle of manipulator
phiazimuthal angle of manipulator
rangeangle range (60 or 45)
+
+
+

the manipulator angles are corrected by the preset offsets internally.

+ +

Definition at line 554 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable update_detector_graph ()
+
+static
+
+ +

Definition at line 652 of file pearl-anglescan-tracker.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string package_path = "root:packages:pearl_anglescan_tracker:"
+
+static
+
+ +

data folder path

+ +

Definition at line 68 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string prefs_objects = "projection;theta_offset;tilt_offset;phi_offset;reduction_func;reduction_params"
+
+static
+
+ +

semicolon-separated list of persistent variable, string, and wave names

+ +

Definition at line 70 of file pearl-anglescan-tracker.ipf.

+ +
+
+ +
+
+ + + + +
version
+
+Initial value:
= 1.6
static const string package_name = "pearl_anglescan_tracker"
static const string package_name
+
+

Definition at line 5 of file pearl-anglescan-tracker.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-anglescan-tracker_8ipf.js b/doc/html/pearl-anglescan-tracker_8ipf.js new file mode 100644 index 0000000..f0bb484 --- /dev/null +++ b/doc/html/pearl-anglescan-tracker_8ipf.js @@ -0,0 +1,48 @@ +var pearl_anglescan_tracker_8ipf = +[ + [ "add_image_data", "pearl-anglescan-tracker_8ipf.html#a35a5cd8a21b48be8d726c69eb5fca134", null ], + [ "AfterCompiledHook", "pearl-anglescan-tracker_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed", null ], + [ "ast_add_image", "pearl-anglescan-tracker_8ipf.html#a43d85b93bb42a67b8e8afb9afc8d8eae", null ], + [ "ast_callback_data", "pearl-anglescan-tracker_8ipf.html#a4cf5ad2fdf771ffc157a3924a03f5a46", null ], + [ "ast_callback_detector", "pearl-anglescan-tracker_8ipf.html#ac953a75b45d65adf37ce5560bf441876", null ], + [ "ast_callback_manip", "pearl-anglescan-tracker_8ipf.html#a9b4acc299c5e698695baf0b4817ff7eb", null ], + [ "ast_close", "pearl-anglescan-tracker_8ipf.html#a8a74ddd33e286105a45a89105de72621", null ], + [ "ast_export", "pearl-anglescan-tracker_8ipf.html#ac9c92805f39c7a5c68d4c017d14ee178", null ], + [ "ast_import", "pearl-anglescan-tracker_8ipf.html#ae4ece97352b85ced47e954c025e3b69b", null ], + [ "ast_prepare", "pearl-anglescan-tracker_8ipf.html#a766f90a9dad70d9deb4272ba480ee84a", null ], + [ "ast_set_processing", "pearl-anglescan-tracker_8ipf.html#a02271bf812a3e3f87c958f4c58e9f71b", null ], + [ "ast_setup", "pearl-anglescan-tracker_8ipf.html#a5fb1f1abddb56b129f053605035d3281", null ], + [ "ast_update_detector", "pearl-anglescan-tracker_8ipf.html#a150243e26e8adf8b354b8afde064136d", null ], + [ "ast_window_hook", "pearl-anglescan-tracker_8ipf.html#a33e84ae8e13f405d466b28e83f608cb9", null ], + [ "bp_capture", "pearl-anglescan-tracker_8ipf.html#afaec8443094530fd1e723251e04c5dc9", null ], + [ "edit_offsets", "pearl-anglescan-tracker_8ipf.html#a37aaf2f08c3910bed554a10dd82616ec", null ], + [ "edit_reduction_params", "pearl-anglescan-tracker_8ipf.html#a3844e7fd93b4f54aa52f084687c2106c", null ], + [ "epics_connect", "pearl-anglescan-tracker_8ipf.html#a306b168cab2f9c4146cee87009e69f6d", null ], + [ "epics_disconnect", "pearl-anglescan-tracker_8ipf.html#a4619cb98a75adb3c39ea3a62e524b793", null ], + [ "epics_disconnect_chid", "pearl-anglescan-tracker_8ipf.html#acfe94a64ff3e8c4cb32e34ffb9cae594", null ], + [ "export_tracker_data", "pearl-anglescan-tracker_8ipf.html#a09e95dbf1582fcf2e6f71baddb147f86", null ], + [ "extend_data", "pearl-anglescan-tracker_8ipf.html#a4bde8b2fc39c61c0d5a6879f1d0ae115", null ], + [ "IgorQuitHook", "pearl-anglescan-tracker_8ipf.html#a0852e59e9018cf3f7e176aa2355b18e3", null ], + [ "import_tracker_data", "pearl-anglescan-tracker_8ipf.html#ae53e615892fbc39f831b6bd7a0ae242e", null ], + [ "init_package", "pearl-anglescan-tracker_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725", null ], + [ "load_prefs", "pearl-anglescan-tracker_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3", null ], + [ "load_tracker_data", "pearl-anglescan-tracker_8ipf.html#a3882038c0ad82396b6591fd756817535", null ], + [ "pmp_data", "pearl-anglescan-tracker_8ipf.html#a07efc5d6a7121540cc185c251353677c", null ], + [ "pmp_data_mouseup", "pearl-anglescan-tracker_8ipf.html#a4dad34b0481be20234fa5e8d25b262c4", null ], + [ "pmp_parameters", "pearl-anglescan-tracker_8ipf.html#a6d484e3bb5f8c18d3b2910e8346b2c17", null ], + [ "pmp_parameters_mouseup", "pearl-anglescan-tracker_8ipf.html#ad06e1354226f4f617ad0a8d6d7572dca", null ], + [ "process_image_data", "pearl-anglescan-tracker_8ipf.html#a4bc40cded4d4d7676b084f7200ca5e0d", null ], + [ "save_prefs", "pearl-anglescan-tracker_8ipf.html#ac729557a307bddd2f2ad298199976c01", null ], + [ "save_tracker_data", "pearl-anglescan-tracker_8ipf.html#a8d6e9058f2b0b4978f56e892ce199e6a", null ], + [ "setup_data", "pearl-anglescan-tracker_8ipf.html#a6bfd8b6eba0b206df6ec56c7b6489e0b", null ], + [ "setup_detector", "pearl-anglescan-tracker_8ipf.html#aa79c1d1584eb2322adae328bf1437f34", null ], + [ "setup_graph", "pearl-anglescan-tracker_8ipf.html#aa7c4e3e0ed255e61bc80f8b27b78fce6", null ], + [ "toggle_capture", "pearl-anglescan-tracker_8ipf.html#a02987fe03ea914a53c52d58219979d65", null ], + [ "update_capture", "pearl-anglescan-tracker_8ipf.html#a9751db419b4c0de884450c09ff5822a7", null ], + [ "update_data_graph", "pearl-anglescan-tracker_8ipf.html#a0b8ff36cf3c20b1c0db3217d9065f7cf", null ], + [ "update_detector", "pearl-anglescan-tracker_8ipf.html#ab961340af09fed4d2006bca8c0f2edd5", null ], + [ "update_detector_graph", "pearl-anglescan-tracker_8ipf.html#af5a2960c49626f267fbd2873b27c8e42", null ], + [ "package_path", "pearl-anglescan-tracker_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b", null ], + [ "prefs_objects", "pearl-anglescan-tracker_8ipf.html#a20720748c82a7eaa4b02d4084a4219b2", null ], + [ "version", "pearl-anglescan-tracker_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-anglescan-tracker_8ipf_source.html b/doc/html/pearl-anglescan-tracker_8ipf_source.html new file mode 100644 index 0000000..9316b2c --- /dev/null +++ b/doc/html/pearl-anglescan-tracker_8ipf_source.html @@ -0,0 +1,186 @@ + + + + + + +PEARL Procedures: pearl-anglescan-tracker.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-anglescan-tracker.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3
2 #pragma version = 1.4
3 #pragma IgorVersion = 6.2
4 #pragma ModuleName = PearlAnglescanTracker
5 #include "pearl-area-profiles", version > 1.04
6 #include "pearl-area-import", version > 1.05
7 #include "pearl-scienta-preprocess", version > 1.00
8 #include "pearl-anglescan-process", version >= 1.6
9 #include <New Polar Graphs>
10 
11 // $Id$
12 //
13 // author: matthias.muntwiler@psi.ch
14 // Copyright (c) 2014-15 Paul Scherrer Institut
15 //
16 // Licensed under the Apache License, Version 2.0 (the "License");
17 // you may not use this file except in compliance with the License.
18 // You may obtain a copy of the License at
19 // http://www.apache.org/licenses/LICENSE-2.0
20 
58 
64 
66 static const string package_name = "pearl_anglescan_tracker";
68 static const string package_path = "root:packages:pearl_anglescan_tracker:";
70 static const string prefs_objects = "projection;theta_offset;tilt_offset;phi_offset;reduction_func;reduction_params";
71 
73 static variable AfterCompiledHook(){
74 
75  dfref savedf = GetDataFolderDFR()
76  variable do_init = 1
77  if (DataFolderExists(package_path))
78  setdatafolder $(package_path)
79  nvar /z init_done
80  if (nvar_exists(init_done))
81  if (init_done)
82  do_init = 0
83  endif
84  endif
85  endif
86 
87  if (do_init)
88  init_package()
89  load_prefs()
90  setdatafolder $(package_path)
91  variable /g init_done = 1
92  endif
93 
94  setdatafolder savedf
95  return 0
96 };
97 
98 static variable init_package(){
99  dfref savedf = getdatafolderdfr()
100  setdatafolder root:
101  newdatafolder /o/s packages
102  newdatafolder /o/s $package_name
103 
104  // configuration (persistent)
105  string /g graphname = "graph_anglescan_tracker"
106  string /g dataname = "tracker"
107  string /g projection = "stereographic"
108 
109  // recently used (persistent)
110  variable /g theta_offset = 0
111  variable /g tilt_offset = 0
112  variable /g phi_offset = 0
113  string /g reduction_func = "int_linbg_reduction"
114  string /g reduction_params = "Lcrop=0.1;Hcrop=0.1;Lsize=0.2;Hsize=0.2;Cpos=0.5;Csize=0.4"
115 
116  // recently used (volatile)
117  string /g export_folderpath = "root:"
118  variable /g export_format = 1
119 
120  // run-time variables (volatile)
121  string /g detector_tracename
122  variable /g capturing = 0
123  variable /g buf_size = 0// number of measurements that fit into the data buffer
124  variable /g buf_count = 0// number of measurements contained in the data buffer
125  variable /g buf_width = 0// number of slices that fit into the data buffer
126 
127  // load icon of sample holder
128  string path = FunctionPath("")
129  path = ParseFilePath(1, path, ":", 1, 0) + "tracker-sample-picture.png"
130  LoadPict /O/Q path, pict_tracker_sample
131 
132  setdatafolder savedf
133 };
134 
139 static variable save_prefs(){
140  dfref saveDF = GetDataFolderDFR()
141 
142  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
143  fullPath += package_name
144  NewPath/O/C/Q tempPackagePrefsPath, fullPath
145  fullPath += ":preferences.pxp"
146 
147  SetDataFolder root:packages
148  SetDataFolder $package_name
149  SaveData /O /Q /J=prefs_objects fullPath
150 
151  KillPath/Z tempPackagePrefsPath
152 
153  SetDataFolder saveDF
154 };
155 
163 static variable load_prefs(){
164  dfref saveDF = GetDataFolderDFR()
165 
166  variable result = -1
167  setdatafolder root:
168  NewDataFolder /O/S packages
169  NewDataFolder /O/S $package_name
170  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
171  fullPath += package_name
172 
173  GetFileFolderInfo /Q /Z fullPath
174  if (V_Flag == 0)// Disk directory exists?
175  fullPath += ":preferences.pxp"
176  GetFileFolderInfo /Q /Z fullPath
177  if (V_Flag == 0)// Preference file exist?
178  LoadData /O /R /Q fullPath
179  result = 0
180  endif
181  endif
182 
183  SetDataFolder saveDF
184  return result
185 };
186 
188 static variable IgorQuitHook(string app){
189  string app
191 };
192 
194 variable ast_setup(){
195  setup_data()
197  setup_graph()
198  epics_connect()
199 };
200 
211 variable ast_prepare(variable theta_offset = defaultValue, variable tilt_offset = defaultValue, variable phi_offset = defaultValue){
212  variable theta_offset
213  variable tilt_offset
214  variable phi_offset
215 
216  dfref savedf = getdatafolderdfr()
217  setdatafolder $(package_path)
218 
219  if (!ParamIsDefault(theta_offset))
220  nvar v_theta_offset = theta_offset
221  v_theta_offset = theta_offset
222  endif
223  if (!ParamIsDefault(tilt_offset))
224  nvar v_tilt_offset = tilt_offset
225  v_tilt_offset = tilt_offset
226  endif
227  if (!ParamIsDefault(phi_offset))
228  nvar v_phi_offset = phi_offset
229  v_phi_offset = phi_offset
230  endif
231 
232  nvar buf_count
233  nvar buf_size
234  nvar buf_width
235  buf_count = 0
236  buf_size = 0
237  buf_width = 0
238 
239  svar dataname
240  clear_hemi_grid(dataname)
241  // work-around: set one point to a real number to make the rest of the trace in the graph transparent
242  wave values = $(dataname + "_i")
243  values[numpnts(values) - 1] = 0
244 
246 
247  setdatafolder saveDF
248 };
249 
261 variable ast_set_processing(string reduction_func, string reduction_params){
262  string reduction_func
263  string reduction_params
264 
265  dfref savedf = getdatafolderdfr()
266  setdatafolder $(package_path)
267 
268  svar red_func = reduction_func
269  svar red_params = reduction_params
270 
271  red_func = reduction_func
272  red_params = reduction_params
273 
274  setdatafolder saveDF
275 };
276 
285 variable ast_add_image(wave image, variable theta, variable tilt, variable phi){
286  wave image
287  variable theta
288  variable tilt
289  variable phi
290 
291  add_image_data(image, theta, tilt, phi)
294 };
295 
307 variable ast_export(dfref folder, string nickname, variable xpdplot = defaultValue){
308  dfref folder
309  string nickname
310  variable xpdplot
311 
312  if (ParamIsDefault(xpdplot))
313  xpdplot = 0
314  endif
315 
316  dfref savedf = getdatafolderdfr()
317  setdatafolder $(package_path)
318 
319  svar dataname
320  duplicate_hemi_scan(dataname, folder, nickname, xpdplot=xpdplot)
321 
322  setdatafolder saveDF
323 };
324 
329 variable ast_import(string nickname){
330  string nickname
331 
332  dfref savedf = getdatafolderdfr()
333 
334  svar /sdfr=$(package_path) dataname
335  duplicate_hemi_scan(nickname, $(package_path), dataname)
336 
337  setdatafolder saveDF
338 };
339 
349 variable ast_update_detector(variable theta, variable tilt, variable phi, variable range){
350  variable theta
351  variable tilt
352  variable phi
353  variable range
354 
355  update_detector(theta, tilt, phi, range)
357 };
358 
360 variable ast_close(){
361  dfref savedf = getdatafolderdfr()
362  setdatafolder $(package_path)
363 
365 
366  svar graphname
367  KillWindow $graphname
368 
369  setdatafolder saveDF
370 };
371 
372 static variable setup_data(){
373  dfref savedf = getdatafolderdfr()
374  setdatafolder $(package_path)
375 
376  nvar buf_size
377  nvar buf_count
378  nvar buf_width
379  buf_size = 0
380  buf_count = 0
381  buf_width = 0
382  make /n=(1,1) /o buf_i
383  make /n=(1) /o buf_th, buf_ph, buf_ti
384 
385  svar dataname
386  variable npolar = 91
387  make_hemi_grid(npolar, dataname)
388 
389  // work-around: set one point to a real number to make the rest of the trace in the graph transparent
390  wave values = $(dataname + "_i")
391  values[numpnts(values) - 1] = 0
392 
393  setdatafolder saveDF
394 };
395 
402 static variable extend_data(variable num_slices){
403  variable num_slices
404 
405  dfref savedf = getdatafolderdfr()
406  setdatafolder $(package_path)
407 
408  nvar buf_size
409  nvar buf_count
410  nvar buf_width
411 
412  variable new_size = buf_size + 91
413  buf_width = num_slices
414 
415  wave buf_i
416  wave buf_th
417  wave buf_ti
418  wave buf_ph
419 
420  redimension /n=(buf_width,new_size) buf_i
421  redimension /n=(new_size) buf_th, buf_ph, buf_ti
422 
423  buf_i[][buf_size, new_size-1] = nan
424  buf_th[buf_size, new_size-1] = nan
425  buf_ph[buf_size, new_size-1] = nan
426  buf_ti[buf_size, new_size-1] = nan
427 
428  buf_size = new_size
429 
430  setdatafolder saveDF
431  return buf_count
432 };
433 
434 static variable setup_detector(){
435  dfref savedf = getdatafolderdfr()
436  setdatafolder $(package_path)
437 
438  make /n=31 /o detector_angle, detector_pol, detector_az, detector_rad
439  setscale /i x -30, 30, "°", detector_angle, detector_pol, detector_az, detector_rad
440  detector_angle = x
441 
442  setdatafolder saveDF
443 };
444 
453 static variable add_image_data(wave image, variable theta, variable tilt, variable phi){
454  wave image
455  variable theta
456  variable tilt
457  variable phi
458 
459  dfref savedf = getdatafolderdfr()
460  setdatafolder $(package_path)
461  svar dataname
462  nvar theta_offset
463  nvar tilt_offset
464  nvar phi_offset
465 
466  // extract angle distribution from image using reduction function mechanism from area-import
467  svar red_func_name = reduction_func
468  svar red_params = reduction_params
469  funcref adh5_default_reduction red_func = $red_func_name
470  variable nx = dimsize(image, 0)
471  make /n=(nx) /free profile1, profile2
472  string loc_params = red_params
473  red_func(image, profile1, profile2, loc_params)
474  nx = numpnts(profile1)
475 
476  // write the result to the buffer
477  nvar buf_count
478  nvar buf_size
479  nvar buf_width
480  wave buf_i
481  wave buf_th
482  wave buf_ph
483  wave buf_ti
484 
485  if ((buf_count >= buf_size) || (nx > buf_width))
486  extend_data(nx)
487  setscale /p x dimoffset(profile1,0), dimdelta(profile1,0), waveunits(profile1,0), buf_i
488  endif
489 
490  buf_i[][buf_count] = profile1[p]
491  buf_th[buf_count] = theta - theta_offset
492  buf_ti[buf_count] = -(tilt - tilt_offset)
493  buf_ph[buf_count] = phi - phi_offset
494 
495  buf_count += 1
496 
497  setdatafolder saveDF
498 };
499 
502 static variable process_image_data(){
503  wave image
504  variable theta
505  variable tilt
506  variable phi
507 
508  dfref savedf = getdatafolderdfr()
509  setdatafolder $(package_path)
510  svar dataname
511 
512  nvar buf_count
513  nvar buf_size
514  nvar buf_width
515 
516  wave buf_i
517  wave buf_th
518  wave buf_ph
519  wave buf_ti
520 
521  duplicate /free /R=[0,buf_width-1][0,buf_count-1] buf_i, buf_n
522  duplicate /free /R=[0,buf_count-1] buf_th, w_th
523  duplicate /free /R=[0,buf_count-1] buf_ti, w_ti
524  duplicate /free /R=[0,buf_count-1] buf_ph, w_ph
525 
526  normalize_strip_x(buf_n, smooth_method=4)
527  if (buf_count >= 10)
528  normalize_strip_theta(buf_n, w_th, smooth_method=4)
529  endif
530  if (dimoffset(buf_i,0) < -20)
531  crop_strip(buf_n, -25, 25)
532  else
533  crop_strip(buf_n, -15, 15)
534  endif
535 
536  make /n=1 /free d_polar, d_azi
537  convert_angles_ttpd2polar(w_th, w_ti, w_ph, buf_n, d_polar, d_azi)
538  d_azi += 180// changed 151030 (v1.4)
539  d_azi = d_azi >= 360 ? d_azi - 360 : d_azi
540  hemi_add_anglescan(dataname, buf_n, d_polar, d_azi)
541 
542  setdatafolder saveDF
543 };
544 
554 static variable update_detector(variable theta, variable tilt, variable phi, variable range){
555  variable theta
556  variable tilt
557  variable phi
558  variable range
559 
560  dfref savedf = getdatafolderdfr()
561  setdatafolder $(package_path)
562  nvar theta_offset
563  nvar tilt_offset
564  nvar phi_offset
565 
566  make /n=1 /free m_theta
567  make /n=1 /free m_tilt
568  make /n=1 /free m_phi
569  m_theta = theta - theta_offset
570  m_tilt = tilt - tilt_offset
571  m_tilt *= -1// checked 140702
572  m_phi = phi - phi_offset
573  //m_phi *= -1 // checked 140702
574 
575  wave detector_angle, detector_pol, detector_az, detector_rad
576  setscale /i x -range/2, +range/2, "°", detector_angle
577  detector_angle = x
578 
579  convert_angles_ttpa2polar(m_theta, m_tilt, m_phi, detector_angle, detector_pol, detector_az)
580  redimension /n=(numpnts(detector_pol)) detector_rad
581  detector_rad = 2 * tan(detector_pol / 2 * pi / 180)
582  detector_az += 180// changed 151030 (v1.4)
583  detector_az = detector_az >= 360 ? detector_az - 360 : detector_az
584 
585  setdatafolder saveDF
586 };
587 
589 static variable setup_graph(){
590  dfref savedf = getdatafolderdfr()
591  setdatafolder $(package_path)
592 
593  svar dataname
594  svar graphname
595  wave detector_az
596  wave detector_rad
597  wave detector_angle
598  svar tracename = detector_tracename
599 
600  graphname = display_hemi_scan(dataname, graphname=graphname)
601  tracename = WMPolarAppendTrace(graphname, detector_rad, detector_az, 360)
602  ModifyGraph /w=$graphname lstyle($tracename)=0
603  ModifyGraph /w=$graphname lsize($tracename)=1.5
604  ModifyGraph /w=$graphname zColor($tracename)={detector_angle,*,*,RedWhiteBlue,0}
605  ColorScale /w=$graphname /C /N=text1 trace=$tracename
606  ColorScale /w=$graphname /C /N=text1 /F=0 /B=1 /A=LB /X=0.00 /Y=0.00
607  ColorScale /w=$graphname /C /N=text1 width=1.5, heightPct=20, frame=0.00
608  ColorScale /w=$graphname /C /N=text1 lblMargin=0
609  ColorScale /w=$graphname /C /N=text1 nticks=2, tickLen=2.00, tickThick=0.50
610 
611  TextBox /w=$graphname /C /N=tb_manip /F=0 /B=1 /X=0.00 /Y=0.00 /E=2 "\\{\"manip = (%.1f, %.1f, %.1f)\", "
612  AppendText /w=$graphname /N=tb_manip /NOCR "root:packages:pearl_anglescan_tracker:curTheta, "
613  AppendText /w=$graphname /N=tb_manip /NOCR "root:packages:pearl_anglescan_tracker:curTilt, "
614  AppendText /w=$graphname /N=tb_manip /NOCR "root:packages:pearl_anglescan_tracker:curPhi}"
615 
616  // the window hook releases the EPICS variables when the window is killed
617  DoWindow /T $graphname, "Angle Scan Tracker"
618  SetWindow $graphname, hook(ast_hook) = ast_window_hook
619 
620  ControlBar /w=$graphname 21
621  Button b_capture win=$graphname, title="start", pos={0,0}, size={40,21}, proc=PearlAnglescanTracker#bp_capture
622  Button b_capture win=$graphname, fColor=(65535,65535,65535), fSize=10
623  Button b_capture win=$graphname, help={"Start/stop capturing."}
624  PopupMenu pm_params win=$graphname, mode=0, value="load preferences;save preferences;reduction parameters;manipulator offsets", title="parameters"
625  PopupMenu pm_params win=$graphname, pos={70,0}, bodyWidth=80, proc=PearlAnglescanTracker#pmp_parameters
626  PopupMenu pm_params win=$graphname, help={"Load/save/edit data processing parameters"}
627  PopupMenu pm_data win=$graphname, mode=0, value="import;export;load file;save file", title="data"
628  PopupMenu pm_data win=$graphname, pos={120,0}, proc=PearlAnglescanTracker#pmp_data
629  PopupMenu pm_data win=$graphname, help={"Load/save data from/to independent dataset or file"}
630 
631  SetDrawLayer /w=$graphname ProgFront
632  SetDrawEnv /w=$graphname xcoord=rel, ycoord=rel
633  DrawPict /w=$graphname 0, 0, 1, 1, pict_tracker_sample
634 
636 
637  setdatafolder saveDF
638 };
639 
640 static variable update_data_graph(){
641  dfref savedf = getdatafolderdfr()
642  setdatafolder $(package_path)
643 
644  svar dataname
645  svar graphname
646 
647  // nothing to do - trace is updated automatically
648 
649  setdatafolder saveDF
650 };
651 
652 static variable update_detector_graph(){
653  dfref savedf = getdatafolderdfr()
654  setdatafolder $(package_path)
655 
656  svar dataname
657  svar graphname
658 
659  // nothing to do - trace is updated automatically
660 
661  setdatafolder saveDF
662 };
663 
675 static variable epics_connect(){
676  dfref savedf = getdatafolderdfr()
677  setdatafolder $(package_path)
678 
679  // close PVs which may be open from a previous call
681 
682  // create variables and waves
683  make /n=(1)/o arraydata, xscale, yscale
684  make /n=(1,1)/o image
685  variable /g ndimensions
686  variable /g arraysize0, arraysize1
687  variable /g datatype
688  variable /g colormode
689  string /g controls, monitors
690  string /g xunits, yunits
691 
692  // channel ID variables
693  variable /g chidDetectorState = 0
694  variable /g chidArrayData = 0
695  variable /g chidXScale = 0
696  variable /g chidYScale = 0
697  variable /g chidNDimensions = 0
698  variable /g chidArraySize0 = 0
699  variable /g chidArraySize1 = 0
700  variable /g chidDataType = 0
701  variable /g chidColorMode = 0
702  variable /g chidLensMode = 0
703  variable /g chidTheta = 0
704  variable /g chidTilt = 0
705  variable /g chidPhi = 0
706  variable /g curDetectorState = 0
707  variable /g curLensMode = 0
708  variable /g curTheta = 0
709  variable /g curTilt = 0
710  variable /g curPhi = 0
711  variable /g acqTheta = 0
712  variable /g acqTilt = 0
713  variable /g acqPhi = 0
714  variable /g connected = 0
715 
716  string epicsname = "X03DA-SCIENTA:"
717  string imagename = epicsname + "image1:"
718  string camname = epicsname + "cam1:"
719  string manipname = "X03DA-ES2-MA:"
720  variable timeout = 5// seconds
721 
722  #if exists("pvWait")
723  // EPICS.XOP version 0.3.0 or later
724  pvOpen /Q chidDetectorState, camname + "DetectorState_RBV"// 0 = idle
725  pvOpen /Q chidLensMode, camname + "LENS_MODE_RBV"
726  pvOpen /Q chidXScale, camname + "CHANNEL_SCALE_RBV"
727  pvOpen /Q chidYScale, camname + "SLICE_SCALE_RBV"
728  pvOpen /Q chidArrayData, imagename + "ArrayData"
729  pvOpen /Q chidNDimensions, imagename + "NDimensions_RBV"
730  pvOpen /Q chidArraySize0, imagename + "ArraySize0_RBV"
731  pvOpen /Q chidArraySize1, imagename + "ArraySize1_RBV"
732  pvOpen /Q chidDataType, imagename + "DataType_RBV"
733  pvOpen /Q chidColorMode, imagename + "ColorMode_RBV"
734 
735  pvOpen /Q chidTheta, manipname + "THT.RBV"
736  pvOpen /Q chidTilt, manipname + "TLT.RBV"
737  pvOpen /Q chidPhi, manipname + "PHI.RBV"
738 
739  pvWait timeout
740 
741  if (!GetRTError(1))
742  connected = 1
743  endif
744  #elif exists("pvOpen")
745  // EPICS.XOP version < 0.3.0
746  pvOpen /T=(timeout) chidDetectorState, camname + "DetectorState_RBV"// 0 = idle
747  pvOpen /T=(timeout) chidLensMode, camname + "LENS_MODE_RBV"
748  pvOpen /T=(timeout) chidXScale, camname + "CHANNEL_SCALE_RBV"
749  pvOpen /T=(timeout) chidYScale, camname + "SLICE_SCALE_RBV"
750  pvOpen /T=(timeout) chidArrayData, imagename + "ArrayData"
751  pvOpen /T=(timeout) chidNDimensions, imagename + "NDimensions_RBV"
752  pvOpen /T=(timeout) chidArraySize0, imagename + "ArraySize0_RBV"
753  pvOpen /T=(timeout) chidArraySize1, imagename + "ArraySize1_RBV"
754  pvOpen /T=(timeout) chidDataType, imagename + "DataType_RBV"
755  pvOpen /T=(timeout) chidColorMode, imagename + "ColorMode_RBV"
756 
757  pvOpen /T=(timeout) chidTheta, manipname + "THT.RBV"
758  pvOpen /T=(timeout) chidTilt, manipname + "TLT.RBV"
759  pvOpen /T=(timeout) chidPhi, manipname + "PHI.RBV"
760 
761  if (!GetRTError(1))
762  connected = 1
763  endif
764  #endif
765 
766  #if exists("pvMonitor")
767  if (connected)
768  pvMonitor /F=ast_callback_detector chidDetectorState, curDetectorState
769  pvMonitor /F=ast_callback_manip chidTheta, curTheta
770  pvMonitor /F=ast_callback_manip chidTilt, curTilt
771  pvMonitor /F=ast_callback_manip chidPhi, curPhi
772  pvMonitor /F=ast_callback_manip chidLensMode, curLensMode
773  pvMonitor /F=ast_callback_data chidArrayData
774  endif
775  #endif
776 
777  if (connected)
778  print "angle scan tracker: online"
779  else
780  print "angle scan tracker: offline"
781  endif
782 
783  setdatafolder saveDF
784  return !connected
785 };
786 
787 static variable epics_disconnect_chid(string chid_var_name){
788  string chid_var_name
789 
790  #if exists("pvClose")
791  nvar /z chid = $chid_var_name
792  if (nvar_exists(chid))
793  if (chid != 0)
794  pvClose chid
795  endif
796  chid = 0
797  endif
798  #endif
799 };
800 
801 static variable epics_disconnect(){
802  dfref savedf = GetDataFolderDFR()
803  setdatafolder $(package_path)
804 
805  nvar connected
806  if (connected)
807  connected = 0
808  epics_disconnect_chid("chidDetectorState")
809  epics_disconnect_chid("chidArrayData")
810  epics_disconnect_chid("chidXScale")
811  epics_disconnect_chid("chidYScale")
812  epics_disconnect_chid("chidNDimensions")
813  epics_disconnect_chid("chidArraySize0")
814  epics_disconnect_chid("chidArraySize1")
815  epics_disconnect_chid("chidDataType")
816  epics_disconnect_chid("chidColorMode")
817  epics_disconnect_chid("chidLensMode")
818  epics_disconnect_chid("chidTheta")
819  epics_disconnect_chid("chidTilt")
820  epics_disconnect_chid("chidPhi")
821  print "angle scan tracker: offline"
822  endif
823 
824  setdatafolder savedf
825 };
826 
831 static variable ast_window_hook(WMWinHookStruct* s){
832  STRUCT WMWinHookStruct &s
833 
834  Variable hookResult = 0
835 
836  switch(s.eventCode)
837  case 2:// kill
839  break
840  endswitch
841 
842  return hookResult
843 };
844 
846 variable ast_callback_data(variable chan){
847  variable chan
848 
849  nvar capturing = $(package_path + "capturing")
850  if (!capturing)
851  return 0
852  endif
853 
854  dfref savedf = GetDataFolderDFR()
855  setdatafolder $(package_path)
856  #if exists("pvGetWave")
857 
858  // retrieve data
859  nvar chidArrayData
860  nvar chidXScale
861  nvar chidYScale
862  nvar chidNDimensions
863  nvar chidArraySize0
864  nvar chidArraySize1
865  nvar chidDataType
866  nvar chidColorMode
867  nvar chidTheta
868  nvar chidTilt
869  nvar chidPhi
870  nvar acqTheta
871  nvar acqTilt
872  nvar acqPhi
873 
874  wave arraydata
875  wave image
876  wave xscale
877  wave yscale
878  variable ndimensions
879  variable arraysize0
880  variable arraysize1
881  variable datatype
882  variable colormode
883 
884  //printf "array callback: acqtheta = %.1f, acqtilt = %.1f, acqphi = %.1f\r", acqTheta, acqTilt, acqPhi
885 
886  pvGet chidNDimensions, ndimensions
887  pvGet chidArraySize0, arraysize0
888  pvGet chidArraySize1, arraysize1
889  pvGet chidDataType, datatype
890  pvGet chidColorMode, colormode
891 
892  // sanity checks
893  if (ndimensions != 2)
894  return -2
895  endif
896  if (colormode != 0)
897  return -3
898  endif
899 
900  redimension /n=(arraysize0 * arraysize1) arraydata
901  redimension /n=(arraysize0, arraysize1) image
902  redimension /n=(arraysize0) xscale
903  redimension /n=(arraysize1) yscale
904 
905  switch(datatype)
906  case 0:// int8
907  redimension /b arraydata, image
908  break
909  case 1:// uint8
910  redimension /b/u arraydata, image
911  break
912  case 2:// int16
913  redimension /w arraydata, image
914  break
915  case 3:// uint16
916  redimension /w/u arraydata, image
917  break
918  case 4:// int32
919  redimension /i arraydata, image
920  break
921  case 5:// uint32
922  redimension /i/u arraydata, image
923  break
924  case 6:// float32
925  redimension /s arraydata, image
926  break
927  case 7:// float64
928  redimension /d arraydata, image
929  break
930  endswitch
931 
932  pvGetWave chidArrayData, arraydata
933  pvGetWave chidXScale, xscale
934  pvGetWave chidYScale, yscale
935 
936  image = arraydata[p + q * arraysize0]
937  setscale /i x xscale[0], xscale[numpnts(xscale)-1], image
938  setscale /i y yscale[0], yscale[numpnts(yscale)-1], image
939 
940  ast_add_image(image, acqTheta, acqTilt, acqPhi)
941 
942  #endif
943  setdatafolder savedf
944  return 0
945 };
946 
951 variable ast_callback_detector(variable chan){
952  variable chan
953 
954  dfref savedf = GetDataFolderDFR()
955  setdatafolder $(package_path)
956 
957  // retrieve data
958  nvar curDetectorState
959  nvar curTheta
960  nvar curTilt
961  nvar curPhi
962 
963  nvar acqTheta
964  nvar acqTilt
965  nvar acqPhi
966 
967  if (curDetectorState == 1)
968  acqTheta = curTheta
969  acqTilt = curTilt
970  acqPhi = curPhi
971  endif
972 
973  //printf "detector callback: acqtheta = %.1f, acqtilt = %.1f, acqphi = %.1f, detstate = %d\r", acqTheta, acqTilt, acqPhi, curDetectorState
974 
975  setdatafolder savedf
976  return 0
977 };
978 
980 variable ast_callback_manip(variable chan){
981  variable chan
982 
983  dfref savedf = GetDataFolderDFR()
984  setdatafolder $(package_path)
985 
986  // retrieve data
987  nvar lensmode = curLensMode
988  nvar theta = curTheta
989  nvar tilt = curTilt
990  nvar phi = curPhi
991 
992  //printf "manipulator callback: curtheta = %.1f, curtilt = %.1f, curphi = %.1f, lensmode = %d\r", theta, tilt, phi, lensmode
993 
994  variable range
995  switch(lensmode)
996  case 1:
997  range = 45// angular 45
998  break
999  case 2:
1000  range = 60// angular 60
1001  break
1002  default:
1003  range = 2// transmission or error
1004  endswitch
1005  ast_update_detector(theta, tilt, phi, range)
1006 
1007  setdatafolder savedf
1008  return 0
1009 };
1010 
1011 // GUI functions
1012 
1013 static variable bp_capture(WMButtonAction* ba){
1014  STRUCT WMButtonAction &ba
1015 
1016  switch( ba.eventCode )
1017  case 2:// mouse up
1018  toggle_capture()
1019  break
1020  case -1:// control being killed
1021  break
1022  endswitch
1023 
1024  return 0
1025 };
1026 
1027 static variable toggle_capture(){
1028  dfref savedf = getdatafolderdfr()
1029  setdatafolder $(package_path)
1030 
1031  nvar capturing
1032  svar graphname
1033 
1034  capturing = !capturing
1035  if (capturing)
1036  ast_prepare()
1037  Button b_capture win=$graphname, title="stop"
1038  else
1039  Button b_capture win=$graphname, title="start"
1040  endif
1041 
1042  setdatafolder saveDF
1043 };
1044 
1045 static variable update_capture(){
1046  dfref savedf = getdatafolderdfr()
1047  setdatafolder $(package_path)
1048 
1049  nvar capturing
1050  svar graphname
1051 
1052  if (capturing)
1053  Button b_capture win=$graphname, title="stop"
1054  else
1055  Button b_capture win=$graphname, title="start"
1056  endif
1057 
1058  setdatafolder saveDF
1059 };
1060 
1061 static variable pmp_data(WMPopupAction* pa){
1062  STRUCT WMPopupAction &pa
1063 
1064  switch( pa.eventCode )
1065  case 2:// mouse up
1066  pmp_data_mouseup(pa)
1067  break
1068  case -1:// control being killed
1069  break
1070  endswitch
1071 
1072  return 0
1073 };
1074 
1075 static variable pmp_data_mouseup(WMPopupAction* pa){
1076  STRUCT WMPopupAction &pa
1077 
1078  switch(pa.popNum)
1079  case 1:
1081  break
1082  case 2:
1084  break
1085  case 3:
1087  break
1088  case 4:
1090  break
1091  endswitch
1092 };
1093 
1095 static variable export_tracker_data(){
1096  dfref savedf = getdatafolderdfr()
1097  setdatafolder $(package_path)
1098 
1099  svar export_folderpath
1100  nvar export_format
1101 
1102  string folderpath = export_folderpath
1103  string nickname = ""
1104  variable format = export_format
1105 
1106  prompt folderpath, "Folder Path"
1107  prompt nickname, "Nick Name"
1108  prompt format, "Format", popup, "PEARL;XPDplot"
1109 
1110  doprompt "Export Parameters", folderpath, nickname, format
1111 
1112  if (v_flag == 0)
1113  export_folderpath = folderpath
1114  export_format = format
1115  // note: if a full or partial path is used, all data folders except for the last in the path must already exist.
1116  newdatafolder /o $folderpath
1117  variable xpdplot = format == 2
1118  ast_export($folderpath, nickname, xpdplot=xpdplot)
1119  endif
1120 
1121  setdatafolder saveDF
1122 };
1123 
1125 static variable import_tracker_data(){
1126  dfref savedf = getdatafolderdfr()
1127  setdatafolder $(package_path)
1128 
1129  svar export_folderpath
1130  string folderpath = export_folderpath
1131  string nickname = ""
1132 
1133  dfref dfBefore = GetDataFolderDFR()
1134  Execute /q/z "CreateBrowser prompt=\"Select wave from dataset\", showWaves=1, showVars=0, showStrs=0"
1135  dfref dfAfter = GetDataFolderDFR()
1136  SetDataFolder dfBefore
1137 
1138  SVAR list = S_BrowserList
1139  NVAR flag = V_Flag
1140 
1141  if ((flag != 0) && (ItemsInList(list) >= 1))
1142  string wname = StringFromList(0, list)
1143  wave w = $wname
1144  string prefix = get_hemi_prefix(w)
1145  dfref df = GetWavesDataFolderDFR(w)
1146  setdatafolder df
1147  ast_import(prefix)
1148  endif
1149 
1150  setdatafolder saveDF
1151 };
1152 
1154 static variable save_tracker_data(){
1155  dfref savedf = getdatafolderdfr()
1156  setdatafolder $(package_path)
1157 
1158  svar dataname
1159  save_hemi_scan(dataname, "", "")
1160 
1161  setdatafolder saveDF
1162 };
1163 
1165 static variable load_tracker_data(){
1166  dfref savedf = getdatafolderdfr()
1167  setdatafolder $(package_path)
1168 
1169  NewDataFolder /O/S load_data
1170  LoadWave /t /q
1171  if (v_flag > 0)
1172  string wname = StringFromList(0, s_wavenames, ";")
1173  wave w = $wname
1174  string prefix = get_hemi_prefix(w)
1175  ast_import(prefix)
1176  endif
1177 
1178  setdatafolder $(package_path)
1179  KillDataFolder /Z load_data
1180 
1181  setdatafolder saveDF
1182 };
1183 
1184 static variable pmp_parameters(WMPopupAction* pa){
1185  STRUCT WMPopupAction &pa
1186 
1187  switch( pa.eventCode )
1188  case 2:// mouse up
1190  break
1191  case -1:// control being killed
1192  break
1193  endswitch
1194 
1195  return 0
1196 };
1197 
1198 static variable pmp_parameters_mouseup(WMPopupAction* pa){
1199  STRUCT WMPopupAction &pa
1200 
1201  switch(pa.popNum)
1202  case 1:
1203  load_prefs()
1204  break
1205  case 2:
1206  save_prefs()
1207  break
1208  case 3:
1210  break
1211  case 4:
1212  edit_offsets()
1213  break
1214  endswitch
1215 
1216 };
1217 
1218 static variable edit_reduction_params(){
1219  dfref savedf = getdatafolderdfr()
1220  setdatafolder $(package_path)
1221 
1222  svar pref_func = reduction_func
1223  svar pref_params = reduction_params
1224 
1225  string loc_func = pref_func
1226  string loc_params = pref_params
1227  if (prompt_func_params(loc_func, loc_params) == 0)
1228  ast_set_processing(loc_func, loc_params)
1229  endif
1230 
1231  setdatafolder saveDF
1232 };
1233 
1234 static variable edit_offsets(){
1235  dfref savedf = getdatafolderdfr()
1236  setdatafolder $(package_path)
1237 
1238  nvar theta_offset
1239  nvar tilt_offset
1240  nvar phi_offset
1241 
1242  variable loc_theta = theta_offset
1243  variable loc_tilt = tilt_offset
1244  variable loc_phi = phi_offset
1245 
1246  prompt loc_theta, "theta offset"
1247  prompt loc_tilt, "tilt offset"
1248  prompt loc_phi, "phi offset"
1249 
1250  doprompt "manipulator offsets", loc_theta, loc_tilt, loc_phi
1251  if (v_flag == 0)
1252  theta_offset = loc_theta
1253  tilt_offset = loc_tilt
1254  phi_offset = loc_phi
1255  endif
1256 
1257  setdatafolder saveDF
1258 };
1259 
variable ast_set_processing(string reduction_func, string reduction_params)
set the data processing parameters
+
variable ast_close()
stop tracker, close graph, release data structures.
+
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 epics_connect()
connect the angle scan tracker to EPICS
+
static variable update_detector_graph()
+
static variable bp_capture(WMButtonAction *ba)
+
variable crop_strip(wave strip, variable xlo, variable xhi)
crop a strip at the sides.
+
variable make_hemi_grid(variable npol, string nickname, variable xpdplot=defaultValue)
create a hemispherical, constant solid angle grid
+
variable hemi_add_anglescan(string nickname, wave values, wave polar, wave azi, wave weights=defaultValue)
add an arbitrary angle scan to a hemispherical scan grid.
+
static variable setup_detector()
+
static variable pmp_parameters(WMPopupAction *pa)
+
string get_hemi_prefix(wave w)
finds the prefix given any hemi wave
+
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 epics_disconnect()
+
static variable update_data_graph()
+
variable ast_setup()
set up data structures, display graph, and try to connect to analyser.
+
variable convert_angles_ttpd2polar(wave theta, wave tilt, wave phi, wave data, wave polar, wave azi)
convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.
+
static const string prefs_objects
semicolon-separated list of persistent variable, string, and wave names
+
static variable setup_graph()
create the graph window.
+
static variable import_tracker_data()
import tracker data (with prompt)
+
variable clear_hemi_grid(string nickname)
clear a hemispherical scan grid
+
static variable extend_data(variable num_slices)
extend the data buffer for the next polar scan
+
static variable pmp_data_mouseup(WMPopupAction *pa)
+
variable ast_prepare(variable theta_offset=defaultValue, variable tilt_offset=defaultValue, variable phi_offset=defaultValue)
prepare for new measurement and clear the data buffer.
+
variable PearlAnglescanTracker(string epicsname, string wbRGB)
Definition: pearl-menu.ipf:182
+
static variable setup_data()
+
static variable epics_disconnect_chid(string chid_var_name)
+ +
static variable AfterCompiledHook()
initialize package data once when the procedure is first loaded
+
static variable save_prefs()
save persistent package data to the preferences file.
+
static const string package_name
+
static variable edit_offsets()
+
static variable add_image_data(wave image, variable theta, variable tilt, variable phi)
reduce a detector image and add the result to the data buffer.
+
static const string package_path
data folder path
+
static variable load_tracker_data()
import tracker data from file (with prompt)
+
static variable save_tracker_data()
save tracker data to file (with prompt)
+
static variable update_capture()
+
variable ast_export(dfref folder, string nickname, variable xpdplot=defaultValue)
export tracker data to a separate, independent data set.
+
variable ast_update_detector(variable theta, variable tilt, variable phi, variable range)
update the current position indicator.
+
threadsafe variable adh5_default_reduction(wave source, wave dest1, wave dest2, string *param)
function prototype for adh5_load_reduced_detector
+
static variable process_image_data()
process the data buffer to generate the tracker dataset.
+
variable save_hemi_scan(string nickname, string pathname, string filename)
save a hemispherical scan to an Igor text file
+
static variable IgorQuitHook(string app)
disconnect EPICS channels before Igor quits.
+
variable ast_callback_manip(variable chan)
callback function for new manipulator position from EPICS.
+
variable ast_callback_detector(variable chan)
callback function for new detector state from EPICS.
+
static variable pmp_parameters_mouseup(WMPopupAction *pa)
+
variable prompt_func_params(string func_name, string *func_param)
+
variable convert_angles_ttpa2polar(wave theta, wave tilt, wave phi, wave analyser, wave polar, wave azi)
convert angles from TTPA (theta-tilt-phi-analyser) scheme to polar coordinates.
+
variable ast_add_image(wave image, variable theta, variable tilt, variable phi)
process and add a detector image to the tracker scan.
+
static variable pmp_data(WMPopupAction *pa)
+
variable duplicate_hemi_scan(string source_nickname, dfref dest_folder, string dest_nickname, variable xpdplot=defaultValue)
duplicate a hemispherical scan dataset.
+
static variable init_package()
+
static variable ast_window_hook(WMWinHookStruct *s)
window hook
+
static variable edit_reduction_params()
+
static variable toggle_capture()
+
variable ast_callback_data(variable chan)
callback function for new analyser data from EPICS.
+
variable ast_import(string nickname)
import tracker data from an existing angle scan dataset.
+
static variable load_prefs()
load persistent package data from the preferences file.
+
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.
+
static variable update_detector(variable theta, variable tilt, variable phi, variable range)
update the current position indicator.
+
static variable export_tracker_data()
export tracker data (with prompt)
+
+
+ + + + diff --git a/doc/html/pearl-anneal_8ipf.html b/doc/html/pearl-anneal_8ipf.html new file mode 100644 index 0000000..232c6cb --- /dev/null +++ b/doc/html/pearl-anneal_8ipf.html @@ -0,0 +1,1303 @@ + + + + + + +PEARL Procedures: pearl-anneal.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-anneal.ipf File Reference
+
+
+ +

ramp generator for sample annealing +More...

+
#include "pearl-epics"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlAnneal
 ramp generator for sample annealing
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

static variable AfterCompiledHook ()
 
static variable init_package ()
 initialize the package data folder More...
 
static variable save_prefs ()
 
static variable load_prefs ()
 
static variable save_ramp ()
 save current ramp table More...
 
static variable IgorQuitHook (string app)
 Igor sometimes crashes if the PVs are not disconnected when it quits. More...
 
static variable epics_connect ()
 connect to all required EPICS devices. More...
 
static variable epics_connect_psu ()
 connect to the power supply unit More...
 
static variable epics_connect_ls ()
 connect to the lakeshore temperature controller More...
 
static variable epics_connect_vac ()
 connect to the vacuum gauge More...
 
static variable epics_connect_pyro ()
 connect to the pyrometer More...
 
static variable epics_disconnect_chid (string chid_var_name)
 
static variable epics_disconnect ()
 disconnect from all EPICS devices. More...
 
static variable epics_disconnect_psu ()
 disconnect from the power supply unit More...
 
static variable epics_disconnect_ls ()
 disconnect from the lakeshore controller More...
 
static variable epics_disconnect_vac ()
 disconnect from the vacuum gauge More...
 
static variable epics_disconnect_pyro ()
 disconnect from the pyrometer More...
 
variable ann_new_ramp_table (variable edit_table=defaultValue)
 create a new ramp table and open it in a table window. More...
 
variable ann_init_bg ()
 initialize the background tasks More...
 
static variable ann_record_bg (WMBackgroundStruct *s)
 background task of the recorder More...
 
static variable ann_ramp_bg (WMBackgroundStruct *s)
 background task of the ramp More...
 
variable ann_ramp_step ()
 prepare and execute the next ramp step More...
 
static variable ann_ramp_update (variable phase)
 update control panel variables More...
 
static variable ann_ramp_step_exec (variable minutes_now)
 execute the next ramp step More...
 
static variable ann_ramp_trip (variable phase)
 check trip conditions More...
 
static variable ann_ramp_hold (variable phase)
 check hold conditions More...
 
static variable ann_ramp_target (variable phase)
 check target conditions More...
 
variable ann_ramp_start ()
 start an annealing ramp More...
 
variable ann_ramp_pause ()
 
variable ann_ramp_resume ()
 
variable ann_ramp_stop (variable reset_psu)
 stop a running annealing ramp More...
 
variable ann_display_ramp ()
 
void panel_ramp_gen ()
 
static variable bp_ramp_start (WMButtonAction *ba)
 
static variable bp_ramp_pause (WMButtonAction *ba)
 
static variable bp_ramp_stop (WMButtonAction *ba)
 
static variable bp_ramp_edit (WMButtonAction *ba)
 
+ + + + + + + +

+Variables

static const string package_name = "pearl_anneal"
 
static const string package_path = "root:packages:pearl_anneal:"
 
static const string prefs_objects = ""
 
+

Detailed Description

+

ramp generator for sample annealing

+

the ramp generator increases/decreases the heating power according to piecewise target function defined by the user in a set of waves. each row of these waves describes one ramp phase. the rows are processed sequentially.

+

target waves define when a ramp phase ends. when a target is reached, the generator starts to process the next one. the end point of the current phase will become the start point of the next phase.

+

the power target is interpolated linearly between the start and end points of a phase. the ramp speed is given by the difference of the target values of the previous and current phases, and the duration of the phase. the power target values must be filled and be greater or equal to zero.

+

the temperature targets are kept constant. once a temperature target has been reached, the phase ends. temperature targets are not enforced. the phase will end unconditionally when the power target is reached. if you need to reach a temperature target, make sure that the power target is high enough, and that the ramp is slow enough so that the temperature is reached before the phase ends. temperature targets can be disabled by entering NaN.

+

limits are not enforced. if a limit is exceeded, the ramp will pause (while the power remains at its last setting). the ramp resumes when the value falls below the limit. limit checking can be disabled by entering NaN. limits remain constant during the phase.

+

trips cause the ramp to stop, and the power to be turned off. trip checking can be disabled by entering NaN. trip values remain constant during the phase. caution: do not rely on these trips for protection of equipment or the sample! there may be a considerable lag between the occurrence of a trip condition and the execution of a power reset! either use a suitable hardware trip mechanism, or include an appropriate safety margin.

+
    +
  • minutes: minimum duration of the ramp phase in minutes. determines the ramping speed. the phase may take longer if pressure or temperature limits are reached. required, must be greater than zero except for the first phase.
  • +
  • target_watts: power setpoint at the end of the phase. required, must be greater or equal to zero.
  • +
  • target_tempA: temperature target of Lakeshore channel A in Kelvin. optional, specify NaN to disable.
  • +
  • target_tempB: temperature target of Lakeshore channel B in Kelvin. optional, specify NaN to disable.
  • +
  • target_tempPy: temperature target of the pyrometer in Kelvin. optional, specify NaN to disable.
  • +
  • limit_pressure: vacuum pressure limit in mbar. optional, specify NaN to disable.
  • +
  • trip_tempA: trip temperature of sensor A in Kelvin. optional, specify NaN to disable.
  • +
  • trip_tempB: trip temperature of sensor B in Kelvin. optional, specify NaN to disable.
  • +
  • trip_tempPy: trip temperature of pyrometer in Kelvin. optional, specify NaN to disable.
  • +
  • trip_pressure: trip pressure in mbar. optional, specify NaN to disable.
  • +
+

at the beginning of the table, a row with the current setpoints (normally zero at the beginning of a ramp) and zero duration must be included. note that the power supply will remain at its last setpoint after the ramp. thus, the last row should bring the power supply to a safe end value, e.g. zero.

+
Precondition
run-time requirements for online mode at the beamline
    +
  • EPICS.XOP of Paul Scherrer Institut, version 0.3.0 (March 2015) or later, must be loaded.
  • +
  • caRepeater.exe program (from EPICS distribution) must be running.
  • +
+
+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-anneal.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static variable AfterCompiledHook ()
+
+static
+
+ +

Definition at line 98 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ann_display_ramp ()
+
+ +

Definition at line 1295 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ann_init_bg ()
+
+ +

initialize the background tasks

+

can be called repeatedly. the function exits gracefully if tasks are running.

+ +

Definition at line 712 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ann_new_ramp_table (variable edit_table = defaultValue)
+
+ +

create a new ramp table and open it in a table window.

+

the waves are created in the current data folder. to be executed, they must be copied into the package folder.

+ +

Definition at line 668 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_ramp_bg (WMBackgroundStruct * s)
+
+static
+
+ +

background task of the ramp

+ +

Definition at line 800 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_ramp_hold (variable phase)
+
+static
+
+ +

check hold conditions

+
Returns
non-zero if a hold condition is detected, zero if everything is okay.
+ +

Definition at line 1064 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ann_ramp_pause ()
+
+ +

Definition at line 1236 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ann_ramp_resume ()
+
+ +

Definition at line 1249 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ann_ramp_start ()
+
+ +

start an annealing ramp

+ +

Definition at line 1180 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ann_ramp_step ()
+
+ +

prepare and execute the next ramp step

+

check trips and limits before calling ann_ramp_step_exec()

+ +

Definition at line 816 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_ramp_step_exec (variable minutes_now)
+
+static
+
+ +

execute the next ramp step

+

calculate new setpoints and update the power supply setpoints. no trips and limits checked in this function.

+
Returns
zero during ramp phase, non-zero at end of ramp phase
+ +

Definition at line 916 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ann_ramp_stop (variable reset_psu)
+
+ +

stop a running annealing ramp

+
Parameters
+ + +
reset_psu1 = turn off the power supply, 0 = do not change the power supply the power supply is also turned off if the current target power is below 1 W.
+
+
+ +

Definition at line 1266 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_ramp_target (variable phase)
+
+static
+
+ +

check target conditions

+
Returns
non-zero if a target reached, zero otherwise.
+ +

Definition at line 1087 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_ramp_trip (variable phase)
+
+static
+
+ +

check trip conditions

+

turn of power and stop the ramp if any of the trip conditions is met.

+
Returns
non-zero if a trip condition is detected, zero if everything is okay.
+ +

Definition at line 1011 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_ramp_update (variable phase)
+
+static
+
+ +

update control panel variables

+ +

Definition at line 868 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ann_record_bg (WMBackgroundStruct * s)
+
+static
+
+ +

background task of the recorder

+ +

Definition at line 723 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_ramp_edit (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1476 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_ramp_pause (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1440 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_ramp_start (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1422 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_ramp_stop (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1462 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_connect ()
+
+static
+
+ +

connect to all required EPICS devices.

+

can be called repeatedly. the function exits gracefully if connections are existing.

+
Returns
zero if successful, non-zero if an error occurred
+ +

Definition at line 303 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_connect_ls ()
+
+static
+
+ +

connect to the lakeshore temperature controller

+

if the EPICS XOP is not loaded, the function does nothing. if channels are not available, the function exits with an error code. the run-time error status is reset.

+
Returns
zero if successful, non-zero if an error occurred
+
Todo:
the X03DA channel names are hard-coded.
+ +

Definition at line 417 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_connect_psu ()
+
+static
+
+ +

connect to the power supply unit

+

if the EPICS XOP is not loaded, the function does nothing. if channels are not available, the function exits with an error code. the run-time error status is reset.

+
Returns
zero if successful, non-zero if an error occurred
+
Todo:
the X03DA channel names are hard-coded.
+ +

Definition at line 338 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_connect_pyro ()
+
+static
+
+ +

connect to the pyrometer

+

if the EPICS XOP is not loaded, the function does nothing. if channels are not available, the function exits with an error code. the run-time error status is reset.

+
Returns
zero if successful, non-zero if an error occurred
+
Todo:
the X03DA channel names are hard-coded.
+

IOC implemented in LabView X03DA-LV-MAURER:TEMP-1 X03DA-LV-MAURER:TEMP-Q

+ +

Definition at line 519 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_connect_vac ()
+
+static
+
+ +

connect to the vacuum gauge

+

if the EPICS XOP is not loaded, the function does nothing. if channels are not available, the function exits with an error code. the run-time error status is reset.

+
Returns
zero if successful, non-zero if an error occurred
+
Todo:
the X03DA channel names are hard-coded.
+ +

Definition at line 468 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_disconnect ()
+
+static
+
+ +

disconnect from all EPICS devices.

+ +

Definition at line 577 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable epics_disconnect_chid (string chid_var_name)
+
+static
+
+ +

Definition at line 561 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_disconnect_ls ()
+
+static
+
+ +

disconnect from the lakeshore controller

+ +

Definition at line 615 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_disconnect_psu ()
+
+static
+
+ +

disconnect from the power supply unit

+ +

Definition at line 591 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_disconnect_pyro ()
+
+static
+
+ +

disconnect from the pyrometer

+ +

Definition at line 648 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable epics_disconnect_vac ()
+
+static
+
+ +

disconnect from the vacuum gauge

+ +

Definition at line 632 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable IgorQuitHook (string app)
+
+static
+
+ +

Igor sometimes crashes if the PVs are not disconnected when it quits.

+ +

Definition at line 293 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable init_package ()
+
+static
+
+ +

initialize the package data folder

+

create the package data folder, and all necessary control and data objects. reset all variables.

+ +

Definition at line 128 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable load_prefs ()
+
+static
+
+ +

Definition at line 241 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + + + +
void panel_ramp_gen ()
+
+ +

Definition at line 1311 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable save_prefs ()
+
+static
+
+ +

Definition at line 223 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable save_ramp ()
+
+static
+
+ +

save current ramp table

+

WORK IN PROGRESS

+ +

Definition at line 270 of file pearl-anneal.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string package_name = "pearl_anneal"
+
+static
+
+ +

Definition at line 93 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_path = "root:packages:pearl_anneal:"
+
+static
+
+ +

Definition at line 94 of file pearl-anneal.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string prefs_objects = ""
+
+static
+
+ +

Definition at line 96 of file pearl-anneal.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-anneal_8ipf.js b/doc/html/pearl-anneal_8ipf.js new file mode 100644 index 0000000..004868e --- /dev/null +++ b/doc/html/pearl-anneal_8ipf.js @@ -0,0 +1,43 @@ +var pearl_anneal_8ipf = +[ + [ "AfterCompiledHook", "pearl-anneal_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed", null ], + [ "ann_display_ramp", "pearl-anneal_8ipf.html#a1d7439cfe449274facc5d7485687abde", null ], + [ "ann_init_bg", "pearl-anneal_8ipf.html#a118eb2d022777293211e2b57afd0cd2d", null ], + [ "ann_new_ramp_table", "pearl-anneal_8ipf.html#a0d8021c189b89fc8c478273be310d95f", null ], + [ "ann_ramp_bg", "pearl-anneal_8ipf.html#aae93f044f52ffe6ef8fca0f494a4f09a", null ], + [ "ann_ramp_hold", "pearl-anneal_8ipf.html#a436169afd895afa28b7a1e4555549bc4", null ], + [ "ann_ramp_pause", "pearl-anneal_8ipf.html#aed065efbe18ff0551222a87966fa4b88", null ], + [ "ann_ramp_resume", "pearl-anneal_8ipf.html#a0ca14f61ba023e7ae2d8ee3a600f8a2c", null ], + [ "ann_ramp_start", "pearl-anneal_8ipf.html#a4bac63b77a6757176b0645447e13a2ce", null ], + [ "ann_ramp_step", "pearl-anneal_8ipf.html#a2acb7962bdecc81584e7223d08395265", null ], + [ "ann_ramp_step_exec", "pearl-anneal_8ipf.html#a9312492a007c512608dd5afbe887b194", null ], + [ "ann_ramp_stop", "pearl-anneal_8ipf.html#ad898494bcb572a45cd3e486705c26889", null ], + [ "ann_ramp_target", "pearl-anneal_8ipf.html#af4d542740fc65b110c6d29eb5b471ad8", null ], + [ "ann_ramp_trip", "pearl-anneal_8ipf.html#ae65b634b3600ca970ed4afb9bb6bc2b0", null ], + [ "ann_ramp_update", "pearl-anneal_8ipf.html#a08cfac953f4c1a2bc610bfa71df8d426", null ], + [ "ann_record_bg", "pearl-anneal_8ipf.html#a5355d3a39671eafbd6834bba4c178ae9", null ], + [ "bp_ramp_edit", "pearl-anneal_8ipf.html#ac796c9f66f359181bc216d871e6e7ed6", null ], + [ "bp_ramp_pause", "pearl-anneal_8ipf.html#a17eac03e017432cd0b146a4ec2ef1f59", null ], + [ "bp_ramp_start", "pearl-anneal_8ipf.html#a1e30f411d19cb467ac69f0b614b7da05", null ], + [ "bp_ramp_stop", "pearl-anneal_8ipf.html#af6654a6da42a11cff720b10ec44de53c", null ], + [ "epics_connect", "pearl-anneal_8ipf.html#a306b168cab2f9c4146cee87009e69f6d", null ], + [ "epics_connect_ls", "pearl-anneal_8ipf.html#a4d0c5e01650bf507cfe2dabb48241ca7", null ], + [ "epics_connect_psu", "pearl-anneal_8ipf.html#ad15e393946341f8cbef378879927e468", null ], + [ "epics_connect_pyro", "pearl-anneal_8ipf.html#adc675fd83b5b675da4a843b5e51dffd2", null ], + [ "epics_connect_vac", "pearl-anneal_8ipf.html#ad3de29ec7502210f3bc63df655a3cdbe", null ], + [ "epics_disconnect", "pearl-anneal_8ipf.html#a4619cb98a75adb3c39ea3a62e524b793", null ], + [ "epics_disconnect_chid", "pearl-anneal_8ipf.html#acfe94a64ff3e8c4cb32e34ffb9cae594", null ], + [ "epics_disconnect_ls", "pearl-anneal_8ipf.html#a45133df00d8cf5bb53ac74cdc6c570bc", null ], + [ "epics_disconnect_psu", "pearl-anneal_8ipf.html#a487fa8e70cb27fd0897e76c7ced44a1b", null ], + [ "epics_disconnect_pyro", "pearl-anneal_8ipf.html#a75536bbca9ac06def99d16aada4bd51f", null ], + [ "epics_disconnect_vac", "pearl-anneal_8ipf.html#afc94a43ad9c513a494e1d897bf24d745", null ], + [ "IgorQuitHook", "pearl-anneal_8ipf.html#a0852e59e9018cf3f7e176aa2355b18e3", null ], + [ "init_package", "pearl-anneal_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725", null ], + [ "load_prefs", "pearl-anneal_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3", null ], + [ "panel_ramp_gen", "pearl-anneal_8ipf.html#a11dcebff8d1254c3ba40e47ce70d667e", null ], + [ "save_prefs", "pearl-anneal_8ipf.html#ac729557a307bddd2f2ad298199976c01", null ], + [ "save_ramp", "pearl-anneal_8ipf.html#af66960ed48e5f54023dce7633af6e5bd", null ], + [ "package_name", "pearl-anneal_8ipf.html#aca457d1f4414d20a911254b1de13ebbb", null ], + [ "package_path", "pearl-anneal_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b", null ], + [ "prefs_objects", "pearl-anneal_8ipf.html#a20720748c82a7eaa4b02d4084a4219b2", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-anneal_8ipf_source.html b/doc/html/pearl-anneal_8ipf_source.html new file mode 100644 index 0000000..15e36b6 --- /dev/null +++ b/doc/html/pearl-anneal_8ipf_source.html @@ -0,0 +1,1488 @@ + + + + + + +PEARL Procedures: pearl-anneal.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-anneal.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3// Use modern global access method and strict wave access.
+
2 #pragma version = 0.1
+
3 #pragma IgorVersion = 6.2
+
4 #pragma ModuleName = PearlAnneal
+
5 #include "pearl-epics"
+
6 
+
86 
+
92 
+
93 static const string package_name = "pearl_anneal";
+
94 static const string package_path = "root:packages:pearl_anneal:";
+
95 // semicolon-separated list of persistent variable, string, and wave names
+
96 static const string prefs_objects = "";
+
97 
+
98 static variable AfterCompiledHook(){
+
99  // initializes package data once when the procedure is first loaded
+
100 
+
101  dfref savedf = GetDataFolderDFR()
+
102  variable do_init = 1
+
103  if (DataFolderExists(package_path))
+
104  setdatafolder $(package_path)
+
105  nvar /z init_done
+
106  if (nvar_exists(init_done))
+
107  if (init_done)
+
108  do_init = 0
+
109  endif
+
110  endif
+
111  endif
+
112 
+
113  if (do_init)
+
114  init_package()
+
115  load_prefs()
+
116  setdatafolder $(package_path)
+
117  variable /g init_done = 1
+
118  endif
+
119 
+
120  setdatafolder savedf
+
121  return 0
+
122 };
+
123 
+
128 static variable init_package(){
+
129  dfref savedf = getdatafolderdfr()
+
130  setdatafolder root:
+
131  newdatafolder /o/s packages
+
132  newdatafolder /o/s $package_name
+
133 
+
134  // configuration (persistent)
+
135  string /g graphname = "graph_anneal_tracker"
+
136  string /g dataname = "anneal"
+
137 
+
138  // recently used (persistent)
+
139 
+
140  // recently used (volatile)
+
141 
+
142  // run-time variables (volatile)
+
143  string /g controls, monitors
+
144  variable /g psu_connected = 0
+
145  variable /g ls_connected = 0
+
146  variable /g pyro_connected = 0
+
147  variable /g vac_connected = 0
+
148 
+
149  // channel ID
+
150  variable /g chidSetVolts = 0
+
151  variable /g chidGetVolts = 0
+
152  variable /g chidSetAmps = 0
+
153  variable /g chidGetAmps = 0
+
154  variable /g chidGetWatts = 0
+
155  variable /g chidSetOnOff = 0
+
156  variable /g chidGetOnOff = 0
+
157  variable /g chidStatCC = 0
+
158  variable /g chidStatCV = 0
+
159  variable /g chidGetRemote = 0
+
160 
+
161  variable /g chidGetTempA = 0
+
162  variable /g chidGetTempB = 0
+
163  variable /g chidGetPyro1 = 0
+
164  variable /g chidGetPyroQ = 0
+
165 
+
166  variable /g chidGetPressure = 0
+
167 
+
168  // current PV values
+
169  variable /g curGetVolts = 0
+
170  variable /g curSetVolts = 0
+
171  variable /g curGetAmps = 0
+
172  variable /g curSetAmps = 0
+
173  variable /g curGetWatts = 0
+
174  variable /g curSetWatts = 0
+
175  variable /g curGetOnOff = 0
+
176  variable /g curStatCC = 0
+
177  variable /g curStatCV = 0
+
178 
+
179  variable /g curGetTempA = 0
+
180  variable /g curGetTempB = 0
+
181  variable /g curGetPyro1 = 0
+
182  variable /g curGetPyroQ = 0
+
183 
+
184  variable /g curGetPressure = 0
+
185 
+
186  // current phase indicators
+
187  variable /g curTargetWatts = nan
+
188  variable /g curTargetTempA = nan
+
189  variable /g curTargetTempB = nan
+
190  variable /g curTargetTempPy = nan
+
191  variable /g curTripTempA = nan
+
192  variable /g curTripTempB = nan
+
193  variable /g curTripTempPy = nan
+
194  variable /g curLimitPressure = nan
+
195  variable /g curTripPressure = nan
+
196  variable /g curPhaseMinutes = 0
+
197 
+
198  // chart control and data
+
199  make /n=500 /o recVolts, recAmps, recWatts, recTemp, recPressure, recMinutes
+
200  variable /g recPoint
+
201  variable /g recMinutesStart
+
202  recPoint = 0
+
203  recMinutesStart = datetime / 60
+
204 
+
205  // ramp status: 1 = running, 0.5 = paused, 0 = off
+
206  variable /g ramp_status
+
207  // index of the current ramp phase
+
208  variable /g ramp_phase
+
209  // ramping direction +1 = up, -1 = down
+
210  variable /g ramp_dir
+
211  // system time in minutes at the start of the current phase
+
212  variable /g minutes_start
+
213  // system time in minutes at the time of the previous step
+
214  variable /g minutes_previous
+
215  // status message for user
+
216  string /g ramp_message
+
217 
+
218  ann_new_ramp_table(edit_table=0)
+
219 
+
220  setdatafolder savedf
+
221 };
+
222 
+
223 static variable save_prefs(){
+
224  // saves persistent package data to the preferences file
+
225  dfref saveDF = GetDataFolderDFR()
+
226 
+
227  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
+
228  fullPath += package_name
+
229  NewPath/O/C/Q tempPackagePrefsPath, fullPath
+
230  fullPath += ":preferences.pxp"
+
231 
+
232  SetDataFolder root:packages
+
233  SetDataFolder $package_name
+
234  SaveData /O /Q /J=prefs_objects fullPath
+
235 
+
236  KillPath/Z tempPackagePrefsPath
+
237 
+
238  SetDataFolder saveDF
+
239 };
+
240 
+
241 static variable load_prefs(){
+
242  // loads persistent package data from the preferences file
+
243  // the preferences file is an Igor packed experiment file in a special preferences folder
+
244  dfref saveDF = GetDataFolderDFR()
+
245 
+
246  variable result = -1
+
247  setdatafolder root:
+
248  NewDataFolder /O/S packages
+
249  NewDataFolder /O/S $package_name
+
250  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
+
251  fullPath += package_name
+
252 
+
253  GetFileFolderInfo /Q /Z fullPath
+
254  if (V_Flag == 0)// Disk directory exists?
+
255  fullPath += ":preferences.pxp"
+
256  GetFileFolderInfo /Q /Z fullPath
+
257  if (V_Flag == 0)// Preference file exist?
+
258  LoadData /O /R /Q fullPath
+
259  result = 0
+
260  endif
+
261  endif
+
262 
+
263  SetDataFolder saveDF
+
264  return result
+
265 };
+
266 
+
270 static variable save_ramp(){
+
271  dfref saveDF = GetDataFolderDFR()
+
272 
+
273  SetDataFolder root:packages
+
274  SetDataFolder $package_name
+
275 
+
276  wave minutes
+
277  wave target_watts
+
278  wave target_tempA
+
279  wave target_tempB
+
280  wave target_tempPy
+
281  wave trip_tempA
+
282  wave trip_tempB
+
283  wave trip_tempPy
+
284  wave limit_pressure
+
285  wave trip_pressure
+
286 
+
287  Save /T /M="\r\n" /I minutes,target_watts,target_tempPy,target_tempB,target_tempA,limit_pressure,trip_tempPy,trip_tempB,trip_tempA,trip_pressure as "anneal-ramp.itx"
+
288 
+
289  SetDataFolder saveDF
+
290 };
+
291 
+
293 static variable IgorQuitHook(string app){
+
294  string app
+ +
296 };
+
297 
+
303 static variable epics_connect(){
+
304  dfref savedf = getdatafolderdfr()
+
305  setdatafolder $(package_path)
+
306 
+
307  nvar psu_connected
+
308  nvar ls_connected
+
309  nvar vac_connected
+
310  nvar pyro_connected
+
311 
+
312  if (!psu_connected)
+ +
314  endif
+
315  if (!ls_connected)
+ +
317  endif
+
318  if (!vac_connected)
+ +
320  endif
+
321  if (!pyro_connected)
+ +
323  endif
+
324 
+
325  setdatafolder saveDF
+
326  return !(psu_connected && ls_connected && vac_connected && pyro_connected)
+
327 };
+
328 
+
338 static variable epics_connect_psu(){
+
339  dfref savedf = getdatafolderdfr()
+
340  setdatafolder $(package_path)
+
341 
+
342  // create variables and waves
+
343  nvar connected = psu_connected
+
344  svar ramp_message
+
345 
+
346  // channel ID variables
+
347  nvar chidSetVolts
+
348  nvar chidGetVolts
+
349  nvar chidSetAmps
+
350  nvar chidGetAmps
+
351  nvar chidGetWatts
+
352  nvar chidSetOnOff
+
353  nvar chidGetOnOff
+
354  nvar chidStatCC
+
355  nvar chidStatCV
+
356  nvar chidGetRemote
+
357 
+
358  nvar curGetVolts
+
359  nvar curGetAmps
+
360  nvar curGetWatts
+
361  nvar curGetOnOff
+
362  nvar curStatCC
+
363  nvar curStatCV
+
364 
+
365  string psu_name = "X03DA-PSU-XP:"
+
366  variable timeout = 5// seconds
+
367 
+
368  #if exists("pvWait")
+
369  // EPICS.XOP version 0.3.0 or later
+
370  pvOpen /Q chidSetVolts, psu_name + "SETVOLTS"
+
371  pvOpen /Q chidGetVolts, psu_name + "GETVOLTS"
+
372  pvOpen /Q chidSetAmps, psu_name + "SETCUR"
+
373  pvOpen /Q chidGetAmps, psu_name + "GETCUR"
+
374  pvOpen /Q chidGetWatts, psu_name + "CALCPWR"
+
375  pvOpen /Q chidSetOnOff, psu_name + "SETONOFF"
+
376  pvOpen /Q chidGetOnOff, psu_name + "GETONOFF"
+
377  pvOpen /Q chidGetRemote, psu_name + "COMGETRMT"// string
+
378  pvOpen /Q chidStatCC, psu_name + "STAT-CC"
+
379  pvOpen /Q chidStatCV, psu_name + "STAT-CV"
+
380 
+
381  pvWait timeout
+
382  #endif
+
383 
+
384  if (GetRTError(1))
+
385  connected = 0
+
386  ramp_message = "PSU: no connection"
+
387  else
+
388  connected = 1
+
389  endif
+
390 
+
391  #if exists("pvMonitor")
+
392  if (connected)
+
393  pvMonitor chidGetVolts, curGetVolts
+
394  pvMonitor chidSetVolts, curSetVolts
+
395  pvMonitor chidGetAmps, curGetAmps
+
396  pvMonitor chidSetAmps, curSetAmps
+
397  pvMonitor chidGetWatts, curGetWatts
+
398  pvMonitor chidGetOnOff, curGetOnOff
+
399  pvMonitor chidStatCC, curStatCC
+
400  pvMonitor chidStatCV, curStatCV
+
401  endif
+
402  #endif
+
403 
+
404  setdatafolder saveDF
+
405  return !connected
+
406 };
+
407 
+
417 static variable epics_connect_ls(){
+
418  dfref savedf = getdatafolderdfr()
+
419  setdatafolder $(package_path)
+
420 
+
421  nvar connected = ls_connected
+
422  svar ramp_message
+
423 
+
424  nvar chidGetTempA
+
425  nvar chidGetTempB
+
426 
+
427  nvar curGetTempA
+
428  nvar curGetTempB
+
429 
+
430  string base_name = "X03DA-PC-LAKESHOREXP:"
+
431  variable timeout = 5// seconds
+
432 
+
433  #if exists("pvWait")
+
434  // EPICS.XOP version 0.3.0 or later
+
435  pvOpen /Q chidGetTempA, base_name + "A-TEMP_RBV"
+
436  pvOpen /Q chidGetTempB, base_name + "B-TEMP_RBV"
+
437 
+
438  pvWait timeout
+
439  #endif
+
440 
+
441  if (GetRTError(1))
+
442  connected = 0
+
443  ramp_message = "Lakeshore: no connection"
+
444  else
+
445  connected = 1
+
446  endif
+
447 
+
448  #if exists("pvMonitor")
+
449  if (connected)
+
450  pvMonitor /F=ann_callback_ls chidGetTempA, curGetTempA
+
451  pvMonitor /F=ann_callback_ls chidGetTempB, curGetTempB
+
452  endif
+
453  #endif
+
454 
+
455  setdatafolder saveDF
+
456  return !connected
+
457 };
+
458 
+
468 static variable epics_connect_vac(){
+
469  dfref savedf = getdatafolderdfr()
+
470  setdatafolder $(package_path)
+
471 
+
472  nvar connected = vac_connected
+
473  svar ramp_message
+
474 
+
475  nvar chidGetPressure
+
476 
+
477  nvar curGetPressure
+
478 
+
479  string base_name = "X03DA-PVC-XP:"
+
480  variable timeout = 5// seconds
+
481 
+
482  #if exists("pvWait")
+
483  // EPICS.XOP version 0.3.0 or later
+
484  pvOpen /Q chidGetPressure, base_name + "IG-PRESSURE"
+
485 
+
486  pvWait timeout
+
487  #endif
+
488 
+
489  if (GetRTError(1))
+
490  connected = 0
+
491  ramp_message = "vacuum gauge: no connection"
+
492  else
+
493  connected = 1
+
494  endif
+
495 
+
496  #if exists("pvMonitor")
+
497  if (connected)
+
498  pvMonitor /F=ann_callback_pvc chidGetPressure, curGetPressure
+
499  endif
+
500  #endif
+
501 
+
502  setdatafolder saveDF
+
503  return !connected
+
504 };
+
505 
+
519 static variable epics_connect_pyro(){
+
520  dfref savedf = getdatafolderdfr()
+
521  setdatafolder $(package_path)
+
522 
+
523  nvar connected = pyro_connected
+
524  svar ramp_message
+
525 
+
526  nvar chidGetPyro1
+
527  nvar chidGetPyroQ
+
528 
+
529  nvar curGetPyro1
+
530  nvar curGetPyroQ
+
531 
+
532  string base_name = "X03DA-LV-MAURER:"
+
533  variable timeout = 5// seconds
+
534 
+
535  #if exists("pvWait")
+
536  // EPICS.XOP version 0.3.0 or later
+
537  pvOpen /Q chidGetPyro1, base_name + "TEMP-1"
+
538  pvOpen /Q chidGetPyroQ, base_name + "TEMP-Q"
+
539 
+
540  pvWait timeout
+
541  #endif
+
542 
+
543  if (GetRTError(1))
+
544  connected = 0
+
545  ramp_message = "pyrometer: no connection"
+
546  else
+
547  connected = 1
+
548  endif
+
549 
+
550  #if exists("pvMonitor")
+
551  if (connected)
+
552  pvMonitor /F=ann_callback_ls chidGetPyro1, curGetPyro1
+
553  pvMonitor /F=ann_callback_ls chidGetPyroQ, curGetPyroQ
+
554  endif
+
555  #endif
+
556 
+
557  setdatafolder saveDF
+
558  return !connected
+
559 };
+
560 
+
561 static variable epics_disconnect_chid(string chid_var_name){
+
562  string chid_var_name
+
563 
+
564  #if exists("pvClose")
+
565  nvar /z chid = $chid_var_name
+
566  if (nvar_exists(chid))
+
567  if (chid != 0)
+
568  pvClose chid
+
569  endif
+
570  chid = 0
+
571  endif
+
572  #endif
+
573 };
+
574 
+
577 static variable epics_disconnect(){
+
578  dfref savedf = GetDataFolderDFR()
+
579  setdatafolder $(package_path)
+
580 
+ + + + +
585 
+
586  setdatafolder savedf
+
587 };
+
588 
+
591 static variable epics_disconnect_psu(){
+
592  dfref savedf = GetDataFolderDFR()
+
593  setdatafolder $(package_path)
+
594 
+
595  nvar connected = psu_connected
+
596  if (connected)
+
597  connected = 0
+
598  epics_disconnect_chid("chidSetVolts")
+
599  epics_disconnect_chid("chidGetVolts")
+
600  epics_disconnect_chid("chidSetAmps")
+
601  epics_disconnect_chid("chidGetAmps")
+
602  epics_disconnect_chid("chidGetWatts")
+
603  epics_disconnect_chid("chidSetOnOff")
+
604  epics_disconnect_chid("chidGetOnOff")
+
605  epics_disconnect_chid("chidGetRemote")
+
606  epics_disconnect_chid("chidStatCC")
+
607  epics_disconnect_chid("chidStatCV")
+
608  endif
+
609 
+
610  setdatafolder savedf
+
611 };
+
612 
+
615 static variable epics_disconnect_ls(){
+
616  dfref savedf = GetDataFolderDFR()
+
617  setdatafolder $(package_path)
+
618 
+
619  nvar connected = ls_connected
+
620  if (connected)
+
621  connected = 0
+
622 
+
623  epics_disconnect_chid("chidGetTempA")
+
624  epics_disconnect_chid("chidGetTempB")
+
625  endif
+
626 
+
627  setdatafolder savedf
+
628 };
+
629 
+
632 static variable epics_disconnect_vac(){
+
633  dfref savedf = GetDataFolderDFR()
+
634  setdatafolder $(package_path)
+
635 
+
636  nvar connected = vac_connected
+
637  if (connected)
+
638  connected = 0
+
639 
+
640  epics_disconnect_chid("chidGetPressure")
+
641  endif
+
642 
+
643  setdatafolder savedf
+
644 };
+
645 
+
648 static variable epics_disconnect_pyro(){
+
649  dfref savedf = GetDataFolderDFR()
+
650  setdatafolder $(package_path)
+
651 
+
652  nvar connected = pyro_connected
+
653  if (connected)
+
654  connected = 0
+
655 
+
656  epics_disconnect_chid("chidGetPyro1")
+
657  epics_disconnect_chid("chidGetPyroQ")
+
658  endif
+
659 
+
660  setdatafolder savedf
+
661 };
+
662 
+
668 variable ann_new_ramp_table(variable edit_table = defaultValue){
+
669  variable edit_table
+
670 
+
671  if (ParamIsDefault(edit_table))
+
672  edit_table = 1
+
673  endif
+
674 
+
675  dfref savedf = GetDataFolderDFR()
+
676 
+
677  make /n=3 /o minutes,cum_minutes,target_watts
+
678  make /n=3 /o target_tempA, target_tempB, target_tempPy
+
679  make /n=3 /o limit_pressure
+
680  make /n=3 /o trip_tempA, trip_tempB, trip_tempPy
+
681  make /n=3 /o trip_pressure
+
682  make /n=3 /o est_temp
+
683 
+
684  minutes = 1
+
685  cum_minutes = nan
+
686  target_watts[0] = {0, 5, 0}
+
687  target_tempA = nan
+
688  target_tempB = nan
+
689  target_tempPy = nan
+
690  limit_pressure = 1e-8
+
691  trip_tempA = nan
+
692  trip_tempB = 450
+
693  trip_tempPy = nan
+
694  trip_pressure = 5e-8
+
695  est_temp = nan
+
696 
+
697  if (edit_table)
+
698  edit /k=1 minutes, target_watts
+
699  appendtotable target_tempA, trip_tempA
+
700  appendtotable target_tempB, trip_tempB
+
701  appendtotable target_tempPy, trip_tempPy
+
702  appendtotable limit_pressure,trip_pressure
+
703  endif
+
704 
+
705  setdatafolder savedf
+
706 };
+
707 
+
712 variable ann_init_bg(){
+
713  dfref savedf = GetDataFolderDFR()
+
714  setdatafolder $(package_path)
+
715 
+
716  CtrlNamedBackground ann_ramp, period = 60, proc = PearlAnneal#ann_ramp_bg
+
717  CtrlNamedBackground ann_record, period = 600, proc = PearlAnneal#ann_record_bg
+
718 
+
719  setdatafolder savedf
+
720 };
+
721 
+
723 static variable ann_record_bg(WMBackgroundStruct* s){
+
724  STRUCT WMBackgroundStruct &s
+
725 
+
726  dfref savedf = GetDataFolderDFR()
+
727  setdatafolder $(package_path)
+
728 
+
729  nvar curGetVolts
+
730  nvar curGetAmps
+
731  nvar curGetWatts
+
732  nvar curGetOnOff
+
733  nvar curStatCC
+
734  nvar curStatCV
+
735 
+
736  nvar curGetTempA
+
737  nvar curGetTempB
+
738  nvar curGetPyro1
+
739  nvar curGetPyroQ
+
740 
+
741  nvar curGetPressure
+
742 
+
743  nvar recPoint
+
744  nvar recMinutesStart
+
745 
+
746  wave recMinutes
+
747  wave recVolts
+
748  wave recAmps
+
749  wave recWatts
+
750  wave recTemp
+
751  wave recPressure
+
752 
+
753  variable nshift = 12
+
754  variable plo
+
755  variable phi
+
756 
+
757  if (recPoint >= numpnts(recWatts))
+
758  plo = 0
+
759  phi = numpnts(recWatts) - nshift - 1
+
760  recMinutes[plo, phi] = recMinutes[p + nshift]
+
761  recVolts[plo, phi] = recVolts[p + nshift]
+
762  recAmps[plo, phi] = recAmps[p + nshift]
+
763  recWatts[plo, phi] = recWatts[p + nshift]
+
764  recTemp[plo, phi] = recTemp[p + nshift]
+
765  recPressure[plo, phi] = recPressure[p + nshift]
+
766 
+
767  plo = numpnts(recWatts) - nshift
+
768  phi = numpnts(recWatts) - 1
+
769  recMinutes[plo, phi] = nan
+
770  recVolts[plo, phi] = nan
+
771  recAmps[plo, phi] = nan
+
772  recWatts[plo, phi] = nan
+
773  recTemp[plo, phi] = nan
+
774  recPressure[plo, phi] = nan
+
775 
+
776  recPoint = plo
+
777  endif
+
778 
+
779  variable temp = curGetTempA
+
780  if (curGetPyroQ >= 625)
+
781  temp = max(temp, curGetPyroQ)
+
782  else if (curGetPyro1 >= 625)
+
783  temp = max(temp, curGetPyro1)
+
784  endif
+
785 
+
786  recMinutes[recPoint] = datetime / 60 - recMinutesStart
+
787  recVolts[recPoint] = curGetVolts
+
788  recAmps[recPoint] = curGetAmps
+
789  recWatts[recPoint] = curGetWatts
+
790  recTemp[recPoint] = temp
+
791  recPressure[recPoint] = curGetPressure
+
792 
+
793  recPoint += 1
+
794 
+
795  setdatafolder savedf
+
796  return 0
+
797 };
+
798 
+
800 static variable ann_ramp_bg(WMBackgroundStruct* s){
+
801  STRUCT WMBackgroundStruct &s
+
802 
+
803  dfref savedf = GetDataFolderDFR()
+
804  setdatafolder $(package_path)
+
805 
+
806  ann_ramp_step()
+
807 
+
808  setdatafolder savedf
+
809  return 0
+
810 };
+
811 
+
816 variable ann_ramp_step(){
+
817  dfref savedf = GetDataFolderDFR()
+
818  setdatafolder $(package_path)
+
819 
+
820  nvar minutes_start
+
821  nvar minutes_previous
+
822  nvar ramp_phase
+
823  svar ramp_message
+
824 
+
825  wave minutes
+
826  wave target_watts
+
827 
+
828  variable minutes_now = datetime / 60
+
829  variable minutes_phase = minutes_now - minutes_start
+
830  variable minutes_step = minutes_now - minutes_previous
+
831 
+
832  variable trip
+
833  variable hold
+
834  variable phase_complete
+
835 
+
836  ann_ramp_update(ramp_phase)
+
837  // check trip conditions
+
838  trip = ann_ramp_trip(ramp_phase)
+
839  if (!trip)
+
840  // check hold conditions
+
841  hold = ann_ramp_hold(ramp_phase)
+
842  if (!hold)
+
843  // check targets
+
844  phase_complete = ann_ramp_target(ramp_phase)
+
845  if (!phase_complete)
+
846  // execute step
+
847  phase_complete = ann_ramp_step_exec(minutes_now)
+
848  ramp_message = ""
+
849  endif
+
850  if (phase_complete)
+
851  ramp_phase += 1
+
852  minutes_start = minutes_now
+
853  // check end of ramp
+
854  if ((ramp_phase >= numpnts(minutes)) || (ramp_phase >= numpnts(target_watts)) || numtype(minutes[ramp_phase]) || numtype(target_watts[ramp_phase]))
+
855  ann_ramp_stop(0)
+
856  endif
+
857  endif
+
858  endif
+
859  endif
+
860 
+
861  minutes_previous = minutes_now
+
862 
+
863  setdatafolder savedf
+
864  return 0
+
865 };
+
866 
+
868 static variable ann_ramp_update(variable phase){
+
869  variable phase
+
870 
+
871  dfref savedf = GetDataFolderDFR()
+
872  setdatafolder $(package_path)
+
873 
+
874  wave minutes
+
875  wave target_watts
+
876  wave target_tempA
+
877  wave target_tempB
+
878  wave target_tempPy
+
879  wave trip_tempA
+
880  wave trip_tempB
+
881  wave trip_tempPy
+
882  wave limit_pressure
+
883  wave trip_pressure
+
884 
+
885  nvar curTargetWatts
+
886  nvar curTargetTempA
+
887  nvar curTargetTempB
+
888  nvar curTargetTempPy
+
889  nvar curTripTempA
+
890  nvar curTripTempB
+
891  nvar curTripTempPy
+
892  nvar curLimitPressure
+
893  nvar curTripPressure
+
894  nvar curPhaseMinutes
+
895 
+
896  curPhaseMinutes = minutes[phase]
+
897  curTargetWatts = target_watts[phase]
+
898  curTargetTempA = target_tempA[phase]
+
899  curTargetTempB = target_tempB[phase]
+
900  curTargetTempPy = target_tempPy[phase]
+
901  curTripTempA = trip_tempA[phase]
+
902  curTripTempB = trip_tempB[phase]
+
903  curTripTempPy = trip_tempPy[phase]
+
904  curLimitPressure = limit_pressure[phase]
+
905  curTripPressure = trip_pressure[phase]
+
906 
+
907  setdatafolder savedf
+
908 };
+
909 
+
916 static variable ann_ramp_step_exec(variable minutes_now){
+
917  variable minutes_now
+
918 
+
919  dfref savedf = GetDataFolderDFR()
+
920  setdatafolder $(package_path)
+
921 
+
922  nvar chidSetVolts
+
923  nvar chidSetAmps
+
924 
+
925  nvar curGetVolts
+
926  nvar curGetAmps
+
927  nvar curGetWatts
+
928  nvar curSetVolts
+
929  nvar curSetAmps
+
930  nvar curSetWatts
+
931 
+
932  nvar minutes_start
+
933  nvar minutes_previous
+
934  nvar ramp_phase
+
935  nvar ramp_dir
+
936 
+
937  variable p2 = ramp_phase
+
938  variable p1 = p2 - 1
+
939 
+
940  variable minutes_phase = minutes_now - minutes_start
+
941  variable minutes_step = minutes_now - minutes_previous
+
942 
+
943  wave minutes
+
944  wave target_watts
+
945 
+
946  variable step_watts
+
947  variable next_volts
+
948  variable next_amps
+
949  variable next_watts
+
950  variable resistance
+
951 
+
952  variable max_step_volts = 0.5
+
953  variable max_step_amps = 0.1
+
954  variable max_test_volts = 5.0
+
955  variable max_test_amps = 0.5
+
956 
+
957  variable watts_complete
+
958 
+
959  // calculate power step
+
960  step_watts = (target_watts[p2] - target_watts[p1]) / minutes[p2] * minutes_step
+
961  next_watts = curSetWatts + step_watts
+
962 
+
963  // check end of ramp phase
+
964  if (step_watts > 0.0001)
+
965  watts_complete = next_watts > target_watts[p2]
+
966  else if (step_watts < -0.0001)
+
967  watts_complete = next_watts < target_watts[p2]
+
968  else
+
969  watts_complete = minutes_phase >= minutes[p2]
+
970  endif
+
971 
+
972  // limit power
+
973  if (watts_complete)
+
974  next_watts = curSetWatts
+
975  else
+
976  next_watts = limit(next_watts, 0, max(target_watts[p1], target_watts[p2]))
+
977  endif
+
978 
+
979  // calculate voltage and current
+
980  if (next_watts >= 0.1)
+
981  curSetWatts = next_watts
+
982  if ((curGetVolts > 0.1) && (curGetAmps > 0.1))
+
983  resistance = curGetVolts / curGetAmps
+
984  next_volts = limit(sqrt(next_watts * resistance), 0, curGetVolts + max_step_volts)
+
985  next_amps = limit(sqrt(next_watts / resistance), 0, curGetAmps + max_step_amps)
+
986  else
+
987  // apply small voltage to measure the resistance
+
988  next_volts = min(curSetVolts + 0.5, max_test_volts)
+
989  next_amps = min(curSetAmps + 0.1, max_test_amps)
+
990  endif
+
991  else
+
992  curSetWatts = next_watts
+
993  next_volts = 0
+
994  next_amps = 0
+
995  endif
+
996 
+
997  // change setpoints
+
998  pvPutNumber /Q chidSetVolts, next_volts
+
999  pvPutNumber /Q chidSetAmps, next_amps
+
1000  pvWait 5
+
1001 
+
1002  setdatafolder savedf
+
1003  return watts_complete
+
1004 };
+
1005 
+
1011 static variable ann_ramp_trip(variable phase){
+
1012  variable phase
+
1013 
+
1014  dfref savedf = GetDataFolderDFR()
+
1015  setdatafolder $(package_path)
+
1016 
+
1017  variable trip = 0
+
1018 
+
1019  wave trip_tempA
+
1020  wave trip_tempB
+
1021  wave trip_tempPy
+
1022  wave trip_pressure
+
1023 
+
1024  nvar curGetTempA
+
1025  nvar curGetTempB
+
1026  nvar curGetTempPyro1
+
1027  nvar curGetTempPyroQ
+
1028  nvar curGetPressure
+
1029  svar ramp_message
+
1030 
+
1031  if ((phase < numpnts(trip_tempA)) && (numtype(trip_tempA[phase]) == 0) && (curGetTempA >= trip_tempA[phase]))
+
1032  ramp_message = "temperature A trip"
+
1033  trip = 1
+
1034  endif
+
1035  if ((phase < numpnts(trip_tempB)) && (numtype(trip_tempB[phase]) == 0) && (curGetTempB >= trip_tempB[phase]))
+
1036  ramp_message = "temperature B trip"
+
1037  trip = 2
+
1038  endif
+
1039  if ((phase < numpnts(trip_tempPy)) && (numtype(trip_tempPy[phase]) == 0) && (curGetTempPyro1 >= trip_tempPy[phase]))
+
1040  ramp_message = "pyrometer trip (1)"
+
1041  trip = 3
+
1042  endif
+
1043  if ((phase < numpnts(trip_tempPy)) && (numtype(trip_tempPy[phase]) == 0) && (curGetTempPyroQ >= trip_tempPy[phase]))
+
1044  ramp_message = "pyrometer trip (Q)"
+
1045  trip = 4
+
1046  endif
+
1047  if ((phase < numpnts(trip_pressure)) && (numtype(trip_pressure[phase]) == 0) && (curGetPressure >= trip_pressure[phase]))
+
1048  ramp_message = "pressure trip"
+
1049  trip = 5
+
1050  endif
+
1051 
+
1052  if (trip)
+
1053  ann_ramp_stop(1)
+
1054  endif
+
1055 
+
1056  setdatafolder savedf
+
1057  return trip
+
1058 };
+
1059 
+
1064 static variable ann_ramp_hold(variable phase){
+
1065  variable phase
+
1066 
+
1067  dfref savedf = GetDataFolderDFR()
+
1068  setdatafolder $(package_path)
+
1069 
+
1070  nvar curGetPressure
+
1071 
+
1072  variable hold = 0
+
1073 
+
1074  wave limit_pressure
+
1075 
+
1076  if ((phase < numpnts(limit_pressure)) && (numtype(limit_pressure[phase]) == 0) && (curGetPressure >= limit_pressure[phase]))
+
1077  hold = 5
+
1078  endif
+
1079 
+
1080  setdatafolder savedf
+
1081  return hold
+
1082 };
+
1083 
+
1087 static variable ann_ramp_target(variable phase){
+
1088  variable phase
+
1089 
+
1090  if (phase < 1)
+
1091  return 0
+
1092  endif
+
1093 
+
1094  dfref savedf = GetDataFolderDFR()
+
1095  setdatafolder $(package_path)
+
1096 
+
1097  variable target = 0
+
1098 
+
1099  wave target_watts
+
1100  wave target_tempA
+
1101  wave target_tempB
+
1102  wave target_tempPy
+
1103 
+
1104  variable direction_up = target_watts[phase] >= target_watts[phase - 1]
+
1105 
+
1106  nvar curGetTempA
+
1107  nvar curGetTempB
+
1108  nvar curGetTempPyro1
+
1109  nvar curGetTempPyroQ
+
1110  svar ramp_message
+
1111 
+
1112  if ((phase < numpnts(target_tempA)) && (numtype(target_tempA[phase]) == 0))
+
1113  if (direction_up)
+
1114  if (curGetTempA >= target_tempA[phase])
+
1115  target = 1
+
1116  endif
+
1117  else
+
1118  if (curGetTempA <= target_tempA[phase])
+
1119  target = 1
+
1120  endif
+
1121  endif
+
1122  endif
+
1123 
+
1124  if ((phase < numpnts(target_tempB)) && (numtype(target_tempB[phase]) == 0))
+
1125  if (direction_up)
+
1126  if (curGetTempB >= target_tempB[phase])
+
1127  target = 2
+
1128  endif
+
1129  else
+
1130  if (curGetTempB <= target_tempB[phase])
+
1131  target = 2
+
1132  endif
+
1133  endif
+
1134  endif
+
1135 
+
1136  if ((phase < numpnts(target_tempPy)) && (numtype(target_tempPy[phase]) == 0))
+
1137  if (direction_up)
+
1138  if (curGetTempPyro1 >= target_tempPy[phase])
+
1139  target = 3
+
1140  endif
+
1141  else
+
1142  if (curGetTempPyro1 <= target_tempPy[phase])
+
1143  target = 3
+
1144  endif
+
1145  endif
+
1146  endif
+
1147 
+
1148  if ((phase < numpnts(target_tempPy)) && (numtype(target_tempPy[phase]) == 0))
+
1149  if (direction_up)
+
1150  if (curGetTempPyroQ >= target_tempPy[phase])
+
1151  target = 4
+
1152  endif
+
1153  else
+
1154  if (curGetTempPyroQ <= target_tempPy[phase])
+
1155  target = 4
+
1156  endif
+
1157  endif
+
1158  endif
+
1159 
+
1160  switch(target)
+
1161  case 1:
+
1162  ramp_message = "temperature A target reached"
+
1163  break
+
1164  case 2:
+
1165  ramp_message = "temperature B target reached"
+
1166  break
+
1167  case 3:
+
1168  ramp_message = "pyrometer 1 target reached"
+
1169  break
+
1170  case 4:
+
1171  ramp_message = "pyrometer Q target reached"
+
1172  break
+
1173  endswitch
+
1174 
+
1175  setdatafolder savedf
+
1176  return target
+
1177 };
+
1178 
+
1180 variable ann_ramp_start(){
+
1181  dfref savedf = GetDataFolderDFR()
+
1182  setdatafolder $(package_path)
+
1183 
+
1184  epics_connect()
+
1185 
+
1186  nvar recPoint
+
1187  nvar recMinutesStart
+
1188  recPoint = 0
+
1189  recMinutesStart = datetime / 60
+
1190 
+
1191  wave recMinutes
+
1192  wave recVolts
+
1193  wave recAmps
+
1194  wave recWatts
+
1195  wave recTemp
+
1196  wave recPressure
+
1197 
+
1198  recMinutes = nan
+
1199  recVolts = nan
+
1200  recAmps = nan
+
1201  recWatts = nan
+
1202  recTemp = nan
+
1203  recPressure = nan
+
1204 
+
1205  nvar minutes_start
+
1206  minutes_start = datetime / 60
+
1207  nvar minutes_previous
+
1208  minutes_previous = minutes_start
+
1209  nvar ramp_phase
+
1210  ramp_phase = 1
+
1211  nvar ramp_status
+
1212  ramp_status = 1
+
1213 
+
1214  nvar chidSetVolts
+
1215  nvar chidSetAmps
+
1216  nvar chidSetOnOff
+
1217 
+
1218  wave target_watts
+
1219 
+
1220  pvPutNumber /Q chidSetVolts, 0.5
+
1221  pvPutNumber /Q chidSetAmps, 0.5
+
1222  pvPutNumber /Q chidSetOnOff, 0
+
1223  pvWait 5
+
1224 
+
1225  nvar curSetWatts
+
1226  curSetWatts = target_watts[0]
+
1227 
+
1228  ann_init_bg()
+
1229  CtrlNamedBackground ann_ramp, start
+
1230  CtrlNamedBackground ann_record, start
+
1231 
+
1232  setdatafolder savedf
+
1233  return 0
+
1234 };
+
1235 
+
1236 variable ann_ramp_pause(){
+
1237  dfref savedf = GetDataFolderDFR()
+
1238  setdatafolder $(package_path)
+
1239 
+
1240  CtrlNamedBackground ann_ramp, stop
+
1241 
+
1242  nvar ramp_status
+
1243  ramp_status = 0.5
+
1244 
+
1245  setdatafolder savedf
+
1246  return 0
+
1247 };
+
1248 
+
1249 variable ann_ramp_resume(){
+
1250  dfref savedf = GetDataFolderDFR()
+
1251  setdatafolder $(package_path)
+
1252 
+
1253  CtrlNamedBackground ann_ramp, start
+
1254 
+
1255  nvar ramp_status
+
1256  ramp_status = 1
+
1257 
+
1258  setdatafolder savedf
+
1259  return 0
+
1260 };
+
1261 
+
1266 variable ann_ramp_stop(variable reset_psu){
+
1267  variable reset_psu
+
1268 
+
1269  dfref savedf = GetDataFolderDFR()
+
1270  setdatafolder $(package_path)
+
1271 
+
1272  CtrlNamedBackground ann_ramp, stop
+
1273  CtrlNamedBackground ann_record, stop
+
1274 
+
1275  nvar ramp_phase
+
1276  ramp_phase = 0
+
1277  nvar ramp_status
+
1278  ramp_status = 0
+
1279  nvar curTargetWatts
+
1280 
+
1281  if (reset_psu || (curTargetWatts < 1))
+
1282  nvar chidSetVolts
+
1283  nvar chidSetAmps
+
1284  nvar chidSetOnOff
+
1285  pvPutNumber /Q chidSetVolts, 0
+
1286  pvPutNumber /Q chidSetAmps, 0
+
1287  pvPutNumber /Q chidSetOnOff, 1
+
1288  pvWait 5
+
1289  endif
+
1290 
+
1291  setdatafolder savedf
+
1292  return 0
+
1293 };
+
1294 
+
1295 variable ann_display_ramp(){
+
1296  dfref savedf = GetDataFolderDFR()
+
1297  setdatafolder $(package_path)
+
1298 
+
1299  wave recMinutes
+
1300  wave recVolts
+
1301  wave recAmps
+
1302  wave recWatts
+
1303  wave recTemp
+
1304  wave recPressure
+
1305 
+
1306  display recWatts vs recMinutes
+
1307  appendtograph /r recVolts vs recMinutes
+
1308  appendtograph /r recAmps vs recMinutes
+
1309 };
+
1310 
+ +
1312  PauseUpdate; Silent 1// building window...
+
1313  NewPanel /K=1 /W=(441,64,887,702) as "ramp generator"
+
1314  ValDisplay valdisp0,pos={11,178},size={233,42},bodyWidth=200,title="pyro 1"
+
1315  ValDisplay valdisp0,limits={0,1500,625},barmisc={10,50}
+
1316  ValDisplay valdisp0,value= #"root:packages:pearl_anneal:curGetPyro1"
+
1317  ValDisplay valdisp1,pos={11,233},size={233,42},bodyWidth=200,title="pyro q"
+
1318  ValDisplay valdisp1,limits={0,1500,625},barmisc={10,50}
+
1319  ValDisplay valdisp1,value= #"root:packages:pearl_anneal:curGetPyroQ"
+
1320  ValDisplay valdisp2,pos={11,73},size={234,42},bodyWidth=200,title="lake A"
+
1321  ValDisplay valdisp2,limits={0,1500,300},barmisc={10,50}
+
1322  ValDisplay valdisp2,value= #"root:packages:pearl_anneal:curGetTempA"
+
1323  ValDisplay valdisp3,pos={10,128},size={234,42},bodyWidth=200,title="lake B"
+
1324  ValDisplay valdisp3,limits={0,1500,300},barmisc={10,50}
+
1325  ValDisplay valdisp3,value= #"root:packages:pearl_anneal:curGetTempB"
+
1326  ValDisplay valdisp4,pos={16,23},size={229,42},bodyWidth=200,title="watts"
+
1327  ValDisplay valdisp4,limits={0,90,0},barmisc={10,50}
+
1328  ValDisplay valdisp4,value= #"root:packages:pearl_anneal:curGetWatts"
+
1329  ValDisplay valdisp5,pos={6,5},size={60,14},title="phase"
+
1330  ValDisplay valdisp5,limits={0,0,0},barmisc={0,1000}
+
1331  ValDisplay valdisp5,value= #"root:packages:pearl_anneal:ramp_phase"
+
1332  ValDisplay valdisp6,pos={0,282},size={244,42},bodyWidth=200,title="pressure"
+
1333  ValDisplay valdisp6,format="%.1e",limits={1e-09,1e-08,0},barmisc={10,80}
+
1334  ValDisplay valdisp6,value= #"root:packages:pearl_anneal:curGetPressure"
+
1335  ValDisplay valdisp7,pos={335,90},size={47,14},bodyWidth=14,title="power"
+
1336  ValDisplay valdisp7,limits={0,1,0.5},barmisc={0,0},mode= 2,highColor= (60928,60928,60928),lowColor= (0,52224,0),zeroColor= (61440,61440,61440)
+
1337  ValDisplay valdisp7,value= #"root:packages:pearl_anneal:curGetOnOff"
+
1338  ValDisplay valdisp16,pos={262,168},size={114,14},bodyWidth=34,title="target temp pyro"
+
1339  ValDisplay valdisp16,limits={0,0,0},barmisc={0,1000},mode= 2,highColor= (60928,60928,60928),lowColor= (65280,0,0),zeroColor= (0,52224,0)
+
1340  ValDisplay valdisp16,value= #"root:packages:pearl_anneal:curTargetTempPy"
+
1341  ValDisplay valdisp17,pos={300,4},size={80,14},bodyWidth=14,title="power supply"
+
1342  ValDisplay valdisp17,limits={0,1,0.5},barmisc={0,0},mode= 2,highColor= (0,52224,0),lowColor= (65280,0,0),zeroColor= (61440,61440,61440)
+
1343  ValDisplay valdisp17,value= #"root:packages:pearl_anneal:psu_connected"
+
1344  ValDisplay valdisp18,pos={317,21},size={64,14},bodyWidth=14,title="lakeshore"
+
1345  ValDisplay valdisp18,limits={0,1,0.5},barmisc={0,0},mode= 2,highColor= (0,52224,0),lowColor= (65280,0,0),zeroColor= (61440,61440,61440)
+
1346  ValDisplay valdisp18,value= #"root:packages:pearl_anneal:ls_connected"
+
1347  ValDisplay valdisp19,pos={318,38},size={64,14},bodyWidth=14,title="pyrometer"
+
1348  ValDisplay valdisp19,limits={0,1,0.5},barmisc={0,0},mode= 2,highColor= (0,52224,0),lowColor= (65280,0,0),zeroColor= (61440,61440,61440)
+
1349  ValDisplay valdisp19,value= #"root:packages:pearl_anneal:pyro_connected"
+
1350  ValDisplay valdisp20,pos={293,52},size={91,14},bodyWidth=14,title="vacuum system"
+
1351  ValDisplay valdisp20,limits={0,1,0.5},barmisc={0,0},mode= 2,highColor= (0,52224,0),lowColor= (65280,0,0),zeroColor= (61440,61440,61440)
+
1352  ValDisplay valdisp20,value= #"root:packages:pearl_anneal:vac_connected"
+
1353  ValDisplay valdisp21,pos={341,76},size={41,14},bodyWidth=14,title="ramp"
+
1354  ValDisplay valdisp21,limits={0,1,0.5},barmisc={0,0},mode= 2,highColor= (0,52224,0),lowColor= (61440,61440,61440),zeroColor= (0,34816,52224)
+
1355  ValDisplay valdisp21,value= #"root:packages:pearl_anneal:ramp_status"
+
1356  ValDisplay valdisp8,pos={278,120},size={100,14},title="target watts"
+
1357  ValDisplay valdisp8,limits={0,0,0},barmisc={0,1000}
+
1358  ValDisplay valdisp8,value= #"root:packages:pearl_anneal:curTargetWatts"
+
1359  ValDisplay valdisp9,pos={278,137},size={100,14},title="target temp A"
+
1360  ValDisplay valdisp9,limits={0,0,0},barmisc={0,1000}
+
1361  ValDisplay valdisp9,value= #"root:packages:pearl_anneal:curTargetTempA"
+
1362  ValDisplay valdisp10,pos={278,152},size={100,14},title="target temp B"
+
1363  ValDisplay valdisp10,limits={0,0,0},barmisc={0,1000}
+
1364  ValDisplay valdisp10,value= #"root:packages:pearl_anneal:curTargetTempB"
+
1365  ValDisplay valdisp11,pos={271,266},size={100,14},title="limit pressure"
+
1366  ValDisplay valdisp11,limits={0,0,0},barmisc={0,1000}
+
1367  ValDisplay valdisp11,value= #"root:packages:pearl_anneal:curLimitPressure"
+
1368  ValDisplay valdisp12,pos={261,205},size={100,14},title="trip temp A"
+
1369  ValDisplay valdisp12,limits={0,0,0},barmisc={0,1000}
+
1370  ValDisplay valdisp12,value= #"root:packages:pearl_anneal:curTripTempA"
+
1371  ValDisplay valdisp13,pos={262,224},size={100,14},title="trip temp B"
+
1372  ValDisplay valdisp13,limits={0,0,0},barmisc={0,1000}
+
1373  ValDisplay valdisp13,value= #"root:packages:pearl_anneal:curTripTempB"
+
1374  ValDisplay valdisp14,pos={276,242},size={100,14},title="trip pyro"
+
1375  ValDisplay valdisp14,limits={0,0,0},barmisc={0,1000}
+
1376  ValDisplay valdisp14,value= #"root:packages:pearl_anneal:curTripTempPy"
+
1377  ValDisplay valdisp15,pos={273,309},size={100,14},title="ramp interval"
+
1378  ValDisplay valdisp15,limits={0,0,0},barmisc={0,1000}
+
1379  ValDisplay valdisp15,value= #"root:packages:pearl_anneal:curPhaseMinutes"
+
1380  Button b_start,pos={15,362},size={50,20},proc=PearlAnneal#bp_ramp_start,title="start"
+
1381  Button b_start,fColor=(0,52224,0)
+
1382  Button b_pause,pos={75,362},size={50,20},proc=PearlAnneal#bp_ramp_pause,title="pause"
+
1383  Button b_stop,pos={135,362},size={50,20},proc=PearlAnneal#bp_ramp_stop,title="stop"
+
1384  Button b_stop,fColor=(52224,0,0)
+
1385  Button b_edit,pos={195,362},size={50,20},proc=PearlAnneal#bp_ramp_edit,title="edit"
+
1386  ValDisplay valdisp11_1,pos={274,282},size={100,14},title="trip pressure"
+
1387  ValDisplay valdisp11_1,limits={0,0,0},barmisc={0,1000}
+
1388  ValDisplay valdisp11_1,value= #"root:packages:pearl_anneal:curTripPressure"
+
1389  TitleBox title0,pos={16,334},size={400,20}
+
1390  TitleBox title0,variable= root:packages:pearl_anneal:ramp_message,fixedSize=1
+
1391  DefineGuide UGH0={FT,390}
+
1392  String fldrSav0= GetDataFolder(1)
+
1393  SetDataFolder root:packages:pearl_anneal:
+
1394  Display/W=(82,153,246,462)/FG=(FL,UGH0,FR,FB)/HOST=# recTemp vs recMinutes
+
1395  AppendToGraph/R recPressure vs recMinutes
+
1396  AppendToGraph/L=power recWatts vs recMinutes
+
1397  NewFreeAxis/O/L power
+
1398  SetDataFolder fldrSav0
+
1399  ModifyGraph margin(left)=80
+
1400  ModifyGraph rgb(recPressure)=(0,0,65280),rgb(recWatts)=(0,39168,0)
+
1401  ModifyGraph log(right)=1
+
1402  ModifyGraph mirror(bottom)=2
+
1403  ModifyGraph nticks=3
+
1404  ModifyGraph minor=1
+
1405  ModifyGraph axThick=0.5
+
1406  ModifyGraph axRGB(left)=(65280,0,0),axRGB(right)=(0,0,65280),axRGB(power)=(0,39168,0)
+
1407  ModifyGraph tlblRGB(left)=(65280,0,0),tlblRGB(right)=(0,0,65280),tlblRGB(power)=(0,39168,0)
+
1408  ModifyGraph alblRGB(left)=(65280,0,0),alblRGB(right)=(0,0,65280),alblRGB(power)=(0,39168,0)
+
1409  ModifyGraph lblPos(left)=42,lblPos(power)=35
+
1410  ModifyGraph lblLatPos(left)=1
+
1411  ModifyGraph btLen=4
+
1412  ModifyGraph freePos(power)=48
+
1413  Label left "temperature (K)"
+
1414  Label bottom "time (minutes)"
+
1415  Label right "pressure (mbar)"
+
1416  Label power "power (W)"
+
1417  SetAxis/E=1 power 0,80
+
1418  RenameWindow #,G0
+
1419  SetActiveSubwindow ##
+
1420 };
+
1421 
+
1422 static variable bp_ramp_start(WMButtonAction* ba){
+
1423  struct WMButtonAction &ba
+
1424 
+
1425  switch( ba.eventCode )
+
1426  case 2:// mouse up
+
1427  dfref ann_df = $(package_path)
+
1428  nvar /sdfr=ann_df ramp_status
+
1429  if (ramp_status < 0.4)
+
1430  ann_ramp_start()
+
1431  endif
+
1432  break
+
1433  case -1:// control being killed
+
1434  break
+
1435  endswitch
+
1436 
+
1437  return 0
+
1438 };
+
1439 
+
1440 static variable bp_ramp_pause(WMButtonAction* ba){
+
1441  struct WMButtonAction &ba
+
1442 
+
1443  switch( ba.eventCode )
+
1444  case 2:// mouse up
+
1445  dfref ann_df = $(package_path)
+
1446  nvar /sdfr=ann_df ramp_status
+
1447  if (ramp_status > 0.6)
+
1448  ann_ramp_pause()
+
1449  Button b_pause, win=$(ba.win), title="resume"
+
1450  else
+
1451  ann_ramp_resume()
+
1452  Button b_pause, win=$(ba.win), title="pause"
+
1453  endif
+
1454  break
+
1455  case -1:// control being killed
+
1456  break
+
1457  endswitch
+
1458 
+
1459  return 0
+
1460 };
+
1461 
+
1462 static variable bp_ramp_stop(WMButtonAction* ba){
+
1463  struct WMButtonAction &ba
+
1464 
+
1465  switch( ba.eventCode )
+
1466  case 2:// mouse up
+
1467  ann_ramp_stop(1)
+
1468  break
+
1469  case -1:// control being killed
+
1470  break
+
1471  endswitch
+
1472 
+
1473  return 0
+
1474 };
+
1475 
+
1476 static variable bp_ramp_edit(WMButtonAction* ba){
+
1477  struct WMButtonAction &ba
+
1478 
+
1479  dfref savedf = GetDataFolderDFR()
+
1480  switch( ba.eventCode )
+
1481  case 2:// mouse up
+
1482  setdatafolder $(package_path)
+
1483 
+
1484  wave minutes
+
1485  wave target_watts
+
1486  wave target_tempA
+
1487  wave target_tempB
+
1488  wave target_tempPy
+
1489  wave trip_tempA
+
1490  wave trip_tempB
+
1491  wave trip_tempPy
+
1492  wave limit_pressure
+
1493  wave trip_pressure
+
1494 
+
1495  edit /k=1 minutes, target_watts
+
1496  appendtotable target_tempA, trip_tempA
+
1497  appendtotable target_tempB, trip_tempB
+
1498  appendtotable target_tempPy, trip_tempPy
+
1499  appendtotable limit_pressure,trip_pressure
+
1500 
+
1501  break
+
1502  case -1:// control being killed
+
1503  break
+
1504  endswitch
+
1505 
+
1506  setdatafolder savedf
+
1507  return 0
+
1508 };
+
1509 
+
static variable ann_record_bg(WMBackgroundStruct *s)
background task of the recorder
+
static const string prefs_objects
+
static variable load_prefs()
+
variable ann_init_bg()
initialize the background tasks
+
void panel_ramp_gen()
+
static variable ann_ramp_bg(WMBackgroundStruct *s)
background task of the ramp
+
static variable save_ramp()
save current ramp table
+
static variable epics_disconnect()
disconnect from all EPICS devices.
+
static const string package_path
+
variable ann_new_ramp_table(variable edit_table=defaultValue)
create a new ramp table and open it in a table window.
+
static variable ann_ramp_target(variable phase)
check target conditions
+
static variable ann_ramp_hold(variable phase)
check hold conditions
+
static variable ann_ramp_update(variable phase)
update control panel variables
+
variable ann_ramp_pause()
+
static variable epics_connect_vac()
connect to the vacuum gauge
+
static variable epics_disconnect_psu()
disconnect from the power supply unit
+
static variable epics_connect_psu()
connect to the power supply unit
+
variable ann_display_ramp()
+
static variable epics_connect_ls()
connect to the lakeshore temperature controller
+
static variable epics_connect_pyro()
connect to the pyrometer
+
static variable epics_disconnect_vac()
disconnect from the vacuum gauge
+
variable ann_ramp_step()
prepare and execute the next ramp step
+
ramp generator for sample annealing
+
static const string package_name
+
static variable AfterCompiledHook()
+
static variable save_prefs()
+
static variable init_package()
initialize the package data folder
+
static variable bp_ramp_start(WMButtonAction *ba)
+
variable ann_ramp_start()
start an annealing ramp
+
static variable ann_ramp_step_exec(variable minutes_now)
execute the next ramp step
+
static variable bp_ramp_pause(WMButtonAction *ba)
+
static variable epics_disconnect_ls()
disconnect from the lakeshore controller
+
static variable ann_ramp_trip(variable phase)
check trip conditions
+
static variable epics_connect()
connect to all required EPICS devices.
+
static variable bp_ramp_stop(WMButtonAction *ba)
+
static variable IgorQuitHook(string app)
Igor sometimes crashes if the PVs are not disconnected when it quits.
+
variable ann_ramp_resume()
+
static variable epics_disconnect_pyro()
disconnect from the pyrometer
+
variable ann_ramp_stop(variable reset_psu)
stop a running annealing ramp
+
static variable epics_disconnect_chid(string chid_var_name)
+
static variable bp_ramp_edit(WMButtonAction *ba)
+
+
+ + + + diff --git a/doc/html/pearl-area-display_8ipf.html b/doc/html/pearl-area-display_8ipf.html new file mode 100644 index 0000000..84fee62 --- /dev/null +++ b/doc/html/pearl-area-display_8ipf.html @@ -0,0 +1,1604 @@ + + + + + + +PEARL Procedures: pearl-area-display.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-area-display.ipf File Reference
+
+
+ +

visualization tools for 2D and 3D data. +More...

+ +

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlAreaDisplay
 instant visualization of angle scan and manipulator position.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

static string graphname_from_dfref (dfref df, string prefix)
 compose a valid and unique graph name from a data folder reference More...
 
string ad_display (wave image)
 open a new graph window with a 2D image. More...
 
string ad_display_histogram (wave image)
 display the histogram of a 2D image. More...
 
string ad_display_profiles (wave image, string filter=defaultValue)
 open a new profiles graph window. More...
 
variable ad_update_profiles (wave image)
 update a profiles graph with new data. More...
 
variable ad_profiles_cursor_mode (wave image, variable mode)
 switch cursors on a profiles graph More...
 
variable ad_profiles_set_cursor (wave image, string cursorname, variable xa, variable ya, variable pscale=defaultValue)
 move a cursor to the specified position in a profiles graph. More...
 
variable ad_profiles_crosshairs (wave image, variable clear=defaultValue)
 draw permanent crosshairs in a profiles graph. More...
 
static wave get_source_image (wave view)
 find the source image wave corresponding to the given view. More...
 
static dfr make_view_folder (wave source)
 create a view data folder. More...
 
static dfr get_view_folder (wave source)
 find the view data folder corresponding to the given source. More...
 
static wave get_view_image (wave source)
 find the view image wave corresponding to the given source. More...
 
static variable bp_reset_cursors (WMButtonAction *ba)
 
static variable svp_smoothing (WMSetVariableAction *sva)
 
static variable pmp_export (WMPopupAction *pa)
 
variable ad_profiles_hook (WMWinHookStruct *s)
 hook function for user events in the profiles window. More...
 
variable ad_calc_cursor_profiles (wave image)
 calculate profiles, statistics, and histogram of a cross-hair delimited region of interest. More...
 
variable ad_calc_profiles (wave image, variable pa, variable qa, variable pb, variable qb)
 calculate profiles, statistics, and histogram of a rectangular region of interest. More...
 
variable ad_export_profile (wave view_image, variable dim, variable trace=defaultValue, variable show=defaultValue, variable overwrite=defaultValue)
 export a profile from a profiles graph to the source data folder. More...
 
static variable set_trace_colors (string graphname)
 
variable ad_calc_histogram (wave image)
 calculate the histogram. More...
 
variable ad_default_image_filter (wave image, string options)
 abstract filter function for image display. More...
 
variable ad_box_filter (wave image, string options)
 boxcar smoothing filter. More...
 
variable ad_transpose_filter (wave image, string options)
 transpose image filter. More...
 
string ad_display_brick (wave data)
 open a new "gizmo" window with three-dimensional data. More...
 
variable ad_brick_slicer (wave data)
 open a slicer panel for 3D data. More...
 
string ad_display_slice (wave data)
 display three-dimensional data by 2D slice. More...
 
static variable update_slice_info ()
 update controls with data scale limits. More...
 
variable ad_gizmo_set_plane (wave brick, variable dim, variable value)
 set the position of a slicing plane of a 3D brick in a Gizmo window. More...
 
variable ad_profiles_set_slice (wave brick, variable dim, variable value)
 set the position of the slicing plane of a 3D brick in a profiles window. More...
 
static variable slp_slice_position (WMSliderAction *sa)
 
static variable svp_slice_position (WMSetVariableAction *sva)
 set slice coordinate (button procedure). More...
 
static variable bp_move_slice (WMButtonAction *ba)
 move slice (button procedure). More...
 
static variable bp_extract_slice (WMButtonAction *ba)
 export a slice (button procedure). More...
 
static variable bp_move_slice_center (wave brick, variable dim, string posvariable)
 move the slice to the center of the dimension (button procedure). More...
 
static variable ad_slicer_move_bg (WMBackgroundStruct *s)
 move a slice by one step (background task). More...
 
variable ad_slicer_init_bg ()
 initialize the slice animation background task. More...
 
variable ad_slicer_start_bg (wave brick, variable dimension, string posvariable, variable delta)
 start the animation. More...
 
variable ad_slicer_stop_bg (string posvariable)
 stop the animation. More...
 
+

Detailed Description

+

visualization tools for 2D and 3D data.

+

these tools were initially developed for monitoring output from EPICS area detector software. they are, however, useful for any kind of intensity versus x,y(,z) data.

+

+2D data

+

TO DO...

+

+3D data

+ +

Definition in file pearl-area-display.ipf.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ad_box_filter (wave image,
string options 
)
+
+ +

boxcar smoothing filter.

+

filters the image in X and Y directions using Igor's Smooth operation.

+
Parameters
+ + + +
imageimage to be filtered: original data and filter result.
optionssmoothing factors in key1=value1;key2=value2;... format.
    +
  • SmoothingX
  • +
  • SmoothingY
  • +
+
+
+
+ +

Definition at line 1044 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_brick_slicer (wave data)
+
+ +

open a slicer panel for 3D data.

+

if a panel exists, bring it to the front.

+
Parameters
+ + +
datathree-dimensional wave.
+
+
+ +

Definition at line 1197 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_calc_cursor_profiles (wave image)
+
+ +

calculate profiles, statistics, and histogram of a cross-hair delimited region of interest.

+
Parameters
+ + +
imagewave which contains the image data from the detector.
+
+
+

the function expects further objects as created by ad_display_profiles() in the same data folder as the image wave. the most recent profiles graph of the image must exist, and the cursors A and B must be set on the image.

+ +

Definition at line 726 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_calc_histogram (wave image)
+
+ +

calculate the histogram.

+
Parameters
+ + +
imagewave which contains the image data from the detector. the function expects further objects as created by ad_display_histogram() in the same data folder as the image wave.
+
+
+ +

Definition at line 1007 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_calc_profiles (wave image,
variable pa,
variable qa,
variable pb,
variable qb 
)
+
+ +

calculate profiles, statistics, and histogram of a rectangular region of interest.

+

the region of interest a rectangle spanned by the two points A and B. pixels at these coordinates are included.

+
Parameters
+ + + + + + +
imagewave which contains the image data.
pafirst point coordinate of A.
qasecond point coordinate of A.
pbfirst point coordinate of B.
qbsecond point coordinate of B.
+
+
+

the function expects further objects as created by ad_display_profiles() in the same data folder as the image wave.

+

this function does not require that the graph exists as long as the data folder is complete.

+ +

Definition at line 773 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ad_default_image_filter (wave image,
string options 
)
+
+ +

abstract filter function for image display.

+

this is a function prototype for filtering two-dimensional data for preview. to write your own filter, define a new function which has the same signature.

+
Parameters
+ + + +
imageimage to be filtered: original data and filter result.
optionsfilter options in key1=value1;key2=value2;... format.
+
+
+
Returns
the result must be written to the incoming image wave.
+ +

Definition at line 1030 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string ad_display (wave image)
+
+ +

open a new graph window with a 2D image.

+

this is essentially display; appendimage. the graph is directly linked to the image wave. it is, thus, updated automatically.

+
Parameters
+ + +
imagewave which contains the image data.
+
+
+
Returns
(string) name of the graph window
+ +

Definition at line 84 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string ad_display_brick (wave data)
+
+ +

open a new "gizmo" window with three-dimensional data.

+
Parameters
+ + +
datathree-dimensional wave.
+
+
+
Returns
name of the gizmo window.
+ +

Definition at line 1082 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string ad_display_histogram (wave image)
+
+ +

display the histogram of a 2D image.

+

the function will create additional objects in the same data folder as the image. this objects are displayed in the graph and are updated by calling ad_calc_profiles(). see the code.

+
Parameters
+ + +
imagewave which contains the image data from the detector.
+
+
+
Returns
(string) name of the graph window
+ +

Definition at line 114 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string ad_display_profiles (wave image,
string filter = defaultValue 
)
+
+ +

open a new profiles graph window.

+

opens an extended graph window with profiles for the specified image. the function copies/creates all necessary data structures in a subfolder of the one which contains the image wave. the data folder name is derived from the image wave name by prefixing with "view_". there can be at most one profiles window of each image wave. the original wave must not be renamed while the graph window is used. to update the graph after modifying the original wave, call ad_update_profiles().

+
Parameters
+ + + +
imagewave which contains the image data.
filtername of a filter function which maps the original data to the displayed data. the function must have the same parameters as ad_default_image_filter(). default: boxcar average (ad_box_filter()) using parameters view_filter_smoothing_x and _y.
+
+
+
Returns
name of the graph window
+ +

Definition at line 165 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string ad_display_slice (wave data)
+
+ +

display three-dimensional data by 2D slice.

+

to select the slice data to display, call ad_profiles_set_slice(), or open a ad_brick_slicer() panel. do not modify the content of the created view_ data folder.

+
Parameters
+ + +
datathree-dimensional wave.
+
+
+
Returns
name of the graph window.
+ +

Definition at line 1345 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_export_profile (wave view_image,
variable dim,
variable trace = defaultValue,
variable show = defaultValue,
variable overwrite = defaultValue 
)
+
+ +

export a profile from a profiles graph to the source data folder.

+

this function does not require that the show exists as long as the view data folder is complete.

+
Parameters
+ + + + + + +
view_imagewave which contains the view image (image wave on display in profiles window). the function expects further objects as created by ad_display_profiles() in the same data folder as the view_image wave.
dimdimension index (0 = x, 1 = y).
traceselect profile trace:
    +
  • 0 = cursor A
  • +
  • 1 = cursor B
  • +
  • 2 = average between cursors (default)
  • +
+
showdisplay mode:
    +
  • 0 = do not show (default)
  • +
  • 1 = display in new graph, or append to existing graph
  • +
  • 2 = collate: common graph for all profiles of a dimension. rename graph manually to detach it from future additions.
  • +
+
overwriteoverwrite mode:
    +
  • 0 = create new wave (default). wave name may get a suffix to be unique.
  • +
  • 1 = overwrite existing wave
  • +
+
+
+
+ +

Definition at line 875 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_gizmo_set_plane (wave brick,
variable dim,
variable value 
)
+
+ +

set the position of a slicing plane of a 3D brick in a Gizmo window.

+
Parameters
+ + + + +
brickoriginal data wave.
dimdimension index: 0, 1, or 2.
valuenew coordinate of the slicing plane (axis scaling).
+
+
+
Returns
0 if successful, non-zero otherwise
+ +

Definition at line 1422 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ad_profiles_crosshairs (wave image,
variable clear = defaultValue 
)
+
+ +

draw permanent crosshairs in a profiles graph.

+

adds dash-dotted horizontal and vertical crosshairs to a profiles graph. for each active cursor A and/or B, a pair of lines crossing at the cursor position is added. existing crosshairs are moved to the current cursor positions. optionally, existing crosshairs are removed from the graph.

+

in contrast to the cursors, these crosshairs will be exported and printed with the graph. they are drawn using Igor's DrawLine operation. all lines drawn by this function are part of the "crosshairs" draw group.

Parameters
+ + + +
imageimage displayed in the graph. this is the original image, not the one in the view data folder.
clear0 (default) = add/update lines. 1 = remove lines.
+
+
+ +

Definition at line 481 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ad_profiles_cursor_mode (wave image,
variable mode 
)
+
+ +

switch cursors on a profiles graph

+

the standard cursors allow to select the profiles to display in the profiles panes. additional cursors are shown in the profiles panes.

+

in the background selection mode, additional cursors allow the user to select the limits of the background and peak integration regions. the meaning of the cursors depends on the particular processing function.

+
Parameters
+ + + +
modecursor mode.
    +
  • 0 (default) standard profile selection. cursors C-F on profile panes.
  • +
  • 1 background selection. cursors A-F on image.
  • +
+
imageimage displayed in the graph. this is the original image, not the one in the view data folder.
+
+
+ +

Definition at line 368 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_profiles_hook (WMWinHookStruct * s)
+
+ +

hook function for user events in the profiles window.

+ +

Definition at line 686 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_profiles_set_cursor (wave image,
string cursorname,
variable xa,
variable ya,
variable pscale = defaultValue 
)
+
+ +

move a cursor to the specified position in a profiles graph.

+

this function can only set cursors in the image part of the profiles graph.

+
Parameters
+ + + + + + +
imageimage displayed in the graph. this is the original image, not the one in the view data folder.
cursornamename of the cursor, e.g. "A" or "B". other cursors are allowed but need to be activated separately.
xax-coordinate to move the cursor to. the position is coerced to the image scale. +/-inf is allowed.
yay-coordinate to move the cursor to. the position is coerced to the image scale. +/-inf is allowed.
pscalescaling of the position argument
    +
  • 0 (default) wave scaling
  • +
  • 1 point scaling
  • +
+
+
+
+ +

Definition at line 429 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_profiles_set_slice (wave brick,
variable dim,
variable value 
)
+
+ +

set the position of the slicing plane of a 3D brick in a profiles window.

+
Parameters
+ + + + +
brickoriginal data wave.
dimdimension index: 0, 1, or 2.
valuenew coordinate of the slicing plane (axis scaling).
+
+
+
Returns
0 if successful, non-zero otherwise
+ +

Definition at line 1458 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ad_slicer_init_bg ()
+
+ +

initialize the slice animation background task.

+ +

Definition at line 1704 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable ad_slicer_move_bg (WMBackgroundStruct * s)
+
+static
+
+ +

move a slice by one step (background task).

+ +

Definition at line 1665 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_slicer_start_bg (wave brick,
variable dimension,
string posvariable,
variable delta 
)
+
+ +

start the animation.

+
Parameters
+ + + + + +
brick3D data wave
dimensiondimension to animate, 0, 1, or 2.
posvariablefull path to the global position variable.
deltastep increment, should be +/- dimdelta.
+
+
+ +

Definition at line 1728 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_slicer_stop_bg (string posvariable)
+
+ +

stop the animation.

+
Parameters
+ + +
posvariablefull path to the global position variable.
+
+
+ +

Definition at line 1770 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ad_transpose_filter (wave image,
string options 
)
+
+ +

transpose image filter.

+

transposes the image.

+
Parameters
+ + + +
imageimage to be transposed: original data and result.
optionsnot used. should be empty.
+
+
+ +

Definition at line 1066 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_update_profiles (wave image)
+
+ +

update a profiles graph with new data.

+
Parameters
+ + +
imagewave which contains the image data. must be the same (by data folder and name) wave used with ad_display_profiles().
+
+
+ +

Definition at line 321 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_extract_slice (WMButtonAction * ba)
+
+static
+
+ +

export a slice (button procedure).

+

extract a slice and saves it in a separate wave.

+ +

Definition at line 1599 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_move_slice (WMButtonAction * ba)
+
+static
+
+ +

move slice (button procedure).

+ +

Definition at line 1554 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static variable bp_move_slice_center (wave brick,
variable dim,
string posvariable 
)
+
+static
+
+ +

move the slice to the center of the dimension (button procedure).

+ +

Definition at line 1653 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_reset_cursors (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 618 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave get_source_image (wave view)
+
+static
+
+ +

find the source image wave corresponding to the given view.

+
Returns
wave reference of the original data wave. the reference may be invalid if the source wave cannot be found.
+ +

Definition at line 547 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static dfr get_view_folder (wave source)
+
+static
+
+ +

find the view data folder corresponding to the given source.

+

the result data folder reference may be invalid if no view is currently open. use the built-in DataFolderRefStatus function to check for validity.

+
Parameters
+ + +
sourcewave which contains the image data. must be the same (by data folder and name) wave used with ad_display_profiles().
+
+
+ +

Definition at line 585 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave get_view_image (wave source)
+
+static
+
+ +

find the view image wave corresponding to the given source.

+
Parameters
+ + +
sourcewave which contains the image data. must be the same (by data folder and name) wave used with ad_display_profiles().
+
+
+ +

Definition at line 608 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string graphname_from_dfref (dfref df,
string prefix 
)
+
+static
+
+ +

compose a valid and unique graph name from a data folder reference

+ +

Definition at line 56 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static dfr make_view_folder (wave source)
+
+static
+
+ +

create a view data folder.

+ +

Definition at line 561 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pmp_export (WMPopupAction * pa)
+
+static
+
+ +

Definition at line 662 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable set_trace_colors (string graphname)
+
+static
+
+ +

Definition at line 986 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable slp_slice_position (WMSliderAction * sa)
+
+static
+
+ +

Definition at line 1498 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable svp_slice_position (WMSetVariableAction * sva)
+
+static
+
+ +

set slice coordinate (button procedure).

+ +

Definition at line 1526 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable svp_smoothing (WMSetVariableAction * sva)
+
+static
+
+ +

Definition at line 637 of file pearl-area-display.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable update_slice_info ()
+
+static
+
+ +

update controls with data scale limits.

+

current folder must be slicer info

+ +

Definition at line 1386 of file pearl-area-display.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-area-display_8ipf.js b/doc/html/pearl-area-display_8ipf.js new file mode 100644 index 0000000..c5d335c --- /dev/null +++ b/doc/html/pearl-area-display_8ipf.js @@ -0,0 +1,42 @@ +var pearl_area_display_8ipf = +[ + [ "ad_box_filter", "pearl-area-display_8ipf.html#a27f0957d61f3c2d30a4854911b460c36", null ], + [ "ad_brick_slicer", "pearl-area-display_8ipf.html#ae3b4756cdc12a4a4b15a770ba0069823", null ], + [ "ad_calc_cursor_profiles", "pearl-area-display_8ipf.html#a72b57037abd27f65986034c0b4cc191e", null ], + [ "ad_calc_histogram", "pearl-area-display_8ipf.html#a48b08ab53729d9d0477deaceedef2769", null ], + [ "ad_calc_profiles", "pearl-area-display_8ipf.html#a48044f9ee518d47770e33ee9f381f204", null ], + [ "ad_default_image_filter", "pearl-area-display_8ipf.html#a6418a1b2d18b82cb71c0fecbd513a934", null ], + [ "ad_display", "pearl-area-display_8ipf.html#ae2b11295d2715e9af019513923c64570", null ], + [ "ad_display_brick", "pearl-area-display_8ipf.html#a65b07e355df20cfb692dfb32f472b478", null ], + [ "ad_display_histogram", "pearl-area-display_8ipf.html#a8cc3ea3bea4e851e4144140a2da42a03", null ], + [ "ad_display_profiles", "pearl-area-display_8ipf.html#a8fad5aebaca72887d5898b4c421bcdae", null ], + [ "ad_display_slice", "pearl-area-display_8ipf.html#af8d5e003fcff1f750685ed6f94717730", null ], + [ "ad_export_profile", "pearl-area-display_8ipf.html#ad3e190d1ec1b82ebef00c9f9ac44b50a", null ], + [ "ad_gizmo_set_plane", "pearl-area-display_8ipf.html#aee051acfe6a3c8214118b78dfe4854fd", null ], + [ "ad_profiles_crosshairs", "pearl-area-display_8ipf.html#a6d20a8c6bf5ed143d375dee71fb3a6d5", null ], + [ "ad_profiles_cursor_mode", "pearl-area-display_8ipf.html#a5657fc4dcd395aef637c19e8df57a418", null ], + [ "ad_profiles_hook", "pearl-area-display_8ipf.html#a89a5e3e29a0cd09951dcdf13aa28d941", null ], + [ "ad_profiles_set_cursor", "pearl-area-display_8ipf.html#ad2a84495ddac89bc8f4203fca56babfd", null ], + [ "ad_profiles_set_slice", "pearl-area-display_8ipf.html#abaf229d75d9d579a559295795a6bc2e1", null ], + [ "ad_slicer_init_bg", "pearl-area-display_8ipf.html#a7334815c60e2c11e2754c07489a62f4b", null ], + [ "ad_slicer_move_bg", "pearl-area-display_8ipf.html#a4af98ec7af48a653c6fac716ea8fa505", null ], + [ "ad_slicer_start_bg", "pearl-area-display_8ipf.html#ad79b37ab4fcf2cbdad6874813d93d4b1", null ], + [ "ad_slicer_stop_bg", "pearl-area-display_8ipf.html#a77a71985e716a300e0b61c233cd93f40", null ], + [ "ad_transpose_filter", "pearl-area-display_8ipf.html#a8411f0cfec3515f1ae4f0140efc14318", null ], + [ "ad_update_profiles", "pearl-area-display_8ipf.html#afa2546f9cb03dfa8bf0cc9966f0b7a45", null ], + [ "bp_extract_slice", "pearl-area-display_8ipf.html#a31461b664ec651a39442e9a46ffd88c9", null ], + [ "bp_move_slice", "pearl-area-display_8ipf.html#ab8c9979c6f3ab95f983c2a525a69c035", null ], + [ "bp_move_slice_center", "pearl-area-display_8ipf.html#abe702d40071e3c5e662eb8d47dd6d885", null ], + [ "bp_reset_cursors", "pearl-area-display_8ipf.html#a24b17f99fafd8043ed3e4502000da316", null ], + [ "get_source_image", "pearl-area-display_8ipf.html#a4b76a98582f5997d3810f969dbb6c4ed", null ], + [ "get_view_folder", "pearl-area-display_8ipf.html#a1bf20e37ed3e9c76be8ebe448c68a048", null ], + [ "get_view_image", "pearl-area-display_8ipf.html#a6cc0970b41ca197fa47263556fa2686a", null ], + [ "graphname_from_dfref", "pearl-area-display_8ipf.html#a195b12857685c4e535a840c5db324b4a", null ], + [ "make_view_folder", "pearl-area-display_8ipf.html#a2b183a27ec795b0ec1f8efabe3068369", null ], + [ "pmp_export", "pearl-area-display_8ipf.html#ac5c7a25e9a8c0b001a429bae23639da9", null ], + [ "set_trace_colors", "pearl-area-display_8ipf.html#abafc4f012b04592724109f4757cbe271", null ], + [ "slp_slice_position", "pearl-area-display_8ipf.html#ace169e0824e6bddbd646972946edccbe", null ], + [ "svp_slice_position", "pearl-area-display_8ipf.html#a174177742fdce7f37027de8fa832b3bd", null ], + [ "svp_smoothing", "pearl-area-display_8ipf.html#ab10a0d94991b9cd958557dbc48d70624", null ], + [ "update_slice_info", "pearl-area-display_8ipf.html#a2442bc044aaa12ab817a5f9fa300d1f8", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-area-display_8ipf_source.html b/doc/html/pearl-area-display_8ipf_source.html new file mode 100644 index 0000000..602c926 --- /dev/null +++ b/doc/html/pearl-area-display_8ipf_source.html @@ -0,0 +1,168 @@ + + + + + + +PEARL Procedures: pearl-area-display.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-area-display.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.2
3 #pragma ModuleName = PearlAreaDisplay
4 #pragma version = 1.04
5 
19 // 3D data is handled by 3 windows. they don't have to be visible all at the same time.
48 
54 
56 static string graphname_from_dfref(dfref df, string prefix){
57  dfref df
58  string prefix
59 
60  string name
61 
62  name = GetDataFolder(1, df)
63  name = ReplaceString("root:", name, "")
64  name = name[0, strlen(name) - 2]
65  name = ReplaceString(" ", name, "")
66  name = CleanupName(prefix + name, 0)
67  if (CheckName(name, 6))
68  name = UniqueName(name, 6, 0)
69  endif
70 
71  return name
72 };
73 
84 string ad_display(wave image){
85  wave image// wave which contains the image data from the detector
86  // returns the name of the graph window
87 
88  dfref savedf = GetDataFolderDFR()
89  dfref imagedf = GetWavesDataFolderDFR(image)
90  setdatafolder imagedf
91 
92  string dfname = ReplaceString("root:", GetDataFolder(1, imagedf), "")
93  string graphtitle = dfname + " View"
94  string /g view_graphname = graphname_from_dfref(imagedf, "view_")
95  svar graphname = view_graphname
96  display /k=1/n=$graphname as graphtitle
97  graphname = s_name
98  appendimage /w=$graphname image
99 
100  setdatafolder savedf
101  return graphname
102 };
103 
114 string ad_display_histogram(wave image){
115  wave image
116 
117  dfref savedf = GetDataFolderDFR()
118  dfref imagedf = GetWavesDataFolderDFR(image)
119  string s_imagedf = GetDataFolder(1, imagedf)
120  setdatafolder imagedf
121 
122  make /n=(1)/o hist// histogram
123 
124  string dfname = ReplaceString("root:", GetDataFolder(1, imagedf), "")
125  string graphtitle = dfname + " Histogram"
126  string /g hist_graphname = graphname_from_dfref(imagedf, "hist_")
127  svar graphname = hist_graphname
128  display /k=1/n=$graphname as graphtitle
129  graphname = s_name
130  appendtograph /w=$graphname hist
131 
132  ModifyGraph /w=$graphname rgb(hist)=(39168,0,0)
133  ModifyGraph /w=$graphname mode=6
134  ModifyGraph /w=$graphname mirror=1
135  ModifyGraph /w=$graphname minor=1
136  ModifyGraph /w=$graphname axThick=0.5
137  ModifyGraph /w=$graphname lblPosMode=1,lblPos=30,lblMargin=0
138  ModifyGraph /w=$graphname btLen=4
139  ModifyGraph /w=$graphname margin(left)=45,margin(bottom)=35,margin(top)=10,margin(right)=10
140  ModifyGraph /w=$graphname gfSize=10
141  Label /w=$graphname bottom "value"
142  Label /w=$graphname left "# pixels"
143 
144  ad_calc_histogram(image)
145 
146  setdatafolder savedf
147  return graphname
148 };
149 
165 string ad_display_profiles(wave image, string filter = defaultValue){
166  wave image
167  string filter
168  variable show_legend = 0// currently not supported
169 
170  if (WaveDims(image) != 2)
171  abort "ad_display_profiles: image wave must be two-dimensional."
172  endif
173  if (ParamIsDefault(filter))
174  filter = "ad_box_filter"
175  endif
176 
177  // data folders and references
178  dfref savedf = GetDataFolderDFR()
179  dfref imagedf = GetWavesDataFolderDFR(image)
180  string s_imagedf = GetDataFolder(1, imagedf)
181  setdatafolder imagedf
182  string s_viewdf = CleanupName("view_" + NameOfWave(image), 0)
183  newdatafolder /o/s $s_viewdf
184  dfref viewdf = GetDataFolderDFR()
185  s_viewdf = GetDataFolder(1, viewdf)
186 
187  // data structures
188  string /g sourcepath = GetWavesDataFolder(image, 2)
189  string viewname = "view_image"
190  duplicate /o image, $viewname /wave=view
191  make /n=(3,3)/o xprofiles// NX x 3 wave with 3 one-dimensional profiles along Y dimension
192  make /n=(3,3)/o yprofiles// NY x 3 wave with 3 one-dimensional profiles along X dimension
193  string /g view_filter
194  string /g view_filter_options
195  view_filter = filter
196  view_filter_options = ""
197  variable /g view_filter_smoothing_x = 1
198  variable /g view_filter_smoothing_y = 1
199  variable /g view_cursor_mode = 0
200  string dfname = ReplaceString("root:", GetDataFolder(1, imagedf), "")
201  string graphtitle = dfname + NameOfWave(image) + " Profiles"
202  string /g prof_graphname = graphname_from_dfref(imagedf, "prof_")
203  svar graphname = prof_graphname
204  variable /g graph_avg// average value in ROI (ROI is defined by the crosshairs A and B)
205  variable /g graph_min// minimum value in ROI
206  variable /g graph_max// maximum value in ROI
207  variable /g graph_sum// sum of all values in ROI
208  variable /g graph_sdev// standard deviation of all values in ROI
209 
210  // graph setup
211  display /k=1 /n=$graphname /w=(100,100,500,400) as graphtitle
212  graphname = s_name
213  AppendToGraph /w=$graphname /L=xprofiles xprofiles[*][0],xprofiles[*][1],xprofiles[*][2]
214  AppendToGraph /w=$graphname /VERT/B=yprofiles yprofiles[*][0],yprofiles[*][1],yprofiles[*][2]
215  AppendImage /w=$graphname view
216  string imgname = StringFromList(0, ImageNameList(graphname, ";"))
217  ModifyImage /w=$graphname $imgname ctab= {*,*,BlueGreenOrange,0}
218  ModifyGraph /w=$graphname rgb(xprofiles)=(39168,0,0),rgb(yprofiles)=(39168,0,0)
219  ModifyGraph /w=$graphname rgb(xprofiles#1)=(0,26112,0),rgb(yprofiles#1)=(0,26112,0)
220  ModifyGraph /w=$graphname rgb(xprofiles#2)=(0,9472,39168),rgb(yprofiles#2)=(0,9472,39168)
221  ModifyGraph /w=$graphname mirror(xprofiles)=2,mirror(bottom)=3,mirror(yprofiles)=2,mirror(left)=3
222  ModifyGraph /w=$graphname nticks=3
223  ModifyGraph /w=$graphname minor=1
224  ModifyGraph /w=$graphname axThick=0.5
225  ModifyGraph /w=$graphname lblPosMode=1,lblPos=30,lblMargin=0
226  ModifyGraph /w=$graphname btLen=4
227  ModifyGraph /w=$graphname freePos(xprofiles)=0
228  ModifyGraph /w=$graphname freePos(yprofiles)=0
229  ModifyGraph /w=$graphname axisEnab(xprofiles)={0.64,1}
230  ModifyGraph /w=$graphname axisEnab(bottom)={0,0.6}
231  ModifyGraph /w=$graphname axisEnab(yprofiles)={0.64,1}
232  ModifyGraph /w=$graphname axisEnab(left)={0,0.6}
233  ModifyGraph /w=$graphname zero(left)=8
234  ModifyGraph /w=$graphname margin(left)=40,margin(bottom)=30,margin(top)=20,margin(right)=40
235  ModifyGraph /w=$graphname gfSize=10
236 
237  // axis labels
238  string labels = note(image)
239  string lab
240  lab = StringByKey("AxisLabelX", labels, "=", "\r")
241  if (!strlen(lab))
242  lab = "X"
243  endif
244  Label /w=$graphname bottom lab + " (\\U)"
245  lab = StringByKey("AxisLabelY", labels, "=", "\r")
246  if (!strlen(lab))
247  lab = "Y"
248  endif
249  Label /w=$graphname left lab + " (\\U)"
250  lab = StringByKey("AxisLabelD", labels, "=", "\r")
251  if (!strlen(lab))
252  lab = "value"
253  endif
254  Label /w=$graphname xprofiles lab + " (\\U)"
255  Label /w=$graphname yprofiles lab + " (\\U)"
256 
257  // legend
258  if (show_legend)
259  Legend /w=$graphname/C/N=text0/J/F=2/D=0.5/T={28}/A=RT/X=0.00/Y=0.00 "\\s(xprofiles)\tprofile A"
260  AppendText /w=$graphname "\\s(xprofiles#1)\tprofile B"
261  AppendText /w=$graphname "\\s(xprofiles#2)\tROI average"
262  AppendText /w=$graphname "min\t\\{" + s_viewdf + "graph_min}"
263  AppendText /w=$graphname "max\t\\{" + s_viewdf + "graph_max}"
264  AppendText /w=$graphname "sum\t\\{" + s_viewdf + "graph_sum}"
265  AppendText /w=$graphname "avg\t\\{" + s_viewdf + "graph_avg}"
266  AppendText /w=$graphname "sdev\t\\{" + s_viewdf + "graph_sdev}"
267  else
268  TextBox /w=$graphname /C/N=text0 /F=0 /B=1 /X=1.00 /Y=1.00
269  lab = StringByKey("Dataset", labels, "=", "\r")
270  if (strlen(lab))
271  AppendText /w=$graphname lab
272  endif
273  AppendText /w=$graphname "sum\t\\{" + s_viewdf + "graph_sum}"
274  AppendText /w=$graphname "avg\t\\{" + s_viewdf + "graph_avg}"
275  AppendText /w=$graphname "sdev\t\\{" + s_viewdf + "graph_sdev}"
276  endif
277 
278  // interactive elements
279  Cursor /w=$graphname /A=1 /P /I /S=2 /H=1 /L=1 A $imgname 0,0
280  Cursor /w=$graphname /A=1 /P /I /S=2 /H=1 /L=1 B $imgname DimSize(view, 0)-1, DimSize(view, 1)-1
281  variable pcurs
282  pcurs = floor(DimSize(xprofiles, 0) / 3)
283  Cursor /w=$graphname /A=0 /P /S=1 /H=0 C xprofiles#2 pcurs
284  pcurs = floor(DimSize(xprofiles, 0) * 2 / 3)
285  Cursor /w=$graphname /A=0 /P /S=1 /H=0 D xprofiles#2 pcurs
286  pcurs = floor(DimSize(yprofiles, 0) / 3)
287  Cursor /w=$graphname /A=0 /P /S=1 /H=0 E yprofiles#2 pcurs
288  pcurs = floor(DimSize(yprofiles, 0) * 2 / 3)
289  Cursor /w=$graphname /A=0 /P /S=1 /H=0 F yprofiles#2 pcurs
290  ShowInfo /w=$graphname /CP=0
291 
292  SetWindow $graphname, hook(ad_profiles_hook)=ad_profiles_hook
293  ControlBar /w=$graphname 21
294  Button b_reset_cursors win=$graphname, title="reset cursors",pos={0,0},size={70,20},proc=PearlAreaDisplay#bp_reset_cursors
295  Button b_reset_cursors win=$graphname, fColor=(65535,65535,65535),fSize=10
296 
297  SetVariable sv_smoothing_x win=$graphname, title="X smoothing",pos={130,2},bodyWidth=40
298  SetVariable sv_smoothing_x win=$graphname, value=view_filter_smoothing_x,limits={1,100,1}
299  SetVariable sv_smoothing_x win=$graphname, proc=PearlAreaDisplay#svp_smoothing
300  SetVariable sv_smooting_y win=$graphname, title="Y smoothing",pos={240,2},bodyWidth=40
301  SetVariable sv_smooting_y win=$graphname, value=view_filter_smoothing_y,limits={1,100,1}
302  SetVariable sv_smooting_y win=$graphname, proc=PearlAreaDisplay#svp_smoothing
303 
304  PopupMenu pm_export win=$graphname, mode=0,title="Export"
305  PopupMenu pm_export win=$graphname, value="X profile;Y profile;X profile (collate);Y profile (collate)"
306  PopupMenu pm_export win=$graphname, pos={308,0},bodyWidth=60,proc=PearlAreaDisplay#pmp_export
307  PopupMenu pm_export win=$graphname, help={"Export profile of selected area and display in graph. Collate mode = display all profiles in same graph."}
308 
309  // data processing
310  ad_update_profiles(image)
311 
312  setdatafolder savedf
313  return graphname
314 };
315 
321 variable ad_update_profiles(wave image){
322  wave image
323 
324  // data folders and references
325  dfref viewdf = get_view_folder(image)
326  if (DataFolderRefStatus(viewdf) == 0)
327  return -1// data folder not found
328  endif
329  dfref savedf = GetDataFolderDFR()
330  setdatafolder viewdf
331 
332  // data structures
333  string viewname = "view_image"
334  duplicate /o image, $viewname /wave=view
335 
336  // data processing
337  svar view_filter
338  svar view_filter_options
339  nvar smoothing_x = view_filter_smoothing_x
340  nvar smoothing_y = view_filter_smoothing_y
341  funcref ad_default_image_filter filterfunc = $view_filter
342  view_filter_options = ReplaceNumberByKey("SmoothingX", view_filter_options, smoothing_x, "=", ";")
343  view_filter_options = ReplaceNumberByKey("SmoothingY", view_filter_options, smoothing_y, "=", ";")
344  filterfunc(view, view_filter_options)
345 
347 
348  setdatafolder savedf
349  return 0
350 };
351 
368 variable ad_profiles_cursor_mode(wave image, variable mode){
369  wave image
370  variable mode
371 
372  dfref savedf = GetDataFolderDFR()
373  wave view_image = get_view_image(image)
374  dfref viewdf = GetWavesDataFolderDFR(view_image)
375  svar /sdfr=viewdf graphname = prof_graphname
376  nvar /sdfr=viewdf cursor_mode = view_cursor_mode
377  wave /sdfr=viewdf xprofiles, yprofiles
378 
379  variable dx = DimSize(view_image, 0)
380  variable dy = DimSize(view_image, 1)
381  switch(mode)
382  case 1:// background selection
383  Cursor /w=$graphname /A=0 /P /I /S=2 /H=1 /L=1 A view_image 0, 0
384  Cursor /w=$graphname /A=0 /P /I /S=2 /H=1 /L=1 B view_image dx-1, dy-1
385  Cursor /w=$graphname /A=0 /P /I /S=2 /H=2 /L=1 C view_image round(0.2 * dx) -1, 0
386  Cursor /w=$graphname /A=0 /P /I /S=2 /H=2 /L=1 D view_image round(0.8 * dx) -1, 0
387  Cursor /w=$graphname /A=0 /P /I /S=2 /H=2 /L=1 E view_image round(0.4 * dx) -1, 0
388  Cursor /w=$graphname /A=0 /P /I /S=2 /H=2 /L=1 F view_image round(0.6 * dx) -1, 0
389 
390  ShowInfo /w=$graphname /CP=0
391  cursor_mode = mode
392  break
393  default:
394  Cursor /w=$graphname /A=1 /P /I /S=2 /H=1 /L=1 A view_image 0,0
395  Cursor /w=$graphname /A=1 /P /I /S=2 /H=1 /L=1 B view_image dx-1, dy-1
396  variable pcurs
397  pcurs = floor(DimSize(xprofiles, 0) / 3)
398  Cursor /w=$graphname /A=0 /P /S=1 /H=0 C xprofiles#2 pcurs
399  pcurs = floor(DimSize(xprofiles, 0) * 2 / 3)
400  Cursor /w=$graphname /A=0 /P /S=1 /H=0 D xprofiles#2 pcurs
401  pcurs = floor(DimSize(yprofiles, 0) / 3)
402  Cursor /w=$graphname /A=0 /P /S=1 /H=0 E yprofiles#2 pcurs
403  pcurs = floor(DimSize(yprofiles, 0) * 2 / 3)
404  Cursor /w=$graphname /A=0 /P /S=1 /H=0 F yprofiles#2 pcurs
405  ShowInfo /w=$graphname /CP=0
406  cursor_mode = 0
407  endswitch
408 
409  setdatafolder savedf
410  return 0
411 };
412 
429 variable ad_profiles_set_cursor(wave image, string cursorname, variable xa, variable ya, variable pscale = defaultValue){
430  wave image
431  string cursorname
432  variable xa, ya
433  variable pscale
434 
435  if (ParamIsDefault(pscale))
436  pscale = 0
437  endif
438 
439  // data folders and references
440  dfref savedf = GetDataFolderDFR()
441  wave view_image = get_view_image(image)
442  dfref viewdf = GetWavesDataFolderDFR(view_image)
443  svar /sdfr=viewdf graphname = prof_graphname
444 
445  variable pa, qa
446  if (pscale)
447  pa = xa
448  qa = ya
449  else
450  pa = round((xa - DimOffset(view_image, 0)) / DimDelta(view_image, 0))
451  qa = round((ya - DimOffset(view_image, 1)) / DimDelta(view_image, 1))
452  endif
453 
454  pa = min(pa, DimSize(view_image, 0) - 1)
455  pa = max(pa, 0)
456  qa = min(qa, DimSize(view_image, 1) - 1)
457  qa = max(qa, 0)
458  Cursor /i /p /w=$graphname $cursorname view_image pa, qa
459 
460  setdatafolder savedf
461  return 0
462 };
463 
474 // the lines can be removed manually using the draw toolbox, or by calling this function with @c clean=1.
481 variable ad_profiles_crosshairs(wave image, variable clear = defaultValue){
482  wave image
483  variable clear
484 
485  if (ParamIsDefault(clear))
486  clear = 0
487  endif
488 
489  // data folders and references
490  wave view_image = get_view_image(image)
491  dfref viewdf = GetWavesDataFolderDFR(view_image)
492  svar /sdfr=viewdf graphname = prof_graphname
493 
494  string cursors = "A;B"
495  string colors = "39168,0,0;0,26112,0"
496  string color
497  variable ncursors
498  variable icursor
499  string cursorname
500  string groupname = "crosshairs"
501  variable xx, yy
502  struct RGBColor rgb
503 
504  if (clear == 0)
505  SetDrawEnv /W=$graphname push
506  DrawAction /w=$graphname getgroup=$groupname, delete, begininsert
507  SetDrawEnv /w=$graphname gstart, gname=$groupname
508 
509  SetDrawEnv /W=$graphname dash=4
510  SetDrawEnv /W=$graphname linethick=0.5
511 
512  ncursors = ItemsInList(cursors, ";")
513  for (icursor=0; icursor < ncursors; icursor += 1)
514  cursorname = StringFromList(icursor, cursors, ";")
515  color = StringFromList(icursor, colors, ";")
516  rgb.red = str2num(StringFromList(0, color, ","))
517  rgb.green = str2num(StringFromList(1, color, ","))
518  rgb.blue = str2num(StringFromList(2, color, ","))
519  if (strlen(CsrInfo($cursorname, graphname)) > 0)
520  xx = hcsr($cursorname, graphname)
521  yy = vcsr($cursorname, graphname)
522  SetDrawEnv /W=$graphname linefgc=(rgb.red, rgb.green, rgb.blue)
523  SetDrawEnv /W=$graphname save
524  SetDrawEnv /W=$graphname xcoord=bottom, ycoord=prel
525  DrawLine /W=$graphname xx, 0, xx, 1
526  SetDrawEnv /W=$graphname xcoord=prel, ycoord=left
527  DrawLine /W=$graphname 0, yy, 1, yy
528  endif
529  endfor
530 
531  SetDrawEnv /w=$graphname gstop
532  DrawAction /w=$graphname endinsert
533  SetDrawEnv /W=$graphname pop
534  SetDrawEnv /W=$graphname save
535  else
536  DrawAction /w=$graphname getgroup=$groupname, delete
537  endif
538 
539  return 0
540 };
541 
547 static wave get_source_image(wave view){
548  wave view// image wave displayed in a profiles window
549 
550  dfref viewdf = GetWavesDataFolderDFR(view)
551  svar /z /sdfr=viewdf sourcepath
552  if (svar_exists(sourcepath))
553  wave /z img = $sourcepath
554  else
555  wave /z img = $""
556  endif
557  return img
558 };
559 
561 static dfr make_view_folder(wave source){
562  wave source// wave which contains the raw data from the detector.
563 
564  // data folders and references
565  dfref savedf = GetDataFolderDFR()
566  dfref imagedf = GetWavesDataFolderDFR(source)
567  string s_imagedf = GetDataFolder(1, imagedf)
568  setdatafolder imagedf
569  string s_viewdf = CleanupName("view_" + NameOfWave(source), 0)
570  newdatafolder /o/s $s_viewdf
571  dfref viewdf = GetDataFolderDFR()
572 
573  setdatafolder savedf
574  return viewdf
575 };
576 
585 static dfr get_view_folder(wave source){
586  wave source
587 
588  // data folders and references
589  dfref savedf = GetDataFolderDFR()
590  dfref imagedf = GetWavesDataFolderDFR(source)
591  dfref viewdf
592  setdatafolder imagedf
593  string s_viewdf = CleanupName("view_" + NameOfWave(source), 0)
594  if (DataFolderExists(s_viewdf))
595  setdatafolder $s_viewdf
596  viewdf = GetDataFolderDFR()
597  endif
598 
599  setdatafolder savedf
600  return viewdf
601 };
602 
608 static wave get_view_image(wave source){
609  wave source
610 
611  dfref viewdf = get_view_folder(source)
612  string viewname = "view_image"
613  wave /sdfr=viewdf view = $viewname
614 
615  return view
616 };
617 
618 static variable bp_reset_cursors(WMButtonAction* ba){
619  STRUCT WMButtonAction &ba
620 
621  switch( ba.eventCode )
622  case 2:// mouse up
623  string imgname = StringFromList(0, ImageNameList(ba.win, ";"))
624  wave /z image = ImageNameToWaveRef(ba.win, imgname)
625  if (waveexists(image))
626  Cursor /i/p A $imgname 0,0
627  Cursor /i/p B $imgname DimSize(image, 0)-1, DimSize(image, 1)-1
628  endif
629  break
630  case -1:// control being killed
631  break
632  endswitch
633 
634  return 0
635 };
636 
637 static variable svp_smoothing(WMSetVariableAction* sva){
638  STRUCT WMSetVariableAction &sva
639 
640  string imglist
641 
642  switch( sva.eventCode )
643  case 1:// mouse up
644  case 2:// Enter key
645  case 3:// Live update
646  imglist = ImageNameList(sva.win, ";")
647  wave /z img = ImageNameToWaveRef(sva.win, StringFromList(0, imglist))
648  if (WaveExists(img))
649  wave source = get_source_image(img)
650  if (WaveExists(source))
651  ad_update_profiles(source)
652  endif
653  endif
654  break
655  case -1:// control being killed
656  break
657  endswitch
658 
659  return 0
660 };
661 
662 static variable pmp_export(WMPopupAction* pa){
663  STRUCT WMPopupAction &pa
664 
665  switch( pa.eventCode )
666  case 2:// mouse up
667  variable popNum = pa.popNum
668 
669  string imgname = StringFromList(0, ImageNameList(pa.win, ";"))
670  wave /z image = ImageNameToWaveRef(pa.win, imgname)
671  if (waveexists(image) && (popNum >= 1) && (popNum <= 2))
672  ad_export_profile(image, popNum - 1, show=1)
673  else if (waveexists(image) && (popNum >= 3) && (popNum <= 4))
674  ad_export_profile(image, popNum - 3, show=2)
675  endif
676 
677  break
678  case -1:// control being killed
679  break
680  endswitch
681 
682  return 0
683 };
684 
686 variable ad_profiles_hook(WMWinHookStruct* s){
687  struct WMWinHookStruct &s
688  variable hookresult = 0
689  string imglist
690  string cmd
691  dfref viewdf
692 
693  switch(s.eventCode)
694  case 2:// delete data folder after window is killed
695  imglist = ImageNameList(s.winName, ";")
696  wave /z img = ImageNameToWaveRef(s.winName, StringFromList(0, imglist))
697  if (WaveExists(img))
698  viewdf = GetWavesDataFolderDFR(img)
699  cmd = "killdatafolder /z " + GetDataFolder(1, viewdf)
700  Execute /P/Q/Z cmd
701  endif
702  break
703  case 7:// update profiles when cursor is moved
704  imglist = ImageNameList(s.winName, ";")
705  wave /z img = ImageNameToWaveRef(s.winName, StringFromList(0, imglist))
706  if (WaveExists(img))
708  hookresult = 1
709  else
710  hookresult = 0
711  endif
712  break
713  endswitch
714 
715  return hookresult
716 };
717 
726 variable ad_calc_cursor_profiles(wave image){
727  wave image
728 
729  dfref savedf = GetDataFolderDFR()
730  dfref imagedf = GetWavesDataFolderDFR(image)
731  setdatafolder imagedf
732 
733  svar graphname = prof_graphname
734 
735  variable pa, qa// point coordinates cursor A
736  if (strlen(CsrInfo(A, graphname)) > 0)
737  pa = pcsr(A, graphname)
738  qa = qcsr(A, graphname)
739  else
740  pa = 0
741  qa = 0
742  endif
743 
744  variable pb, qb// point coordinates cursor B
745  if (strlen(CsrInfo(B, graphname)) > 0)
746  pb = pcsr(B, graphname)
747  qb = qcsr(B, graphname)
748  else
749  pb = DimSize(image, 0) - 1
750  qb = DimSize(image, 1) - 1
751  endif
752 
753  ad_calc_profiles(image, pa, qa, pb, qb)
754  setdatafolder savedf
755 };
756 
773 variable ad_calc_profiles(wave image, variable pa, variable qa, variable pb, variable qb){
774  wave image
775  variable pa, qa
776  variable pb, qb
777 
778  dfref savedf = GetDataFolderDFR()
779  dfref imagedf = GetWavesDataFolderDFR(image)
780  setdatafolder imagedf
781 
782  wave xprofiles
783  wave yprofiles
784  nvar graph_avg
785  nvar graph_min
786  nvar graph_max
787  nvar graph_sum
788  nvar graph_sdev
789 
790  // horizontal profiles at crosshairs
791  redimension /n=(dimsize(image,0), 3) xprofiles
792  setscale /p x dimoffset(image,0), dimdelta(image,0), WaveUnits(image,0), xprofiles
793  setscale d 0, 0, waveunits(image,-1), xprofiles
794  xprofiles[][0] = image[p][qa]
795  xprofiles[][1] = image[p][qb]
796 
797  note /k xprofiles
798  note xprofiles, "SourceWave=" + nameofwave(image)
799  note xprofiles, "SourceDimension=0"
800  note xprofiles, "SourceIndex0=" + num2str(qa)
801  note xprofiles, "SourceIndex1=" + num2str(qb)
802 
803  // average horizontal profile between crosshairs
804  variable qq, q0, q1
805  q0 = min(qa, qb)
806  q1 = max(qa, qb)
807  xprofiles[][2] = 0
808  for (qq = q0; qq <= q1; qq += 1)
809  xprofiles[][2] += image[p][qq]
810  endfor
811  xprofiles[][2] /= q1 - q0 + 1
812 
813  // vertical profiles at crosshairs
814  redimension /n=(dimsize(image,1), 3) yprofiles
815  setscale /p x dimoffset(image,1), dimdelta(image,1), WaveUnits(image,1), yprofiles
816  setscale d 0, 0, waveunits(image,-1), yprofiles
817  yprofiles[][0] = image[pa][p]
818  yprofiles[][1] = image[pb][p]
819 
820  note /k yprofiles
821  note yprofiles, "SourceWave=" + nameofwave(image)
822  note yprofiles, "SourceDimension=1"
823  note yprofiles, "SourceIndex0=" + num2str(pa)
824  note yprofiles, "SourceIndex1=" + num2str(pb)
825 
826  // average vertical profile between crosshairs
827  variable pp, p0, p1
828  p0 = min(pa, pb)
829  p1 = max(pa, pb)
830  yprofiles[][2] = 0
831  for (pp = p0; pp <= p1; pp += 1)
832  yprofiles[][2] += image[pp][p]
833  endfor
834  yprofiles[][2] /= p1 - p0 + 1
835 
836  // statistics between crosshairs
837  Duplicate /r=[p0,p1][q0,q1]/o image, roi_image
838  WaveStats /Q roi_image
839  graph_avg = v_avg
840  graph_min = v_min
841  graph_max = v_max
842  graph_sum = v_avg * v_npnts
843  graph_sdev = v_sdev
844 
845  // histogram
846  wave /z hist
847  if (waveexists(hist))
848  Histogram /B=3 roi_image, hist
849  endif
850 
851  setdatafolder savedf
852 };
853 
875 variable ad_export_profile(wave view_image, variable dim, variable trace = defaultValue, variable show = defaultValue, variable overwrite = defaultValue){
876  wave view_image
877  variable dim
878  variable trace
879  variable show
880  variable overwrite
881 
882  dfref savedf = GetDataFolderDFR()
883 
884  if (ParamIsDefault(trace))
885  trace = 2
886  endif
887  if (ParamIsDefault(show))
888  show = 0
889  endif
890  if (ParamIsDefault(overwrite))
891  overwrite = 0
892  endif
893 
894  // view folder
895  dfref imagedf = GetWavesDataFolderDFR(view_image)
896  string dim_label
897  switch(dim)
898  case 0:
899  wave /sdfr=imagedf profiles=xprofiles
900  dim_label = "x"
901  break
902  case 1:
903  wave /sdfr=imagedf profiles=yprofiles
904  dim_label = "y"
905  break
906  default:
907  return -1// invalid argument
908  endswitch
909  string graphname_string = "export_graph_" + dim_label
910  svar /z /sdfr=imagedf linked_graphname = $graphname_string
911 
912  // source folder
913  wave /z source_image = get_source_image(view_image)
914  if (WaveExists(source_image))
915  dfref sourcedf = GetWavesDataFolderDFR(source_image)
916  setdatafolder sourcedf
917  else
918  return -2// invalid source data folder
919  endif
920 
921  // format dest wave name
922  string profile_note = note(profiles)
923  string name_base
924  string name_dim
925  string name_index
926  string profile_name
927  variable index_width = ceil(log(DimSize(view_image, 1 - dim)))
928  variable index0 = NumberByKey("SourceIndex0", profile_note, "=", "\r")
929  variable index1 = NumberByKey("SourceIndex1", profile_note, "=", "\r")
930  name_dim = "_" + dim_label
931  sprintf name_index, "%0*u_%0*u", index_width, index0, index_width, index1
932  name_base = NameOfWave(source_image)
933  name_base = name_base[0, min(strlen(name_base), 31 - strlen(name_index) - strlen(name_dim) - 1)]
934  profile_name = name_base + name_dim + name_index
935  if ((overwrite == 0) && (CheckName(profile_name, 1)))
936  profile_name = UniqueName(profile_name + "_", 1, 0)
937  endif
938 
939  // create dest wave
940  duplicate /o /r=[][trace] profiles, $profile_name /wave=dest_profile
941  redimension /n=(dimsize(profiles, 0)) dest_profile
942  profile_note = ReplaceStringByKey("SourceWave", profile_note, NameOfWave(source_image), "=", "\r")
943  note /k dest_profile
944  note dest_profile, profile_note
945  print "created", GetWavesDataFolder(dest_profile, 2)
946 
947  if (show)
948  string graphname
949  string graphtitle
950  if (show == 2)
951  // common graph for all profiles of a dimension
952  graphname = "export_profiles_" + dim_label
953  graphtitle = UpperStr(dim_label) + " Profiles"
954  else
955  // one graph per source image
956  if (svar_exists(linked_graphname) && (ItemsInList(WinList(linked_graphname, ";", "WIN:1"), ";") >= 1))
957  graphname = linked_graphname
958  else
959  graphname = GetWavesDataFolder(source_image, 0) + name_dim
960  endif
961  graphtitle = UpperStr(dim_label) + " Profiles: " + GetWavesDataFolder(source_image, 2)
962  endif
963 
964  if ((ItemsInList(WinList(graphname, ";", "WIN:1"), ";") >= 1))
965  appendtograph /w=$graphname dest_profile
966  else
967  setdatafolder imagedf
968  display /k=1 /n=$graphname dest_profile as graphtitle
969  graphname = s_name
970  ModifyGraph /w=$graphname mirror=1,nticks=3,minor=1
971  ModifyGraph /w=$graphname axThick=0.5,btLen=4
972  ModifyGraph /w=$graphname gfSize=10
973  ModifyGraph /w=$graphname grid=2,gridHair=0,gridRGB=(52224,52224,52224)
974  Legend /w=$graphname /C/N=legend0/F=0/B=1/A=LT/X=0.00/Y=0.00
975 
976  if (show != 2)
977  string /g $graphname_string = graphname
978  endif
979  endif
980  endif
981 
982  setdatafolder savedf
983  return 0
984 };
985 
986 static variable set_trace_colors(string graphname){
987  string graphname
988 
989  ModifyGraph /w=$graphname /z rgb[0]=(0, 0, 0)
990  ModifyGraph /w=$graphname /z rgb[1]=(65535, 16385, 16385)
991  ModifyGraph /w=$graphname /z rgb[2]=(2, 39321, 1)
992  ModifyGraph /w=$graphname /z rgb[3]=(0, 0, 65535)
993  ModifyGraph /w=$graphname /z rgb[4]=(39321, 1, 31457)
994  ModifyGraph /w=$graphname /z rgb[5]=(48059, 48059, 48059)
995  ModifyGraph /w=$graphname /z rgb[6]=(65535, 32768, 32768)
996  ModifyGraph /w=$graphname /z rgb[7]=(0, 65535, 0)
997  ModifyGraph /w=$graphname /z rgb[8]=(16385,65535,65535)
998  ModifyGraph /w=$graphname /z rgb[9]=(65535, 32768, 58981)
999 };
1000 
1007 variable ad_calc_histogram(wave image){
1008  wave image
1009 
1010  dfref savedf = GetDataFolderDFR()
1011  dfref imagedf = GetWavesDataFolderDFR(image)
1012  setdatafolder imagedf
1013 
1014  wave hist
1015  Histogram /B=3 image, hist
1016 
1017  setdatafolder savedf
1018 };
1019 
1030 variable ad_default_image_filter(wave image, string options){
1031  wave image
1032  string options
1033 };
1034 
1044 variable ad_box_filter(wave image, string options){
1045  wave image
1046  string options
1047 
1048  variable xsmoothing = NumberByKey("SmoothingX", options, "=", ";")
1049  variable ysmoothing = NumberByKey("SmoothingY", options, "=", ";")
1050 
1051  if ((NumType(xsmoothing) == 0) && (xsmoothing >= 2))
1052  Smooth /B /DIM=0 /E=3 xsmoothing, image
1053  endif
1054  if ((NumType(ysmoothing) == 0) && (ysmoothing >= 2))
1055  Smooth /B /DIM=1 /E=3 ysmoothing, image
1056  endif
1057 };
1058 
1066 variable ad_transpose_filter(wave image, string options){
1067  wave image
1068  string options
1069 
1070  MatrixTranspose image
1071 };
1072 
1073 
1074 // ################### 3D DATA ##################
1075 
1082 string ad_display_brick(wave data){
1083  wave data
1084 
1085  if(exists("NewGizmo") != 4)
1086  abort "Gizmo XOP must be installed."
1087  endif
1088  if (WaveDims(data) != 3)
1089  abort "ad_display_brick: data must be three-dimensional."
1090  endif
1091 
1092  dfref savedf = GetDataFolderDFR()
1093  dfref datadf = GetWavesDataFolderDFR(data)
1094  string s_datadf = GetDataFolder(1, datadf)
1095  dfref viewdf = make_view_folder(data)
1096 
1097  setdatafolder viewdf
1098  string dfname = ReplaceString("root:", s_datadf, "")
1099  string graphtitle = dfname + " Gizmo"
1100  string /g gizmo_graphname = graphname_from_dfref(datadf, "giz_")
1101  svar graphname = gizmo_graphname
1102 
1103  if ((strlen(graphname) > 0) && (wintype(graphname) == 13))
1104  setdatafolder savedf
1105  return graphname// gizmo window exists
1106  endif
1107 
1108  variable nx = dimsize(data, 0)
1109  variable ny = dimsize(data, 1)
1110  variable nz = dimsize(data, 2)
1111 
1112  variable pp
1113  string obj
1114  string cmd
1115 
1116  // igor does not allow calling gizmo functions directly
1117  setdatafolder datadf
1118  sprintf cmd, "NewGizmo /k=1 /n=%s /w=(100,100,500,400) /t=\"%s\"", graphname, graphtitle
1119  execute /q cmd
1120  cmd = "AppendToGizmo /D Axes=BoxAxes, name=axes0"
1121  execute /q cmd
1122 
1123  obj = "surface_xmid"
1124  pp = round(nx / 2 - 1)
1125  sprintf cmd, "AppendToGizmo /D surface=%s, name=%s", nameofwave(data), obj
1126  execute /q cmd
1127  sprintf cmd, "ModifyGizmo modifyObject=%s, property={srcMode, 128}", obj
1128  execute /q cmd
1129  sprintf cmd, "ModifyGizmo ModifyObject=%s, property={plane, %d}", obj, pp
1130  execute /q cmd
1131  sprintf cmd, "ModifyGizmo modifyObject=%s, property={surfaceCtab, BlueGreenOrange}", obj
1132  execute /q cmd
1133  sprintf cmd, "ModifyGizmo ModifyObject=%s, property={SurfaceCTABScaling,128}", obj
1134  execute /q cmd
1135  sprintf cmd, "ModifyGizmo modifyObject=%s, property={surfaceCTABAlpha, 1.0}", obj
1136  execute /q cmd
1137 
1138  obj = "surface_ymid"
1139  pp = round(ny / 2 - 1)
1140  sprintf cmd, "AppendToGizmo /D surface=%s, name=%s", nameofwave(data), obj
1141  execute /q cmd
1142  sprintf cmd, "ModifyGizmo modifyObject=%s, property={srcMode, 64}", obj
1143  execute /q cmd
1144  sprintf cmd, "ModifyGizmo ModifyObject=%s, property={plane, %d}", obj, pp
1145  execute /q cmd
1146  sprintf cmd, "ModifyGizmo modifyObject=%s, property={surfaceCtab, BlueGreenOrange}", obj
1147  execute /q cmd
1148  sprintf cmd, "ModifyGizmo ModifyObject=%s, property={SurfaceCTABScaling,128}", obj
1149  execute /q cmd
1150  sprintf cmd, "ModifyGizmo modifyObject=%s, property={surfaceCTABAlpha, 1.0}", obj
1151  execute /q cmd
1152 
1153  obj = "surface_zmid"
1154  pp = round(nz / 2 - 1)
1155  sprintf cmd, "AppendToGizmo /D surface=%s, name=%s", nameofwave(data), obj
1156  execute /q cmd
1157  sprintf cmd, "ModifyGizmo modifyObject=%s, property={srcMode, 32}", obj
1158  execute /q cmd
1159  sprintf cmd, "ModifyGizmo ModifyObject=%s, property={plane, %d}", obj, pp
1160  execute /q cmd
1161  sprintf cmd, "ModifyGizmo modifyObject=%s, property={surfaceCtab, BlueGreenOrange}", obj
1162  execute /q cmd
1163  sprintf cmd, "ModifyGizmo ModifyObject=%s, property={SurfaceCTABScaling,128}", obj
1164  execute /q cmd
1165  sprintf cmd, "ModifyGizmo modifyObject=%s, property={surfaceCTABAlpha, 1.0}", obj
1166  execute /q cmd
1167 
1168  obj = "axes0"
1169  sprintf cmd, "ModifyGizmo ModifyObject=%s,property={-1,axisScalingMode,1}", obj
1170  execute /q cmd
1171  sprintf cmd, "ModifyGizmo ModifyObject=%s,property={-1,axisColor,0,0,0,1}", obj
1172  execute /q cmd
1173  sprintf cmd, "ModifyGizmo ModifyObject=%s,property={0,ticks,3}", obj
1174  execute /q cmd
1175  sprintf cmd, "ModifyGizmo ModifyObject=%s,property={1,ticks,3}", obj
1176  execute /q cmd
1177  sprintf cmd, "ModifyGizmo ModifyObject=%s,property={2,ticks,3}", obj
1178  execute /q cmd
1179  sprintf cmd, "ModifyGizmo modifyObject=%s property={Clipped,0}", obj
1180  execute /q cmd
1181  sprintf cmd, "ModifyGizmo modifyObject=%s property={-1,fontScaleFactor,2}", obj
1182  execute /q cmd
1183 
1184  sprintf cmd, "ModifyGizmo showAxisCue=1"
1185  execute /q cmd
1186 
1187  setdatafolder savedf
1188  return graphname
1189 };
1190 
1197 variable ad_brick_slicer(wave data){
1198  wave data
1199 
1200  // data folders and references
1201  dfref savedf = GetDataFolderDFR()
1202  dfref datadf = GetWavesDataFolderDFR(data)
1203  string s_datadf = GetDataFolder(1, datadf)
1204  dfref viewdf = make_view_folder(data)
1205 
1206  setdatafolder viewdf
1207  svar /z ex_panel = slicer_panelname
1208  if (svar_exists(ex_panel))
1209  string panels = WinList("SlicerPanel*", ";", "WIN:64")
1210  if (WhichListItem(ex_panel, panels, ";") >= 0)
1211  dowindow /f $(StringFromList(0, panels, ";"))
1212  return 0
1213  endif
1214  endif
1215 
1216  variable /g x_slice_pos
1217  variable /g y_slice_pos
1218  variable /g z_slice_pos
1219  variable /g slab_thickness
1220  string /g brick_path = getwavesdatafolder(data, 2)
1221  variable /g x_autoinc = 0
1222  variable /g y_autoinc = 0
1223  variable /g z_autoinc = 0
1224 
1225  // axis labels
1226  string labels = note(data)
1227  string xlabel = StringByKey("AxisLabelX", labels, "=", "\r")
1228  if (!strlen(xlabel))
1229  xlabel = "X"
1230  endif
1231  string ylabel = StringByKey("AxisLabelY", labels, "=", "\r")
1232  if (!strlen(ylabel))
1233  ylabel = "Y"
1234  endif
1235  string zlabel = StringByKey("AxisLabelZ", labels, "=", "\r")
1236  if (!strlen(zlabel))
1237  zlabel = "Z"
1238  endif
1239  string dlabel = StringByKey("Dataset", labels, "=", "\r")
1240  if (!strlen(dlabel))
1241  dlabel = NameOfWave(data)
1242  endif
1243 
1244  // this section copied from slicer panel
1245  NewPanel /k=1 /W=(500,600,890,940) /N=SlicerPanel as "Brick Slicer"
1246  string /g slicer_panelname = S_name
1247  string panel = s_name
1248 
1249  GroupBox g_xslice win=$panel,pos={8,8},size={376,96},title=xlabel
1250  Slider sl_xslice_position win=$panel,pos={16,32},size={240,56},proc=PearlAreaDisplay#slp_slice_position
1251  Slider sl_xslice_position win=$panel,limits={0,100,1},variable=x_slice_pos,vert= 0
1252  SetVariable sv_xslice_position win=$panel,pos={20,80},size={92,16},proc=PearlAreaDisplay#svp_slice_position,title="X"
1253  SetVariable sv_xslice_position win=$panel,limits={0,100,1},value=x_slice_pos
1254  Button b_xslice_center win=$panel,pos={122,80},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W618"
1255  Button b_xslice_center win=$panel,help={"reset to center position"}
1256  Button b_xslice_extract win=$panel,pos={288,80},size={68,20},proc=PearlAreaDisplay#bp_extract_slice,title="extract slice"
1257  Button b_xslice_extract win=$panel,help={"extract this slice to a separate wave"}
1258  //CheckBox cb_xslab_active win=$panel,pos={288,80},size={80,16},title="Display X Slab"
1259  //CheckBox cb_xslab_active win=$panel,value= 0
1260  TitleBox tb_xslice_animation win=$panel,pos={288,32},size={356,16},title="animation",frame=0
1261  TitleBox tb_xslice_animation win=$panel,anchor= MC
1262  Button b_xslice_back win=$panel,pos={288,48},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W646"
1263  Button b_xslice_back win=$panel,help={"animate backwards"}
1264  Button b_xslice_forward win=$panel,pos={312,48},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W649"
1265  Button b_xslice_forward win=$panel,help={"animate forward"}
1266  Button b_xslice_stop win=$panel,pos={336,48},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W616"
1267  Button b_xslice_stop win=$panel,help={"stop animation"}
1268 
1269  GroupBox g_yslice win=$panel,pos={8,108},size={376,96},title=ylabel
1270  Slider sl_yslice_position win=$panel,pos={16,132},size={240,56},proc=PearlAreaDisplay#slp_slice_position
1271  Slider sl_yslice_position win=$panel,limits={0,100,1},variable=y_slice_pos,vert= 0
1272  SetVariable sv_yslice_position win=$panel,pos={20,180},size={92,16},proc=PearlAreaDisplay#svp_slice_position,title="Y"
1273  SetVariable sv_yslice_position win=$panel,limits={0,100,1},value=y_slice_pos
1274  Button b_yslice_center win=$panel,pos={122,180},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W618"
1275  Button b_yslice_center win=$panel,help={"reset to center position"}
1276  Button b_yslice_extract win=$panel,pos={288,180},size={68,20},proc=PearlAreaDisplay#bp_extract_slice,title="extract slice"
1277  Button b_yslice_extract win=$panel,help={"extract this slice to a separate wave"}
1278  //CheckBox cb_yslab_active win=$panel,pos={288,180},size={80,16},title="Display Y Slab"
1279  //CheckBox cb_yslab_active win=$panel,value= 0
1280  TitleBox tb_yslice_animation win=$panel,pos={288,132},size={356,16},title="animation",frame=0
1281  TitleBox tb_yslice_animation win=$panel,anchor= MC
1282  Button b_yslice_back win=$panel,pos={288,148},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W646"
1283  Button b_yslice_back win=$panel,help={"animate backwards"}
1284  Button b_yslice_forward win=$panel,pos={312,148},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W649"
1285  Button b_yslice_forward win=$panel,help={"animate forward"}
1286  Button b_yslice_stop win=$panel,pos={336,148},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W616"
1287  Button b_yslice_stop win=$panel,help={"stop animation"}
1288 
1289  GroupBox g_zslice win=$panel,pos={8,208},size={376,96},title=zlabel
1290  Slider sl_zslice_position win=$panel,pos={16,232},size={240,56},proc=PearlAreaDisplay#slp_slice_position
1291  Slider sl_zslice_position win=$panel,limits={0,100,1},variable=z_slice_pos,vert= 0
1292  SetVariable sv_zslice_position win=$panel,pos={20,280},size={92,16},proc=PearlAreaDisplay#svp_slice_position,title="Z"
1293  SetVariable sv_zslice_position win=$panel,limits={0,100,1},value=z_slice_pos
1294  Button b_zslice_center win=$panel,pos={122,280},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W618"
1295  Button b_zslice_center win=$panel,help={"reset to center position"}
1296  Button b_zslice_extract win=$panel,pos={288,280},size={68,20},proc=PearlAreaDisplay#bp_extract_slice,title="extract slice"
1297  Button b_zslice_extract win=$panel,help={"extract this slice to a separate wave"}
1298  //CheckBox cb_zslab_active win=$panel,pos={288,280},size={80,16},title="Display Z Slab"
1299  //CheckBox cb_zslab_active win=$panel,value= 0
1300  TitleBox tb_zslice_animation win=$panel,pos={288,232},size={356,16},title="animation",frame=0
1301  TitleBox tb_zslice_animation win=$panel,anchor= MC
1302  Button b_zslice_back win=$panel,pos={288,248},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W646"
1303  Button b_zslice_back win=$panel,help={"animate backwards"}
1304  Button b_zslice_forward win=$panel,pos={312,248},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W649"
1305  Button b_zslice_forward win=$panel,help={"animate forward"}
1306  Button b_zslice_stop win=$panel,pos={336,248},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W616"
1307  Button b_zslice_stop win=$panel,help={"stop animation"}
1308 
1309  TitleBox t_slicerpath win=$panel,pos={8,316},size={128,20},disable=2,title=dlabel
1310  //SetVariable setvar0 win=$panel,pos={240,316},size={120,16},title="slab thickness"
1311  //SetVariable setvar0 win=$panel,limits={1,inf,1},value=slab_thickness
1312 
1313  // update control limits and move slicing planes to the center
1314  setwindow $panel, userdata(control_datafolder) = GetDataFolder(1, viewdf)
1315  setwindow $panel, userdata(brick_path) = brick_path
1317  x_slice_pos = dimoffset(data, 0) + dimsize(data, 0) * dimdelta(data, 0) / 2
1318  y_slice_pos = dimoffset(data, 1) + dimsize(data, 1) * dimdelta(data, 1) / 2
1319  z_slice_pos = dimoffset(data, 2) + dimsize(data, 2) * dimdelta(data, 2) / 2
1320 
1321  svar /z /sdfr=viewdf gizmo_graphname
1322  if (svar_exists(gizmo_graphname) && (strlen(gizmo_graphname) > 0) && (wintype(gizmo_graphname) == 13))
1323  ad_gizmo_set_plane(data, 0, x_slice_pos)
1324  ad_gizmo_set_plane(data, 1, y_slice_pos)
1325  ad_gizmo_set_plane(data, 2, z_slice_pos)
1326  endif
1327  svar /z /sdfr=viewdf slice_graphname
1328  if (svar_exists(slice_graphname) && (strlen(slice_graphname) > 0) && (wintype(slice_graphname) == 1))
1329  ad_profiles_set_slice(data, 2, z_slice_pos)
1330  endif
1331 
1333  setdatafolder savedf
1334 };
1335 
1345 string ad_display_slice(wave data){
1346  wave data
1347 
1348  if (WaveDims(data) != 3)
1349  abort "ad_display_slice: data must be three-dimensional."
1350  endif
1351 
1352  dfref savedf = GetDataFolderDFR()
1353  dfref datadf = GetWavesDataFolderDFR(data)
1354  string s_datadf = GetDataFolder(1, datadf)
1355  dfref viewdf = make_view_folder(data)
1356 
1357  setdatafolder viewdf
1358  string dfname = ReplaceString("root:", s_datadf, "")
1359  dfname = dfname[0, strlen(dfname) - 2]
1360  string graphtitle = dfname + " Slice"
1361 
1362  if (exists("slice_graphname") != 2)
1363  string /g slice_graphname = ""
1364  endif
1365  string /g slice_wavename = CleanupName("slice_" + NameOfWave(data), 0)
1366  svar graphname = slice_graphname
1367  svar slicename = slice_wavename
1368 
1369  make /n=(1,1)/o $slicename
1370  wave slice = $slicename
1371  if ((strlen(graphname) == 0) || (wintype(graphname) != 1))
1372  graphname = ad_display_profiles(slice)
1373  endif
1374  variable z_slice_pos = dimoffset(data, 2) + dimsize(data, 2) * dimdelta(data, 2) / 2
1375  ad_profiles_set_slice(data, 2, z_slice_pos)
1376  ad_profiles_set_cursor(slice, "A", -inf, -inf, pscale=1)
1377  ad_profiles_set_cursor(slice, "B", +inf, +inf, pscale=1)
1378 
1379  setdatafolder savedf
1380  return graphname
1381 };
1382 
1386 static variable update_slice_info(){
1387  dfref savedf = GetDataFolderDFR()
1388 
1389  svar brick_path
1390  //svar slicer_panelname
1391  wave brick = $brick_path
1392 
1393  //dowindow /F $slicer_panelname
1394  variable lo, hi, inc
1395  lo = dimoffset(brick, 0)
1396  inc = dimdelta(brick, 0)
1397  hi = lo + inc * (dimsize(brick, 0) - 1)
1398  Slider sl_xslice_position,limits={lo,hi,inc}
1399  SetVariable sv_xslice_position,limits={lo,hi,inc}
1400  lo = dimoffset(brick, 1)
1401  inc = dimdelta(brick, 1)
1402  hi = lo + inc * (dimsize(brick, 1) - 1)
1403  Slider sl_yslice_position,limits={lo,hi,inc}
1404  SetVariable sv_yslice_position,limits={lo,hi,inc}
1405  lo = dimoffset(brick, 2)
1406  inc = dimdelta(brick, 2)
1407  hi = lo + inc * (dimsize(brick, 2) - 1)
1408  Slider sl_zslice_position,limits={lo,hi,inc}
1409  SetVariable sv_zslice_position,limits={lo,hi,inc}
1410 
1411  setdatafolder savedf
1412 };
1413 
1422 variable ad_gizmo_set_plane(wave brick, variable dim, variable value){
1423  wave brick
1424  variable dim
1425  variable value
1426 
1427  dfref savedf = GetDataFolderDFR()
1428  dfref datadf = GetWavesDataFolderDFR(brick)
1429  dfref viewdf = get_view_folder(brick)
1430  svar /z /sdfr=viewdf graphname=gizmo_graphname
1431 
1432  variable pp = round((value - dimoffset(brick, dim)) / dimdelta(brick, dim))
1433  if ((pp < 0) || (pp >= dimsize(brick, dim)))
1434  return -1// requested value out of range
1435  endif
1436 
1437  if (svar_exists(graphname) && (strlen(graphname) > 0) && (wintype(graphname) == 13))
1438  string axes = "xyz"
1439  string obj = "surface_" + axes[dim] + "mid"
1440  string cmd
1441  sprintf cmd, "ModifyGizmo /N=%s ModifyObject=%s, property={plane, %d}", graphname, obj, pp
1442  execute /q cmd
1443  else
1444  return -2// gizmo window not found
1445  endif
1446 
1447  return 0
1448 };
1449 
1458 variable ad_profiles_set_slice(wave brick, variable dim, variable value){
1459  wave brick
1460  variable dim
1461  variable value
1462 
1463  dfref savedf = GetDataFolderDFR()
1464  dfref datadf = GetWavesDataFolderDFR(brick)
1465  dfref viewdf = get_view_folder(brick)
1466  svar /z /sdfr=viewdf graphname = slice_graphname
1467  svar /z /sdfr=viewdf slicename = slice_wavename
1468 
1469  variable pp = round((value - dimoffset(brick, dim)) / dimdelta(brick, dim))
1470  if ((pp < 0) || (pp >= dimsize(brick, dim)))
1471  return -1// requested value out of range
1472  endif
1473 
1474  if (svar_exists(graphname) && (strlen(graphname) > 0) && (wintype(graphname) == 1))
1475  setdatafolder viewdf
1476  switch(dim)
1477  case 0:// X
1478  wave wdest = ad_extract_slab_x(brick, pp, pp, slicename)
1479  ad_update_profiles(wdest)
1480  break
1481  case 1:// Y
1482  wave wdest = ad_extract_slab_y(brick, pp, pp, slicename)
1483  ad_update_profiles(wdest)
1484  break
1485  case 2:// Z
1486  wave wdest = ad_extract_slab_z(brick, pp, pp, slicename)
1487  ad_update_profiles(wdest)
1488  break
1489  endswitch
1490  else
1491  return -2// graph window not found
1492  endif
1493 
1494  setdatafolder savedf
1495  return 0
1496 };
1497 
1498 static variable slp_slice_position(WMSliderAction* sa){
1499  STRUCT WMSliderAction &sa
1500 
1501  dfref savedf = GetDataFolderDFR()
1502 
1503  switch( sa.eventCode )
1504  case -1:// control being killed
1505  break
1506  default:
1507  if( sa.eventCode & 1 )// value set
1508  string control_datafolder = GetUserData(sa.win, "", "control_datafolder")
1509  setdatafolder control_datafolder
1510  string brick_path = GetUserData(sa.win, "", "brick_path")
1511  wave brick = $brick_path
1512 
1513  string axis = StringFromList(1, sa.ctrlName, "_")
1514  variable dim = char2num(axis[0]) - char2num("x")
1515  ad_gizmo_set_plane(brick, dim, sa.curval)
1516  ad_profiles_set_slice(brick, dim, sa.curval)
1517  endif
1518  break
1519  endswitch
1520 
1521  setdatafolder savedf
1522  return 0
1523 };
1524 
1526 static variable svp_slice_position(WMSetVariableAction* sva){
1527  STRUCT WMSetVariableAction &sva
1528 
1529  dfref savedf = GetDataFolderDFR()
1530 
1531  switch( sva.eventCode )
1532  case 1:// mouse up
1533  case 2:// Enter key
1534  case 3:// Live update
1535  string control_datafolder = GetUserData(sva.win, "", "control_datafolder")
1536  setdatafolder control_datafolder
1537  string brick_path = GetUserData(sva.win, "", "brick_path")
1538  wave brick = $brick_path
1539 
1540  string axis = StringFromList(1, sva.ctrlName, "_")
1541  variable dim = char2num(axis[0]) - char2num("x")
1542  ad_gizmo_set_plane(brick, dim, sva.dval)
1543  ad_profiles_set_slice(brick, dim, sva.dval)
1544  break
1545  case -1:// control being killed
1546  break
1547  endswitch
1548 
1549  setdatafolder savedf
1550  return 0
1551 };
1552 
1554 static variable bp_move_slice(WMButtonAction* ba){
1555  STRUCT WMButtonAction &ba
1556 
1557  dfref savedf = GetDataFolderDFR()
1558 
1559  switch( ba.eventCode )
1560  case 2:// mouse up
1561  string control_datafolder = GetUserData(ba.win, "", "control_datafolder")
1562  setdatafolder control_datafolder
1563  string brick_path = GetUserData(ba.win, "", "brick_path")
1564  wave brick = $brick_path
1565 
1566  string axis = StringFromList(1, ba.ctrlName, "_")
1567  string cmd = StringFromList(2, ba.ctrlName, "_")
1568  variable dim = char2num(axis[0]) - char2num("x")
1569  string posvariable = getdatafolder(1) + axis[0] + "_slice_pos"
1570 
1571  nvar pos = $(posvariable)
1572  strswitch (cmd)
1573  case "forward":
1574  ad_slicer_start_bg(brick, dim, posvariable, dimdelta(brick, dim))
1575  break
1576  case "back":
1577  ad_slicer_start_bg(brick, dim, posvariable, -dimdelta(brick, dim))
1578  break
1579  case "center":
1580  ad_slicer_stop_bg(posvariable)
1581  bp_move_slice_center(brick, dim, posvariable)
1582  break
1583  case "stop":
1584  ad_slicer_stop_bg(posvariable)
1585  break
1586  endswitch
1587  break
1588  case -1:// control being killed
1589  break
1590  endswitch
1591 
1592  setdatafolder savedf
1593  return 0
1594 };
1595 
1599 static variable bp_extract_slice(WMButtonAction* ba){
1600  STRUCT WMButtonAction &ba
1601 
1602  dfref savedf = GetDataFolderDFR()
1603 
1604  switch( ba.eventCode )
1605  case 2:// mouse up
1606  string control_datafolder = GetUserData(ba.win, "", "control_datafolder")
1607  setdatafolder control_datafolder
1608  string brick_path = GetUserData(ba.win, "", "brick_path")
1609  wave brick = $brick_path
1610  dfref brickdf = GetWavesDataFolderDFR(brick)
1611 
1612  string axis = StringFromList(1, ba.ctrlName, "_")
1613  string cmd = StringFromList(2, ba.ctrlName, "_")
1614  variable dim = char2num(axis[0]) - char2num("x")
1615  string posvariable = getdatafolder(1) + axis[0] + "_slice_pos"
1616 
1617  nvar pos = $(posvariable)
1618  variable pp = round((pos - dimoffset(brick, dim)) / dimdelta(brick, dim))
1619  if ((pp < 0) || (pp >= dimsize(brick, dim)))
1620  return -1// requested value out of range
1621  endif
1622 
1623  variable dig = ceil(log(dimsize(brick, dim)))
1624  string slicename
1625  sprintf slicename, "%s_%s%0*u", NameOfWave(brick), axis[0], dig, pp
1626  setdatafolder brickdf
1627  switch(dim)
1628  case 0:// X
1629  wave wdest = ad_extract_slab_x(brick, pp, pp, slicename)
1630  break
1631  case 1:// Y
1632  wave wdest = ad_extract_slab_y(brick, pp, pp, slicename)
1633  break
1634  case 2:// Z
1635  wave wdest = ad_extract_slab_z(brick, pp, pp, slicename)
1636  break
1637  endswitch
1638 
1639  string msg
1640  sprintf msg, "%s=%g", axis[0], pos
1641  note wdest, msg
1642 
1643  break
1644  case -1:// control being killed
1645  break
1646  endswitch
1647 
1648  setdatafolder savedf
1649  return 0
1650 };
1651 
1653 static variable bp_move_slice_center(wave brick, variable dim, string posvariable){
1654  wave brick
1655  variable dim
1656  string posvariable
1657 
1658  nvar pos = $posvariable
1659  pos = dimoffset(brick, dim) + dimdelta(brick, dim) * dimsize(brick, dim) / 2
1660  ad_gizmo_set_plane(brick, dim, pos)
1661  ad_profiles_set_slice(brick, dim, pos)
1662 };
1663 
1665 static variable ad_slicer_move_bg(WMBackgroundStruct* s){
1666  STRUCT WMBackgroundStruct &s
1667 
1668  dfref savedf = GetDataFolderDFR()
1669  setdatafolder root:pearl_area:slicer
1670  wave /t bg_brickpaths
1671  wave /t bg_graphnames
1672  wave /t bg_variablepaths
1673  wave bg_dimensions
1674  wave bg_increments
1675 
1676  variable ii
1677  variable nn = numpnts(bg_brickpaths)
1678  variable dim
1679  variable pp
1680 
1681  for (ii = 0; ii < nn; ii += 1)
1682  wave /z brick = $bg_brickpaths[ii]
1683  nvar /z pos = $bg_variablepaths[ii]
1684  dim = bg_dimensions[0]
1685  pos += bg_increments[ii]
1686  // wrap around at limits
1687  pp = round((pos - dimoffset(brick, dim)) / dimdelta(brick, dim))
1688  if (pp <= -0.5)
1689  pos = dimoffset(brick, dim) + dimdelta(brick, dim) * (dimsize(brick, dim) - 1)
1690  else if (pp >= dimsize(brick, dim) - 0.5)
1691  pos = dimoffset(brick, dim)
1692  endif
1693  if (waveexists(brick))
1694  ad_gizmo_set_plane(brick, dim, pos)
1695  ad_profiles_set_slice(brick, dim, pos)
1696  endif
1697  endfor
1698 
1699  setdatafolder savedf
1700  return 0
1701 };
1702 
1705  dfref savedf = GetDataFolderDFR()
1706  setdatafolder root:
1707  newdatafolder /o/s pearl_area
1708  newdatafolder /o/s slicer
1709 
1710  make /n=0/o/t bg_brickpaths
1711  make /n=0/o/t bg_variablepaths
1712  make /n=0/o/i/u bg_dimensions
1713  make /n=0/o bg_increments
1714 
1715  CtrlNamedBackground ad_slicer, period = 30, proc = PearlAreaDisplay#ad_slicer_move_bg
1716 
1717  setdatafolder savedf
1718  return 0
1719 };
1720 
1728 variable ad_slicer_start_bg(wave brick, variable dimension, string posvariable, variable delta){
1729  wave brick// 3D data wave
1730  variable dimension// dimension to animate, 0, 1, or 2
1731  string posvariable// full path to the global position variable
1732  variable delta// step increment, should be +/- dimdelta
1733 
1734  dfref savedf = GetDataFolderDFR()
1735  setdatafolder root:pearl_area:slicer
1736  wave /t bg_brickpaths
1737  wave /t bg_variablepaths
1738  wave bg_dimensions
1739  wave bg_increments
1740 
1741  // create entry in ad_slicer background task table
1742  variable idx
1743  FindValue /TEXT=posvariable /TXOP=4 /Z bg_variablepaths
1744  if (v_value >= 0)
1745  idx = v_value
1746  else
1747  idx = numpnts(bg_variablepaths)
1748  InsertPoints idx, 1, bg_brickpaths, bg_variablepaths, bg_dimensions, bg_increments
1749  endif
1750 
1751  // set background task
1752  bg_brickpaths[idx] = GetWavesDataFolder(brick, 2)
1753  bg_variablepaths[idx] = posvariable
1754  bg_dimensions[idx] = dimension
1755  bg_increments[idx] = delta
1756 
1757  // start background task
1758  if (numpnts(bg_variablepaths) > 0)
1759  CtrlNamedBackground ad_slicer, start
1760  endif
1761 
1762  setdatafolder savedf
1763  return 0
1764 };
1765 
1770 variable ad_slicer_stop_bg(string posvariable){
1771  string posvariable
1772 
1773  dfref savedf = GetDataFolderDFR()
1774  setdatafolder root:pearl_area:slicer
1775  wave /t bg_brickpaths
1776  wave /t bg_variablepaths
1777  wave bg_dimensions
1778  wave bg_increments
1779 
1780  // find entry in ad_slicer background task table
1781  FindValue /TEXT=posvariable /TXOP=4 /Z bg_variablepaths
1782  if (v_value >= 0)
1783  DeletePoints v_value, 1, bg_brickpaths, bg_variablepaths, bg_dimensions, bg_increments
1784  endif
1785 
1786  // stop background task if task table is empty
1787  if (numpnts(bg_variablepaths) == 0)
1788  CtrlNamedBackground ad_slicer, stop
1789  endif
1790 
1791  setdatafolder savedf
1792  return 0
1793 };
1794 
threadsafe wave ad_extract_slab_x(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
+
variable ad_profiles_cursor_mode(wave image, variable mode)
switch cursors on a profiles graph
+
static variable ad_slicer_move_bg(WMBackgroundStruct *s)
move a slice by one step (background task).
+
static variable set_trace_colors(string graphname)
+
static variable slp_slice_position(WMSliderAction *sa)
+
variable ad_slicer_start_bg(wave brick, variable dimension, string posvariable, variable delta)
start the animation.
+
variable ad_profiles_crosshairs(wave image, variable clear=defaultValue)
draw permanent crosshairs in a profiles graph.
+
variable ad_update_profiles(wave image)
update a profiles graph with new data.
+
variable ad_slicer_stop_bg(string posvariable)
stop the animation.
+
variable ad_default_image_filter(wave image, string options)
abstract filter function for image display.
+
static variable svp_smoothing(WMSetVariableAction *sva)
+
variable ad_brick_slicer(wave data)
open a slicer panel for 3D data.
+
variable ad_profiles_set_slice(wave brick, variable dim, variable value)
set the position of the slicing plane of a 3D brick in a profiles window.
+
static dfr get_view_folder(wave source)
find the view data folder corresponding to the given source.
+
variable ad_calc_histogram(wave image)
calculate the histogram.
+
static dfr make_view_folder(wave source)
create a view data folder.
+
threadsafe wave ad_extract_slab_z(wave dataset, variable r1, variable r2, string destname, variable noavg=defaultValue)
+
variable ad_calc_profiles(wave image, variable pa, variable qa, variable pb, variable qb)
calculate profiles, statistics, and histogram of a rectangular region of interest.
+
variable ad_profiles_set_cursor(wave image, string cursorname, variable xa, variable ya, variable pscale=defaultValue)
move a cursor to the specified position in a profiles graph.
+
static wave get_view_image(wave source)
find the view image wave corresponding to the given source.
+
instant visualization of angle scan and manipulator position.
+
static variable bp_extract_slice(WMButtonAction *ba)
export a slice (button procedure).
+
static variable pmp_export(WMPopupAction *pa)
+
static wave get_source_image(wave view)
find the source image wave corresponding to the given view.
+
string ad_display_histogram(wave image)
display the histogram of a 2D image.
+
threadsafe wave ad_extract_slab_y(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
+
string ad_display(wave image)
open a new graph window with a 2D image.
+
static string graphname_from_dfref(dfref df, string prefix)
compose a valid and unique graph name from a data folder reference
+
variable ad_calc_cursor_profiles(wave image)
calculate profiles, statistics, and histogram of a cross-hair delimited region of interest...
+
static variable update_slice_info()
update controls with data scale limits.
+
variable ad_slicer_init_bg()
initialize the slice animation background task.
+
string ad_display_profiles(wave image, string filter=defaultValue)
open a new profiles graph window.
+
static variable svp_slice_position(WMSetVariableAction *sva)
set slice coordinate (button procedure).
+
static variable bp_reset_cursors(WMButtonAction *ba)
+
variable ad_export_profile(wave view_image, variable dim, variable trace=defaultValue, variable show=defaultValue, variable overwrite=defaultValue)
export a profile from a profiles graph to the source data folder.
+
variable ad_gizmo_set_plane(wave brick, variable dim, variable value)
set the position of a slicing plane of a 3D brick in a Gizmo window.
+
variable ad_transpose_filter(wave image, string options)
transpose image filter.
+
string ad_display_slice(wave data)
display three-dimensional data by 2D slice.
+
static variable bp_move_slice_center(wave brick, variable dim, string posvariable)
move the slice to the center of the dimension (button procedure).
+
static variable bp_move_slice(WMButtonAction *ba)
move slice (button procedure).
+
variable ad_box_filter(wave image, string options)
boxcar smoothing filter.
+
string ad_display_brick(wave data)
open a new "gizmo" window with three-dimensional data.
+
variable ad_profiles_hook(WMWinHookStruct *s)
hook function for user events in the profiles window.
+
+
+ + + + diff --git a/doc/html/pearl-area-import_8ipf.html b/doc/html/pearl-area-import_8ipf.html new file mode 100644 index 0000000..228337b --- /dev/null +++ b/doc/html/pearl-area-import_8ipf.html @@ -0,0 +1,1294 @@ + + + + + + +PEARL Procedures: pearl-area-import.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-area-import.ipf File Reference
+
+
+ +

HDF5 file import from EPICS area detectors. +More...

+
#include <HDF5 Browser>
+#include "pearl-gui-tools"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlAreaImport
 HDF5 file import from EPICS area detectors.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

static variable BeforeFileOpenHook (variable refNum, string fileName, string path, string type, string creator, variable kind)
 callback function for drag&drop of HDF5 files into Igor. More...
 
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. More...
 
variable ad_load_dialog (string APathName)
 load area detector data files selected in a file dialog window More...
 
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. More...
 
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. More...
 
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. More...
 
string adh5_load_info (string APathName, string AFileName)
 load descriptive info from a HDF5 file created by the Area Detector software. More...
 
variable adh5_load_detector (variable fileID, string detectorpath)
 load the detector dataset from the open HDF5 file. More...
 
variable adh5_redim (wave data)
 redimension a multi-dimensional area detector array loaded from HDF5. More...
 
static dfr GetAttrDataFolderDFR (wave data)
 find the attributes data folder of an area detector dataset. More...
 
variable adh5_scale (wave data, string source=defaultValue)
 set the dimension scales of an area detector dataset. More...
 
variable adh5_load_detector_slabs (variable fileID, string detectorpath, variable progress=defaultValue)
 load the detector dataset from the open HDF5 file. More...
 
variable adh5_load_detector_image (variable fileID, string detectorpath, variable dim2start, variable dim2count, variable dim3start, variable dim3count)
 load a single image from the detector dataset of the open HDF5 file More...
 
string adh5_list_reduction_funcs ()
 get a list of functions which can be used as reduction functions. More...
 
threadsafe variable adh5_default_reduction (wave source, wave dest1, wave dest2, string *param)
 function prototype for adh5_load_reduced_detector More...
 
threadsafe variable adh5_setup_profile (wave image, wave profile, variable dim)
 set up a one-dimensional wave for a line profile based on a 2D original wave. More...
 
string adh5_test_reduction_func (wave source, wave dest1, wave dest2, funcref reduction_func, string reduction_param)
 wrapper function for testing reduction functions from the command line. More...
 
variable adh5_load_reduced_detector (variable fileID, string detectorpath, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
 load a reduced detector dataset from the open HDF5 file. More...
 
static threadsafe variable reduce_slab_worker (funcref reduction_func)
 
static threadsafe variable reduce_slab_image (wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param)
 
variable adh5_loadattr_all (variable fileID, string attributespath)
 load an NDAttributes group from an open HDF5 file into the current data folder. More...
 
static variable read_attribute_info (string datawavename, string source, variable *idest)
 sub-function of adh5_loadattr_all. More...
 
variable adh5_scale_scienta (wave data)
 set the energy and angle scales of an area detector dataset from the Scienta analyser. More...
 
variable adh5_scale_scan (wave data)
 scales the extra dimensions of an area detector dataset according to the EPICS scan More...
 
+

Detailed Description

+

HDF5 file import from EPICS area detectors.

+

HDF5 file import from EPICS area detectors such as CCD cameras, 2D electron analysers

+

as of Igor 6.3, Igor can open datasets of up to rank 4. i.e. the extra dimension Y of the file plugin cannot be used. the extra dimensions N and X are supported.

+ +

Definition in file pearl-area-import.ipf.

+

Function Documentation

+ +
+
+ + + + + + + + +
variable ad_load_dialog (string APathName)
+
+ +

load area detector data files selected in a file dialog window

+
Parameters
+ + +
APathNameIgor symbolic path name. if empty, Igor will choose a folder on its own
+
+
+ +

Definition at line 159 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

if the file name follows the naming convention source-date-index.extension, the function tries to generate the nick name as source_date_index. otherwise it's just a cleaned up version of the file name.

+

date must be in yyyymmdd or yymmdd format and is clipped to the short yymmdd format. index should be a running numeric index of up to 6 digits, or the time encoded as hhmmss. however, in the current version index can be any string that can be a valid Igor folder name.

+
Parameters
+ + + + + +
filenamefile name, including extension. can also include a folder path (which is ignored). the extension is currently ignored, but may be used to select the parent folder in a later version.
ignoredateif non-zero, the nick name will not include the date part. defaults to zero.
sourcenamenick name of the data source. by default, the function tries to detect the source from the file name. this option can be used to override auto-detection. the automatic source names are: sci (scienta by area detector), psh (pshell), sl (optics slit camera by area detector), es (end station camera by area detector), xy (unidentified).
uniqueif non-zero, the resulting name is made a unique data folder name in the current data folder defaults to zero.
+
+
+ +

Definition at line 98 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable adh5_default_reduction (wave source,
wave dest1,
wave dest2,
string * param 
)
+
+ +

function prototype for adh5_load_reduced_detector

+

derived functions reduce a two-dimensional dataset to a one-dimensional dataset, e.g. by ROI-integration, curve fitting, etc. each destination wave is a one-dimensional intensity distribution. the function must redimension each of these waves to one of the image dimensions by calling the adh5_setup_profile() function. this function will also copy the scale information and dimension labels, which is important for the proper scaling of the result.

+

the meaning of the data in dest1 and dest2 is up to the particular function, e.g. dest1 could hold the mean value and dest2 the one-sigma error, or dest1 could hold the X-profile, and dest2 the Y-profile.

+
Parameters
+ + + + +
sourcesource wave two-dimensional intensity distribution (image)
dest1,dest2destination waves
paramstring with optional parameters, shared between calls. this is a pass-by-reference argument, the function may modify the string
+
+
+
Returns
zero if successful, non-zero if an error occurs.
+ +

Definition at line 1093 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + +
string adh5_list_reduction_funcs ()
+
+ +

get a list of functions which can be used as reduction functions.

+

the function evaluates only the function arguments, it may thus include functions which are not suitable as reduction functions.

+ +

Definition at line 1033 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

if the data is from the electron analyser driver and some special attributes are included, the function will set the scales of the image dimensions.

+
Parameters
+ + + + + + +
ANickNamedestination folder name (top level under root)
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
load_data1 (default): load data; 0: do not load data
load_attr1 (default): load attributes; 0: do not load attributes for proper wave scaling, the attributes must be loaded
+
+
+ +

Definition at line 199 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable adh5_load_detector (variable fileID,
string detectorpath 
)
+
+ +

load the detector dataset from the open HDF5 file.

+

the function loads the whole dataset at once and redimensions it so that the image dimensions are X and Y

+
Parameters
+ + + +
fileIDID of open HDF5 file from HDF5OpenFile
detectorpathpath to detector group in the HDF5 file
+
+
+ +

Definition at line 573 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable adh5_load_detector_image (variable fileID,
string detectorpath,
variable dim2start,
variable dim2count,
variable dim3start,
variable dim3count 
)
+
+ +

load a single image from the detector dataset of the open HDF5 file

+

the function can average over a region in the extra dimensions.

+
Parameters
+ + + + + + + +
fileIDID of open HDF5 file from HDF5OpenFile
detectorpathpath to detector group in the HDF5 file
dim2start2nd dimension coordinate of the first image note that the order of dimensions is reversed in the file 2nd dimension = N dimension in area detector = dimension 0 of the three-dimensional HDF dataset set to 0 if dimension may not be present
dim2countnumber of subsequent images to average set to 1 if dimension may not be present
dim3start3rd dimension coordinate of the first image note that the order of dimensions is reversed in the file 3rd dimension = extra X dimension in area detector = dimension 0 of the four-dimensional HDF dataset set to 0 if dimension may not be present
dim3countnumber of subsequent images to average set to 1 if dimension may not be present
+
+
+ +

Definition at line 937 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable adh5_load_detector_slabs (variable fileID,
string detectorpath,
variable progress = defaultValue 
)
+
+ +

load the detector dataset from the open HDF5 file.

+

the function loads the dataset image by image using the hyperslab option. this function gives the same result as adh5_load_detector. it is about 5% slower, and it depends on HDF5 Browser code. but it does not choke on large datasets (as long as the final wave fits into memory).

+
Parameters
+ + + + +
fileIDID of open HDF5 file from HDF5OpenFile.
detectorpathpath to detector group in the HDF5 file.
progress1 (default): show progress window; 0: do not show progress window.
+
+
+
Returns
0 if successful, non-zero if an error occurred.
+ +

Definition at line 772 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string adh5_load_info (string APathName,
string AFileName 
)
+
+ +

load descriptive info from a HDF5 file created by the Area Detector software.

+

the information returned is the array size and active scans

+
Attention
EXPERIMENTAL this function should be merged with adh5_load_preview
+
Parameters
+ + + +
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
+
+
+ +

Definition at line 489 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

the data wave is loaded into the current data folder. attributes are loaded into the attr subfolder. existing waves in attr are deleted.

+
Warning
EXPERIMENTAL this function uses the root:pearl_area:preview data folder. existing data there may be deleted!
+
Parameters
+ + + + + + +
ANickNamedestination wave name. the wave is created in the current data folder.
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
load_data1 (default): load data; 0: do not load data
load_attr1 (default): load attributes; 0: do not load attributes note: for correct scaling of the image, the attributes need to be loaded
+
+
+ +

Definition at line 379 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

the resulting dataset is reduced in one image dimension by a user-defined reduction function, e.g. by region-of-interest integration, curve fitting, etc.

+

the function loads the dataset image by image using the hyperslab option and applies a custom reduction function to each image. the results from the reduction function are composed into one result wave. the raw data are discarded.

+

if the data is from the electron analyser driver and some special attributes are included, the function will set the scales of the image dimensions.

+
Parameters
+ + + + + + + + + +
ANickNamedestination folder name (top level under root)
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
reduction_funccustom reduction function (any user-defined function which has the same parameters as adh5_default_reduction())
reduction_paramparameter string for the reduction function
load_data1 (default): load data; 0: do not load data
load_attr1 (default): load attributes; 0: do not load attributes for proper wave scaling, the attributes must be loaded
progress1 (default): show progress window; 0: do not show progress window
+
+
+ +

Definition at line 294 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable adh5_load_reduced_detector (variable fileID,
string detectorpath,
funcref reduction_func,
string reduction_param,
variable progress = defaultValue,
variable nthreads = defaultValue 
)
+
+ +

load a reduced detector dataset from the open HDF5 file.

+

the function loads the dataset image by image using the hyperslab option and applies a custom reduction function to each image. the results from the reduction function are composed into one result wave. the raw data are discarded.

+

by default, the reduction function is called in separate threads to reduce the total loading time. (see the global variable adh5_perf_secs which reports the total run time of the function.) the effect varies depending on the balance between file loading (image size) and data processing (complexity of the reduction function). for debugging the reduction function, multi-threading can be disabled.

+
Parameters
+ + + + + + + +
fileIDID of open HDF5 file from HDF5OpenFile
detectorpathpath to detector group in the HDF5 file
reduction_funccustom reduction function (any user-defined function which has the same parameters as adh5_default_reduction())
reduction_paramparameter string for the reduction function
progress1 (default): show progress window; 0: do not show progress window
nthreads-1 (default): use as many threads as there are processor cores (in addition to main thread) 0: use main thread only (e.g. for debugging the reduction function) >= 1: use a fixed number of (additional) threads
+
+
+ +

Definition at line 1162 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable adh5_loadattr_all (variable fileID,
string attributespath 
)
+
+ +

load an NDAttributes group from an open HDF5 file into the current data folder.

+

datasets contained in the group are loaded as waves. if a dataset contains only one data point, it is added to the IN, ID, IV, IU waves, where IN = EPICS channel name, ID = attribute name, IV = value, IU = unit (units are left empty as they are not saved in HDF5). attributes of the NDAttributes group are added to the IN, ID, IV, IU waves, however, IN and IU are left empty as this information is not saved in the HDF5 file.

+
Parameters
+ + + +
fileIDID of open HDF5 file from HDF5OpenFile
attributespathpath to NDAttributes group in the HDF5 file
+
+
+ +

Definition at line 1479 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable adh5_redim (wave data)
+
+ +

redimension a multi-dimensional area detector array loaded from HDF5.

+

so that the image dimensions are X and Y singleton dimensions are removed (most common cases only)

+

in the redimensioned array, the original dimension type is noted in the dimension label: AD_Dim0 = first image dimension AD_Dim1 = second image dimension AD_DimN = frame sequence AD_DimX = extra dimension X AD_DimY = extra dimension Y (cannot be loaded in Igor)

+
Parameters
+ + +
dataarea detector data loaded from HDF5 to be redimensioned
+
+
+ +

Definition at line 618 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable adh5_scale (wave data,
string source = defaultValue 
)
+
+ +

set the dimension scales of an area detector dataset.

+

the intrinsic dimensions 0 and 1 are scaled according to the data source (currently supported: Prosilica cameras, Scienta electron analyser). the extra dimensions are scaled according to the scan. the latter requires that the positioner names and position values are available.

+ +

Definition at line 718 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable adh5_scale_scan (wave data)
+
+ +

scales the extra dimensions of an area detector dataset according to the EPICS scan

+

the scan positioner name and its values must be available

+
Todo:
incomplete
+ +

Definition at line 1719 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable adh5_scale_scienta (wave data)
+
+ +

set the energy and angle scales of an area detector dataset from the Scienta analyser.

+

the dimension labels of the energy and angle scales must be set correctly: AD_Dim0 = energy dimension; AD_Dim1 = angle dimension. these dimensions must be the first two dimensions of a multi-dimensional dataset. normally, AD_Dim0 is the X dimension, and AD_Dim1 the Y dimension.

+ +

Definition at line 1614 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable adh5_setup_profile (wave image,
wave profile,
variable dim 
)
+
+ +

set up a one-dimensional wave for a line profile based on a 2D original wave.

+

redimensions the profile wave to the given dimension. copies the scale and dimension label of the given dimension.

+ +

Definition at line 1113 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string adh5_test_reduction_func (wave source,
wave dest1,
wave dest2,
funcref reduction_func,
string reduction_param 
)
+
+ +

wrapper function for testing reduction functions from the command line.

+

Igor does not allow global variables as pass-by-reference parameter for reduction_param.

+ +

Definition at line 1128 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable BeforeFileOpenHook (variable refNum,
string fileName,
string path,
string type,
string creator,
variable kind 
)
+
+static
+
+ +

callback function for drag&drop of HDF5 files into Igor.

+ +

Definition at line 34 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static dfr GetAttrDataFolderDFR (wave data)
+
+static
+
+ +

find the attributes data folder of an area detector dataset.

+

since version 1.04 attributes should be stored in a subfolder named attr. earlier versions had the attributes in the same data folder as the actual dataset.

+
Parameters
+ + +
datawave containing the main dataset.
+
+
+
Returns
data folder reference of the attributes folder. the reference may be invalid (and default to root) if the folder cannot be found, cf. built-in DataFolderRefStatus function.
+ +

Definition at line 699 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static variable read_attribute_info (string datawavename,
string source,
variable * idest 
)
+
+static
+
+ +

sub-function of adh5_loadattr_all.

+

reads one attribute from a wave which was loaded from an HDF5 file into the info waves IN, ID, IV, IU. the attribute is read only if the input wave contains exactly one item, i.e. either the measurement is a single image, or the attribute has string type.

+
Parameters
+ + + + +
datawavenamename of the attribute wave in the current folder. can be text or numeric.
sourcesource identifier (EPICS name) of the attribute.
idestdestination index in IN, ID, IV, IU where the results are written. the variable is incremented if data was written, otherwise it is left unchanged. make sure IN, ID, IV, IU have at least idest + 1 elements.
+
+
+ +

Definition at line 1561 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static threadsafe variable reduce_slab_image (wave slabdata,
wave image,
wave profile1,
wave profile2,
funcref reduction_func,
string reduction_param 
)
+
+static
+
+ +

Definition at line 1444 of file pearl-area-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static threadsafe variable reduce_slab_worker (funcref reduction_func)
+
+static
+
+ +

Definition at line 1405 of file pearl-area-import.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-area-import_8ipf.js b/doc/html/pearl-area-import_8ipf.js new file mode 100644 index 0000000..10fcda9 --- /dev/null +++ b/doc/html/pearl-area-import_8ipf.js @@ -0,0 +1,27 @@ +var pearl_area_import_8ipf = +[ + [ "ad_load_dialog", "pearl-area-import_8ipf.html#aedff2e67d2e1bac907f2eaf24a6e5c3c", null ], + [ "ad_suggest_foldername", "pearl-area-import_8ipf.html#ad28dbbba73e553f7b5dcf8baf1c86786", null ], + [ "adh5_default_reduction", "pearl-area-import_8ipf.html#a245034d7a94536a24c78a7bfe22725b7", null ], + [ "adh5_list_reduction_funcs", "pearl-area-import_8ipf.html#aa5e29dc1a380311d00a5f85be867e47b", null ], + [ "adh5_load_complete", "pearl-area-import_8ipf.html#ab1040bf272c69dc69777b2f91df41fab", null ], + [ "adh5_load_detector", "pearl-area-import_8ipf.html#a84dc7f466b42dde5d96c49827b2122cf", null ], + [ "adh5_load_detector_image", "pearl-area-import_8ipf.html#a931a7bfaaf75d308a0ce3c74ffc751bc", null ], + [ "adh5_load_detector_slabs", "pearl-area-import_8ipf.html#a4a9741d1c19b10bb98b73bd5163a497b", null ], + [ "adh5_load_info", "pearl-area-import_8ipf.html#ac76d5ba94a3d7c864437420d80c77064", null ], + [ "adh5_load_preview", "pearl-area-import_8ipf.html#a98f29671bdce6a5981e8865de8b9d483", null ], + [ "adh5_load_reduced", "pearl-area-import_8ipf.html#a98f9339cd2fae80d0d92451df88395aa", null ], + [ "adh5_load_reduced_detector", "pearl-area-import_8ipf.html#a3f2ac36f961941e46e80a775de8300e5", null ], + [ "adh5_loadattr_all", "pearl-area-import_8ipf.html#acde16dc7a393250b17165344f865f7b5", null ], + [ "adh5_redim", "pearl-area-import_8ipf.html#acfa6d2675e63f4f686289ef853b262a9", null ], + [ "adh5_scale", "pearl-area-import_8ipf.html#a774751d1857ea6946a942448dc913128", null ], + [ "adh5_scale_scan", "pearl-area-import_8ipf.html#a1fdcc02340375afe8d8cd7537c6e9cfb", null ], + [ "adh5_scale_scienta", "pearl-area-import_8ipf.html#a227e4db1c51a910dcf86d355473fe74e", null ], + [ "adh5_setup_profile", "pearl-area-import_8ipf.html#a9439de3b676e686eeca4e6b2588c01a6", null ], + [ "adh5_test_reduction_func", "pearl-area-import_8ipf.html#a706fb32ee79b589366dec1cf9f7e9d02", null ], + [ "BeforeFileOpenHook", "pearl-area-import_8ipf.html#ae2cfa1ac6651cfc3fb0dfce03494995b", null ], + [ "GetAttrDataFolderDFR", "pearl-area-import_8ipf.html#aa3cdc56096a6a1bf2a2d80a6245a36d2", null ], + [ "read_attribute_info", "pearl-area-import_8ipf.html#ac98a5f2d12b559aba4e53192c49a7743", null ], + [ "reduce_slab_image", "pearl-area-import_8ipf.html#acf0315ec8a3e927ef161a35cb05adb8b", null ], + [ "reduce_slab_worker", "pearl-area-import_8ipf.html#a33f8faf117450af1d6dae9ef48786cd6", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-area-import_8ipf_source.html b/doc/html/pearl-area-import_8ipf_source.html new file mode 100644 index 0000000..4509a4c --- /dev/null +++ b/doc/html/pearl-area-import_8ipf_source.html @@ -0,0 +1,154 @@ + + + + + + +PEARL Procedures: pearl-area-import.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-area-import.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.2
3 #pragma ModuleName = PearlAreaImport
4 #pragma version = 1.06
5 #include <HDF5 Browser>
6 #include "pearl-gui-tools"
7 
8 // copyright (c) 2013-16 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 
26 
31 
34 static variable BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind){
35  variable refNum, kind
36  string fileName, path, type, creator
37 
38  variable handledOpen = 0
39 
40  //PathInfo $path
41  //string FilePath = s_path + filename
42  string NickName = CleanupName(ParseFilePath(3, FileName, ":", 0, 0), 0)
43  string FileExt = LowerStr(ParseFilePath(4, FileName, ":", 0, 0))
44  string result = ""
45 
46  // override nickname with custom setting
47  svar /z cnn = gsCustomNickName
48  if (svar_exists(cnn))
49  if (exists("gvNickNameIndex") != 2)
50  variable/g gvNickNameIndex = 1
51  endif
52  nvar nni = gvNickNameIndex
53  NickName = cnn + num2str(nni)
54  nni += 1
55  endif
56 
57  if (stringmatch(FileExt, "h5") == 1)
58  result = adh5_load_complete(NickName, path, FileName)
59  endif
60 
61  string/g s_latest_datafile = result
62  string/g s_latest_nickname = nickname
63 
64  handledOpen = strlen(result) > 0
65  if (handledOpen)
66  close refnum
67  endif
68 
69  return handledOpen// 1 tells Igor not to open the file
70 };
71 
98 string ad_suggest_foldername(string filename, variable ignoredate = defaultValue, string sourcename = defaultValue, variable unique = defaultValue){
99  string filename
100  variable ignoredate
101  string sourcename
102  variable unique
103 
104  if (ParamIsDefault(ignoredate))
105  ignoredate = 0
106  endif
107  if (ParamIsDefault(unique))
108  unique = 0
109  endif
110 
111  string basename = ParseFilePath(3, filename, ":", 0, 0)
112  string extension = ParseFilePath(4, filename, ":", 0, 0)
113  string nickname
114 
115  string autosource
116  if (strsearch(basename, "scienta", 0, 2) >= 0)
117  autosource = "sci"
118  else if (strsearch(basename, "pshell", 0, 2) >= 0)
119  autosource = "psh"
120  else if (strsearch(basename, "OP-SL", 0, 2) >= 0)
121  autosource = "sl"
122  else if (strsearch(basename, "ES-PS", 0, 2) >= 0)
123  autosource = "es"
124  else
125  autosource = "xy"
126  endif
127  if (ParamIsDefault(sourcename))
128  sourcename = autosource
129  endif
130 
131  variable nparts = ItemsInList(basename, "-")
132  if (nparts >= 3)
133  string datepart = StringFromList(1, basename, "-")
134  variable l_datepart = strlen(datepart)
135  if (l_datepart == 8)
136  datepart = datepart[l_datepart-6, l_datepart-1]
137  endif
138  string indexpart = StringFromList(2, basename, "-")
139  if (ignoredate)
140  sprintf nickname, "%s_%s", sourcename, indexpart
141  else
142  sprintf nickname, "%s_%s_%s", sourcename, datepart, indexpart
143  endif
144  else
145  nickname = CleanupName(basename, 0)
146  endif
147 
148  if (unique && CheckName(nickname, 11))
149  nickname = UniqueName(nickname + "_", 11, 0)
150  endif
151 
152  return nickname
153 };
154 
159 variable ad_load_dialog(string APathName){
160  string APathName
161 
162  variable refNum
163  string message = "Select data files"
164  string filepaths
165  string filefilters = "Area Detector HDF5 Files (*.h5):.h5;"
166  filefilters += "All Files:.*;"
167 
168  PathInfo /S $APathName
169  Open /D /R /F=filefilters /M=message /MULT=1 refNum
170  filepaths = S_fileName
171 
172  dfref saveDF = GetDataFolderDFR()
173  setdatafolder root:
174 
175  if (strlen(filepaths) > 0)
176  variable nfiles = ItemsInList(filepaths, "\r")
177  variable ifile
178  for(ifile = 0; ifile < nfiles; ifile += 1)
179  String path = StringFromList(ifile, filepaths, "\r")
180  string nickname = ad_suggest_foldername(path)
181  adh5_load_complete(nickname, "", path)
182  endfor
183  endif
184 
185  setdatafolder saveDF
186 };
187 
199 string adh5_load_complete(string ANickName, string APathName, string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
200  string ANickName
201  string APathName
202  string AFileName
203  variable load_data
204  variable load_attr
205 
206  if (ParamIsDefault(load_data))
207  load_data = 1
208  endif
209  if (ParamIsDefault(load_attr))
210  load_attr = 1
211  endif
212 
213  dfref saveDF = GetDataFolderDFR()
214  setdatafolder root:
215  newdatafolder /s/o $("root:" + ANickName)
216 
217  // open file
218  variable fileID
219  string instrumentpath = "/entry/instrument/"
220  string detectorpath = instrumentpath + "detector/"
221  string attributespath = instrumentpath + "NDAttributes/"
222  string datasetname
223  string datawavename
224 
225  // performance monitoring
226  variable timerRefNum
227  variable /g adh5_perf_secs
228  timerRefNum = startMSTimer
229 
230  // avoid compilation error if HDF5 XOP has not been loaded
231  #if Exists("HDF5OpenFile")
232  HDF5OpenFile /P=$APathName/R fileID as AFileName
233  if (v_flag == 0)
234  AFileName = s_path + s_filename
235  print "loading " + s_filename + "\r"
236 
237  if (load_data)
238  adh5_load_detector_slabs(fileID, detectorpath)
239  endif
240  if (load_attr)
241  newdatafolder /o/s attr
242  adh5_loadattr_all(fileID, attributespath)
243  setdatafolder ::
244  endif
245 
246  wave /z data
247  if (waveexists(data))
248  //adh5_redim(data) // not to be used with adh5_load_detector_slabs
249  adh5_scale(data)
250  endif
251 
252  HDF5CloseFile fileID
253  else
254  AFileName = ""
255  endif
256  #else
257  Abort "HDF5 XOP not loaded."
258  #endif
259 
260  if (timerRefNum >= 0)
261  adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
262  endif
263 
264  setdatafolder saveDF
265  return AFileName
266 };
267 
294 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){
295  string ANickName
296  string APathName
297  string AFileName
298 
299  funcref adh5_default_reduction reduction_func
300  string reduction_param
301 
302  variable load_data
303  variable load_attr
304  variable progress
305 
306  if (ParamIsDefault(load_data))
307  load_data = 1
308  endif
309  if (ParamIsDefault(load_attr))
310  load_attr = 1
311  endif
312  if (ParamIsDefault(progress))
313  progress = 1
314  endif
315 
316  dfref saveDF = GetDataFolderDFR()
317  setdatafolder root:
318  newdatafolder /s/o $("root:" + ANickName)
319 
320  // open file
321  variable fileID
322  string instrumentpath = "/entry/instrument/"
323  string detectorpath = instrumentpath + "detector/"
324  string attributespath = instrumentpath + "NDAttributes/"
325  string datasetname
326  string datawavename
327 
328  // performance monitoring
329  variable timerRefNum
330  variable /g adh5_perf_secs
331  timerRefNum = startMSTimer
332 
333  // avoid compilation error if HDF5 XOP has not been loaded
334  #if Exists("HDF5OpenFile")
335  HDF5OpenFile /P=$APathName/R fileID as AFileName
336  if (v_flag == 0)
337  AFileName = s_path + s_filename
338  print "loading " + s_filename + "\r"
339 
340  if (load_attr)
341  newdatafolder /o/s attr
342  adh5_loadattr_all(fileID, attributespath)
343  setdatafolder ::
344  endif
345  if (load_data)
346  adh5_load_reduced_detector(fileID, detectorpath, reduction_func, reduction_param, progress=progress)
347  endif
348 
349  HDF5CloseFile fileID
350  else
351  AFileName = ""
352  endif
353  #else
354  Abort "HDF5 XOP not loaded."
355  #endif
356 
357  if (timerRefNum >= 0)
358  adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
359  endif
360 
361  setdatafolder saveDF
362  return AFileName
363 };
364 
379 string adh5_load_preview(string ANickName, string APathName, string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
380  string ANickName
381  string APathName
382  string AFileName
383  variable load_data
384  variable load_attr
385 
386  if (ParamIsDefault(load_data))
387  load_data = 1
388  endif
389  if (ParamIsDefault(load_attr))
390  load_attr = 1
391  endif
392 
393  dfref saveDF = GetDataFolderDFR()
394  setdatafolder root:
395  newdatafolder /o/s pearl_area
396  newdatafolder /o/s preview
397 
398  // open file
399  variable fileID
400  string instrumentpath = "/entry/instrument/"
401  string detectorpath = instrumentpath + "detector/"
402  string attributespath = instrumentpath + "NDAttributes/"
403  string datasetname
404  string datawavename
405 
406  // performance monitoring
407  variable timerRefNum
408  variable /g adh5_perf_secs
409  timerRefNum = startMSTimer
410 
411  // avoid compilation error if HDF5 XOP has not been loaded
412  #if Exists("HDF5OpenFile")
413  HDF5OpenFile /P=$APathName/R/Z fileID as AFileName
414  if (v_flag == 0)
415  AFileName = s_path + s_filename
416 
417  // detector data
418  datasetname = detectorpath + "data"
419  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
420  InitHDF5DataInfo(di)
421  variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
422  if (err != 0)
423  print "error accessing detector/data"
424  return ""
425  endif
426  if (di.ndims < 2)
427  print "error: rank of dataset < 2"
428  return ""
429  endif
430 
431  variable dim2start = 0, dim2count = 1, dim3start = 0, dim3count = 1
432  if (di.ndims >= 3)
433  dim2start = floor(di.dims[di.ndims - 3] / 2)
434  dim2count = 1
435  endif
436  if (di.ndims >= 4)
437  dim3start = floor(di.dims[di.ndims - 4] / 2)
438  dim3count = 1
439  endif
440 
441  if (load_data)
442  adh5_load_detector_image(fileID, detectorpath, dim2start, dim2count, dim3start, dim3count)
443  wave /z data
444  string destpath = GetDataFolder(1, saveDF) + ANickName
445  if (waveexists(data))
446  duplicate /o data, $destpath
447  wave /z data = $destpath
448  endif
449  endif
450 
451  if (load_attr)
452  setdatafolder saveDF
453  newdatafolder /o/s attr
454  killwaves /a/z
455  adh5_loadattr_all(fileID, attributespath)
456  setdatafolder ::
457  if (waveexists(data))
458  adh5_scale(data)
459  endif
460  endif
461 
462  HDF5CloseFile fileID
463  else
464  print "error opening file " + AFileName
465  AFileName = ""
466  endif
467  #else
468  Abort "HDF5 XOP not loaded."
469  #endif
470 
471  if (timerRefNum >= 0)
472  adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
473  endif
474 
475  setdatafolder saveDF
476  return AFileName
477 };
478 
489 string adh5_load_info(string APathName, string AFileName){
490  string APathName
491  string AFileName
492 
493  dfref saveDF = GetDataFolderDFR()
494 
495  // open file
496  variable fileID
497  string instrumentpath = "/entry/instrument/"
498  string detectorpath = instrumentpath + "detector/"
499  string attributespath = instrumentpath + "NDAttributes/"
500  string datasetname
501  string datawavename
502 
503  string s_info = ""
504  string s
505 
506  variable idim
507 
508  // avoid compilation error if HDF5 XOP has not been loaded
509  #if Exists("HDF5OpenFile")
510  HDF5OpenFile /P=$APathName/R/Z fileID as AFileName
511  if (v_flag == 0)
512  AFileName = s_path + s_filename
513 
514  // detector data
515  datasetname = detectorpath + "data"
516  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
517  InitHDF5DataInfo(di)
518  variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
519  if (err != 0)
520  print "error accessing detector/data"
521  return ""
522  endif
523 
524  for (idim = 0; idim < di.ndims; idim += 1)
525  sprintf s, "dim %u: %u points", idim, di.dims[idim]
526  if (strlen(s_info) > 0)
527  s_info = s_info + "\r" + s
528  else
529  s_info = s
530  endif
531  endfor
532 
533  dfref df = NewFreeDataFolder()
534  setdatafolder df
535  adh5_loadattr_all(fileID, attributespath)
536 
537  for (idim = 1; idim < 5; idim += 1)
538  sprintf s, "Scan%uActive", idim
539  wave /z w = $s
540  if (waveexists(w) && (numpnts(w) > 0) && (w[0] > 0))
541  sprintf s, "Scan%uPositioner1", idim
542  wave /t wt = $s
543  sprintf s, "scan %u: %s", idim, wt[0]
544  if (strlen(s_info) > 0)
545  s_info = s_info + "\r" + s
546  else
547  s_info = s
548  endif
549  endif
550  endfor
551 
552  HDF5CloseFile fileID
553  else
554  print "error opening file " + AFileName
555  AFileName = ""
556  endif
557  #else
558  Abort "HDF5 XOP not loaded."
559  #endif
560 
561  setdatafolder saveDF
562  return s_info
563 };
564 
573 variable adh5_load_detector(variable fileID, string detectorpath){
574  variable fileID
575  string detectorpath
576 
577  // avoid compilation error if HDF5 XOP has not been loaded
578  #if Exists("HDF5LoadData")
579  string datasetname
580  string datawavename
581 
582  // detector data
583  datasetname = detectorpath + "data"
584  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
585  InitHDF5DataInfo(di)
586  variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
587  if (err != 0)
588  print "error accessing detector/data"
589  return -1
590  endif
591  if (di.ndims < 2)
592  print "error: rank of dataset < 2"
593  return -2
594  endif
595 
596  HDF5LoadData /O /Q /Z fileID, datasetname
597  wave data
598 
599  #else
600  Abort "HDF5 XOP not loaded."
601  #endif
602 };
603 
618 variable adh5_redim(wave data){
619  wave data
620 
621  duplicate /free data, tempdata
622  variable nd = wavedims(tempdata)
623  variable nx = dimsize(tempdata, nd - 1)
624  variable ny = dimsize(tempdata, nd - 2)
625  variable nz = dimsize(tempdata, nd - 3)
626  variable nt = dimsize(tempdata, nd - 4)
627 
628  switch (nd)
629  case 2:
630  if (nx <= 1)
631  redimension /n=(ny) data
632  setdimlabel 0, -1, AD_Dim1, data
633  data = tempdata[p][0]
634  else if (ny <= 1)
635  redimension /n=(nx) data
636  setdimlabel 0, -1, AD_Dim0, data
637  data = tempdata[0][p]
638  else
639  redimension /n=(nx,ny) data
640  setdimlabel 0, -1, AD_Dim0, data
641  setdimlabel 1, -1, AD_Dim1, data
642  data = tempdata[q][p]
643  endif
644  break
645  case 3:
646  if (nx <= 1)
647  redimension /n=(ny,nz) data
648  setdimlabel 0, -1, AD_Dim1, data
649  setdimlabel 1, -1, AD_DimN, data
650  multithread data = tempdata[q][p][0]
651  else if (ny <= 1)
652  redimension /n=(nx,nz) data
653  setdimlabel 0, -1, AD_Dim0, data
654  setdimlabel 1, -1, AD_DimN, data
655  multithread data = tempdata[q][0][p]
656  else if (nz <= 1)
657  redimension /n=(nx,ny) data
658  setdimlabel 0, -1, AD_Dim0, data
659  setdimlabel 1, -1, AD_Dim1, data
660  multithread data = tempdata[0][q][p]
661  else
662  redimension /n=(nx,ny,nz) data
663  setdimlabel 0, -1, AD_Dim0, data
664  setdimlabel 1, -1, AD_Dim1, data
665  setdimlabel 2, -1, AD_DimN, data
666  multithread data = tempdata[r][q][p]
667  endif
668  break
669  case 4:
670  if (nz <= 1)
671  // singleton "frame number" dimension
672  redimension /n=(nx,ny,nt) data
673  setdimlabel 0, -1, AD_Dim0, data
674  setdimlabel 1, -1, AD_Dim1, data
675  setdimlabel 2, -1, AD_DimX, data
676  multithread data = tempdata[r][0][q][p]
677  else
678  redimension /n=(nx,ny,nz,nt) data
679  setdimlabel 0, -1, AD_Dim0, data
680  setdimlabel 1, -1, AD_Dim1, data
681  setdimlabel 2, -1, AD_DimN, data
682  setdimlabel 3, -1, AD_DimX, data
683  multithread data = tempdata[s][r][q][p]
684  endif
685  break
686  endswitch
687 };
688 
699 static dfr GetAttrDataFolderDFR(wave data){
700  wave data
701 
702  dfref dataDF = GetWavesDataFolderDFR(data)
703  dfref attrDF = dataDF:attr
704  if (DataFolderRefStatus(attrDF) == 0)
705  attrDF = dataDF
706  endif
707 
708  return attrDF
709 };
710 
718 variable adh5_scale(wave data, string source = defaultValue){
719  wave data
720  string source
721 
722  dfref saveDF = GetDataFolderDFR()
723  dfref dataDF = GetWavesDataFolderDFR(data)
724  dfref attrDF = GetAttrDataFolderDFR(data)
725 
726  if (ParamIsDefault(source))
727  // is the source a Scienta analyser?
728  wave /SDFR=attrDF /Z AcquisitionMode
729  wave /SDFR=attrDF /T /Z Manufacturer
730  source = "unknown"
731  if (waveexists(Manufacturer) && (numpnts(Manufacturer) >= 1))
732  strswitch(Manufacturer[0])
733  case "VG Scienta":
734  source = "scienta"
735  break
736  case "Prosilica":
737  source = "prosilica"
738  break
739  endswitch
740  else if (waveexists(AcquisitionMode) && (numpnts(AcquisitionMode) >= 1))
741  if (stringmatch(note(AcquisitionMode), "*SCIENTA*"))
742  source = "scienta"
743  endif
744  endif
745  endif
746 
747  strswitch(source)
748  case "prosilica":
749  // pixel scale - nothing to do
750  break
751  case "scienta":
752  adh5_scale_scienta(data)
753  break
754  endswitch
755 
756  setdatafolder saveDF
757 };
758 
772 variable adh5_load_detector_slabs(variable fileID, string detectorpath, variable progress = defaultValue){
773  variable fileID
774  string detectorpath
775  variable progress
776 
777  if (ParamIsDefault(progress))
778  progress = 1
779  endif
780  variable result = 0
781 
782  // avoid compilation error if HDF5 XOP has not been loaded
783  #if Exists("HDF5LoadData")
784  string datasetname
785  string datawavename
786 
787  // detector data
788  datasetname = detectorpath + "data"
789  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
790  InitHDF5DataInfo(di)
791  variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
792  if (err != 0)
793  print "error accessing detector/data"
794  return -1
795  endif
796  if (di.ndims < 2)
797  print "error: rank of dataset < 2"
798  return -2
799  endif
800 
801  // nx and nz are the image dimensions
802  variable idx, idy, idz, idt, izt
803  idx = di.ndims - 1
804  idy = di.ndims - 2
805  idz = -1
806  idt = -1
807 
808  variable nx, ny, nz, nt, nzt
809  nx = di.dims[idx]
810  ny = di.dims[idy]
811  nz = 1
812  nt = 1
813 
814  make /n=(nx,ny,nz,nt) /o data
815  string dim_labels = "AD_Dim0;AD_Dim1;AD_DimN;AD_DimX;AD_DimY"
816  string dim_label
817  dim_label = StringFromList(0, dim_labels, ";")
818  setdimlabel 0, -1, $dim_label, data
819  dim_labels = RemoveFromList(dim_label, dim_labels, ";")
820  dim_label = StringFromList(0, dim_labels, ";")
821  setdimlabel 1, -1, $dim_label, data
822  dim_labels = RemoveFromList(dim_label, dim_labels, ";")
823 
824  // find additional dimensions, ignore singletons
825  variable id
826  for (id = idy - 1; (id >= 0) && (nz == 1); id -= 1)
827  if (di.dims[id] > 1)
828  idz = id
829  nz = di.dims[id]
830  dim_label = StringFromList(0, dim_labels, ";")
831  setdimlabel 2, -1, $dim_label, data
832  endif
833  dim_labels = RemoveListItem(0, dim_labels, ";")
834  endfor
835  for (id = idz - 1; (id >= 0) && (nt == 1); id -= 1)
836  if (di.dims[id] > 1)
837  idt = id
838  nt = di.dims[id]
839  dim_label = StringFromList(0, dim_labels, ";")
840  setdimlabel 3, -1, $dim_label, data
841  endif
842  dim_labels = RemoveListItem(0, dim_labels, ";")
843  endfor
844  redimension /n=(nx,ny,nz,nt) data
845 
846  // default values if dimensions are not present in dataset
847  if (idz < 0)
848  idz = idx + 1
849  idt = idz + 1
850  else if (idt < 0)
851  idt = idx + 1
852  endif
853 
854  nzt = nz * nt
855  izt = 0
856  if (progress)
857  display_progress_panel("HDF5 Import", "Loading data...", nzt)
858  endif
859 
860  // load data image by image
861  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
862  wave slab
863  slab[][%Start] = 0
864  slab[][%Stride] = 1
865  slab[][%Count] = 1
866  slab[][%Block] = 1
867  slab[idx][%Block] = nx
868  slab[idy][%Block] = ny
869 
870  variable iz, it
871  for (iz = 0; iz < nz; iz += 1)
872  for (it = 0; it < nt; it += 1)
873  slab[idz][%Start] = iz
874  slab[idt][%Start] = it
875  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
876  wave slabdata// 2D, 3D, or 4D with singletons
877  switch (WaveDims(slabdata))
878  case 2:
879  data[][][iz][it] = slabdata[q][p]
880  break
881  case 3:
882  data[][][iz][it] = slabdata[0][q][p]
883  break
884  case 4:
885  data[][][iz][it] = slabdata[0][0][q][p]
886  break
887  endswitch
888  // progress window
889  izt += 1
890  if (progress)
891  if (update_progress_panel(izt))
892  result = -4// user abort
893  break
894  endif
895  endif
896  endfor
897  if (result < 0)
898  break
899  endif
900  endfor
901 
902  if (nz == 1)
903  redimension /n=(nx,ny) data
904  else if (nt == 1)
905  redimension /n=(nx,ny,nz) data
906  endif
907 
908  if (progress)
910  endif
911  #else
912  Abort "HDF5 XOP not loaded."
913  #endif
914 
915  return result
916 };
917 
937 variable adh5_load_detector_image(variable fileID, string detectorpath, variable dim2start, variable dim2count, variable dim3start, variable dim3count){
938  variable fileID
939  string detectorpath
940  variable dim2start
941  variable dim2count
942  variable dim3start
943  variable dim3count
944 
945  // avoid compilation error if HDF5 XOP has not been loaded
946  #if Exists("HDF5LoadData")
947  string datasetname
948  string datawavename
949 
950  // detector data
951  datasetname = detectorpath + "data"
952  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
953  InitHDF5DataInfo(di)
954  variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
955  if (err != 0)
956  print "error accessing detector/data"
957  return -1
958  endif
959  if (di.ndims < 1)
960  print "error: rank of dataset < 1"
961  return -2
962  endif
963 
964  // nx and nz are the image dimensions
965  variable idx, idy, idz, idt
966  idx = di.ndims - 1
967  idy = di.ndims >= 2 ? di.ndims - 2 : 1
968  idz = di.ndims >= 3 ? di.ndims - 3 : 2
969  idt = di.ndims >= 4 ? di.ndims - 4 : 3
970 
971  variable nx, ny
972  nx = di.dims[idx]
973  ny = di.ndims >= 2 ? di.dims[idy] : 1
974 
975  variable dim2end = dim2start + dim2count - 1
976  variable dim3end = dim3start + dim3count - 1
977 
978  // the slab wave is at least 4-dimensional
979  // it will also load lower-dimensional datasets
980  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
981  wave slab
982  slab[][%Start] = 0
983  slab[][%Stride] = 1
984  slab[][%Count] = 1
985  slab[][%Block] = 1
986  slab[idx][%Block] = nx
987  slab[idy][%Block] = ny
988 
989  make /n=(nx,ny)/o/d data
990  data = 0
991  variable iz, it
992  variable navg = 0
993  for (iz = dim2start; iz <= dim2end; iz += 1)
994  for (it = dim3start; it <= dim3end; it += 1)
995  slab[idz][%Start] = iz
996  slab[idt][%Start] = it
997  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
998  wave slabdata// 2D, 3D, or 4D with singletons
999  switch (WaveDims(slabdata))
1000  case 1:
1001  data += slabdata[p]
1002  navg += 1
1003  break
1004  case 2:
1005  data += slabdata[q][p]
1006  navg += 1
1007  break
1008  case 3:
1009  data += slabdata[0][q][p]
1010  navg += 1
1011  break
1012  case 4:
1013  data += slabdata[0][0][q][p]
1014  navg += 1
1015  break
1016  endswitch
1017  endfor
1018  endfor
1019  data /= navg
1020  setdimlabel 0, -1, AD_Dim0, data
1021  setdimlabel 1, -1, AD_Dim1, data
1022 
1023  #else
1024  Abort "HDF5 XOP not loaded."
1025  #endif
1026 };
1027 
1034  string all_funcs = FunctionList("*", ";", "KIND:6,NPARAMS:4,VALTYPE:1")
1035  string result = ""
1036 
1037  variable ii
1038  variable nn = ItemsInList(all_funcs, ";")
1039 
1040  string funcname
1041  string info
1042  variable nparams
1043  variable accept
1044 
1045  for (ii = 0; ii < nn; ii += 1)
1046  funcname = StringFromList(ii, all_funcs, ";")
1047  info = FunctionInfo(funcname)
1048  accept = (NumberByKey("RETURNTYPE", info, ":", ";") == 0x0004)
1049  accept = accept && (cmpstr(StringByKey("THREADSAFE", info, ":", ";"), "yes") == 0)
1050  accept = accept && (NumberByKey("N_PARAMS", info, ":", ";") == 4)
1051  accept = accept && (NumberByKey("N_OPT_PARAMS", info, ":", ";") == 0)
1052  if (accept)
1053  // 3 numeric waves and one pass-by-reference string
1054  accept = accept && (NumberByKey("PARAM_0_TYPE", info, ":", ";") == 0x4002)
1055  accept = accept && (NumberByKey("PARAM_1_TYPE", info, ":", ";") == 0x4002)
1056  accept = accept && (NumberByKey("PARAM_2_TYPE", info, ":", ";") == 0x4002)
1057  accept = accept && (NumberByKey("PARAM_3_TYPE", info, ":", ";") == 0x3000)
1058  endif
1059  if (accept)
1060  result = AddListItem(funcname, result, ";")
1061  endif
1062  endfor
1063 
1064  result = SortList(result, ";", 4)
1065  return result
1066 };
1067 
1072 // the resulting wave must have the same size as either dimension of the source image.
1093 threadsafe variable adh5_default_reduction(wave source, wave dest1, wave dest2, string* param){
1094  wave source
1095  wave dest1, dest2
1096  string &param
1097 
1098  // demo code
1099  // integrate along the dimensions
1100  adh5_setup_profile(source, dest1, 0)
1101  ad_profile_x_w(source, 0, -1, dest1)
1102  adh5_setup_profile(source, dest2, 1)
1103  ad_profile_y_w(source, 0, -1, dest2)
1104 
1105  return 0
1106 };
1107 
1113 threadsafe variable adh5_setup_profile(wave image, wave profile, variable dim){
1114  wave image// prototype
1115  wave profile// destination wave
1116  variable dim// which dimension to keep: 0 = X, 1 = Y
1117 
1118  redimension /n=(dimsize(image, dim)) profile
1119  setscale /p x dimoffset(image, dim), dimdelta(image, dim), waveunits(image, dim), profile
1120  setscale d 0, 0, waveunits(image, -1), profile
1121  setdimlabel 0, -1, $getdimlabel(image, dim, -1), profile
1122 };
1123 
1128 string adh5_test_reduction_func(wave source, wave dest1, wave dest2, funcref reduction_func, string reduction_param){
1129  wave source
1130  wave dest1
1131  wave dest2
1132  funcref adh5_default_reduction reduction_func
1133  string reduction_param
1134 
1135  reduction_func(source, dest1, dest2, reduction_param)
1136 
1137  return reduction_param
1138 };
1139 
1162 variable adh5_load_reduced_detector(variable fileID, string detectorpath, funcref reduction_func, string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
1163  variable fileID
1164  string detectorpath
1165  funcref adh5_default_reduction reduction_func
1166  string reduction_param
1167  variable progress
1168  variable nthreads
1169 
1170  if (ParamIsDefault(progress))
1171  progress = 1
1172  endif
1173  if (ParamIsDefault(nthreads))
1174  nthreads = -1
1175  endif
1176  variable result = 0
1177 
1178  // avoid compilation error if HDF5 XOP has not been loaded
1179  #if Exists("HDF5LoadData")
1180  string datasetname
1181  string datawavename
1182 
1183  // detector data
1184  datasetname = detectorpath + "data"
1185  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
1186  InitHDF5DataInfo(di)
1187  variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
1188  if (err != 0)
1189  print "error accessing detector/data"
1190  return -1
1191  endif
1192  if (di.ndims < 2)
1193  print "error: rank of dataset < 2"
1194  return -2
1195  endif
1196 
1197  // nx and nz are the image dimensions
1198  variable idx, idy, idz, idt
1199  idx = di.ndims - 1
1200  idy = di.ndims - 2
1201  idz = -1
1202  idt = -1
1203 
1204  variable nx, ny, nz, nt
1205  nx = di.dims[idx]
1206  ny = di.dims[idy]
1207  nz = 1
1208  nt = 1
1209 
1210  // find additional dimensions, ignore singletons
1211  variable id
1212  for (id = idy - 1; (id >= 0) && (nz == 1); id -= 1)
1213  if (di.dims[id] > 1)
1214  idz = id
1215  nz = di.dims[id]
1216  endif
1217  endfor
1218  for (id = idz - 1; (id >= 0) && (nt == 1); id -= 1)
1219  if (di.dims[id] > 1)
1220  idt = id
1221  nt = di.dims[id]
1222  endif
1223  endfor
1224  // default values if dimensions are not present in dataset
1225  if (idz < 0)
1226  idz = idx + 1
1227  idt = idz + 1
1228  else if (idt < 0)
1229  idt = idx + 1
1230  endif
1231  variable nzt = nz * nt
1232  variable izt
1233 
1234  // load data image by image
1235  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
1236  wave slab
1237  slab[][%Start] = 0
1238  slab[][%Stride] = 1
1239  slab[][%Count] = 1
1240  slab[][%Block] = 1
1241  slab[idx][%Block] = nx
1242  slab[idy][%Block] = ny
1243 
1244  // set up multi threading
1245  if (nthreads < 0)
1246  nthreads = ThreadProcessorCount
1247  endif
1248  if (nthreads > 0)
1249  variable threadGroupID = ThreadGroupCreate(nthreads)
1250  variable ithread
1251  for (ithread = 0; ithread < nthreads; ithread += 1)
1252  ThreadStart threadGroupID, ithread, reduce_slab_worker(reduction_func)
1253  endfor
1254  else
1255  make /n=(nzt) /df /free processing_folders
1256  endif
1257 
1258  if (progress)
1259  display_progress_panel("HDF5 Import", "Loading data (step 1 of 2)...", nzt)
1260  endif
1261 
1262  make /n=(nx,ny)/d image_template
1263  setdimlabel 0, -1, AD_Dim0, image_template
1264  setdimlabel 1, -1, AD_Dim1, image_template
1265  adh5_scale(image_template)
1266 
1267  variable iz, it
1268  string dfname
1269  izt = 0
1270  for (iz = 0; iz < nz; iz += 1)
1271  for (it = 0; it < nt; it += 1)
1272  // load hyperslab
1273  slab[idz][%Start] = iz
1274  slab[idt][%Start] = it
1275  dfname = "processing_" + num2str(izt)
1276  newdatafolder /s $dfname
1277  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
1278 
1279  // send to processing queue
1280  duplicate image_template, image
1281  variable /g r_index = iz
1282  variable /g s_index = it
1283  string /g func_param = reduction_param
1284 
1285  if (nthreads > 0)
1286  WaveClear image
1287  ThreadGroupPutDF threadGroupID, :
1288  else
1289  processing_folders[izt] = GetDataFolderDFR()
1290  make /n=1/d profile1, profile2
1291  wave slabdata
1292  variable /g func_result
1293  func_result = reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
1294  WaveClear slabdata, image, profile1, profile2
1295  setdatafolder ::
1296  endif
1297 
1298  izt += 1
1299  // progress window
1300  if (progress)
1301  if (update_progress_panel(izt))
1302  result = -4// user abort
1303  break
1304  endif
1305  endif
1306  endfor
1307  endfor
1308 
1309  killwaves /z slab, image_template
1310  if (progress)
1311  update_progress_panel(0, message="Processing data (step 2 of 2)...")
1312  endif
1313 
1314  dfref dfr
1315  for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
1316  if (nthreads > 0)
1317  do
1318  dfr = ThreadGroupGetDFR(threadGroupID, 1000)
1319  if (DatafolderRefStatus(dfr) != 0)
1320  break
1321  endif
1322  if (progress)
1323  if (update_progress_panel(izt))
1324  result = -4// user abort
1325  break
1326  endif
1327  endif
1328  while (1)
1329  else
1330  dfr = processing_folders[izt]
1331  if (progress)
1332  if (update_progress_panel(izt))
1333  result = -4// user abort
1334  break
1335  endif
1336  endif
1337  endif
1338 
1339  if (result != 0)
1340  break
1341  endif
1342 
1343  nvar rr = dfr:r_index
1344  nvar ss = dfr:s_index
1345  nvar func_result = dfr:func_result
1346  wave profile1 = dfr:profile1
1347  wave profile2 = dfr:profile2
1348 
1349  if (func_result == 0)
1350  if (izt == 0)
1351  make /n=(dimsize(profile1, 0), nz, nt)/d/o data1
1352  make /n=(dimsize(profile2, 0), nz, nt)/d/o data2
1353  setdimlabel 0, -1, $getdimlabel(profile1, 0, -1), data1
1354  setdimlabel 0, -1, $getdimlabel(profile2, 0, -1), data2
1355  setscale /p x dimoffset(profile1, 0), dimdelta(profile1, 0), waveunits(profile1, 0), data1
1356  setscale /p x dimoffset(profile2, 0), dimdelta(profile2, 0), waveunits(profile2, 0), data2
1357  setscale d 0, 0, waveunits(profile1, -1), data1
1358  setscale d 0, 0, waveunits(profile2, -1), data2
1359  endif
1360  data1[][rr][ss] = profile1[p]
1361  data2[][rr][ss] = profile2[p]
1362  else
1363  result = -3// dimension reduction error
1364  break
1365  endif
1366  endfor
1367 
1368  if (nthreads > 0)
1369  variable tstatus = ThreadGroupRelease(threadGroupID)
1370  if (tstatus == -2)
1371  result = -5// thread did not terminate properly
1372  endif
1373  else
1374  for (izt = 0; izt < nzt; izt += 1)
1375  KillDataFolder /Z processing_folders[izt]
1376  endfor
1377  endif
1378 
1379  if (result == 0)
1380  if (nz == 1)
1381  redimension /n=(dimsize(data1,0)) data1
1382  redimension /n=(dimsize(data2,0)) data2
1383  else if (nt == 1)
1384  redimension /n=(dimsize(data1,0),nz) data1
1385  redimension /n=(dimsize(data2,0),nz) data2
1386  setdimlabel 1, -1, AD_DimN, data1
1387  setdimlabel 1, -1, AD_DimN, data2
1388  else
1389  setdimlabel 1, -1, AD_DimN, data1
1390  setdimlabel 1, -1, AD_DimN, data2
1391  setdimlabel 2, -1, AD_DimX, data1
1392  setdimlabel 2, -1, AD_DimX, data2
1393  endif
1394  endif
1395  if (progress)
1397  endif
1398 
1399  #else
1400  Abort "HDF5 XOP not loaded."
1401  #endif
1402  return result
1403 };
1404 
1405 threadsafe static variable reduce_slab_worker(funcref reduction_func){
1406  funcref adh5_default_reduction reduction_func
1407  do
1408  // wait for job from main thread
1409  do
1410  dfref dfr = ThreadGroupGetDFR(0, 1000)
1411  if (DataFolderRefStatus(dfr) == 0)
1412  if (GetRTError(2))
1413  return 0// no more jobs
1414  endif
1415  else
1416  break
1417  endif
1418  while (1)
1419 
1420  // get input data
1421  wave slabdata = dfr:slabdata
1422  wave image = dfr:image
1423  svar func_param = dfr:func_param
1424  nvar rr = dfr:r_index
1425  nvar ss = dfr:s_index
1426 
1427  // do the work
1428  newdatafolder /s outDF
1429  make /n=1/d profile1, profile2
1430  variable /g r_index = rr
1431  variable /g s_index = ss
1432  variable /g func_result
1433  func_result = reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
1434 
1435  // send output to queue and clean up
1436  WaveClear slabdata, image, profile1, profile2
1437  ThreadGroupPutDF 0, :
1438  KillDataFolder dfr
1439  while (1)
1440 
1441  return 0
1442 };
1443 
1444 threadsafe static variable reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param){
1445  wave slabdata
1446  wave image
1447  wave profile1
1448  wave profile2
1449  funcref adh5_default_reduction reduction_func
1450  string reduction_param
1451 
1452  switch (WaveDims(slabdata))
1453  case 2:
1454  image = slabdata[q][p]
1455  break
1456  case 3:
1457  image = slabdata[0][q][p]
1458  break
1459  case 4:
1460  image = slabdata[0][0][q][p]
1461  break
1462  endswitch
1463 
1464  return reduction_func(image, profile1, profile2, reduction_param)
1465 };
1466 
1479 variable adh5_loadattr_all(variable fileID, string attributespath){
1480  variable fileID
1481  string attributespath
1482 
1483  string datasetname
1484  string datawavename
1485 
1486  // avoid compilation error if HDF5 XOP has not been loaded
1487  #if Exists("HDF5LoadData")
1488 
1489  // datasets in NDAttributes group
1490  HDF5ListGroup /F /TYPE=2 fileID, attributespath
1491  string h5datasets = S_HDF5ListGroup
1492  HDF5ListAttributes /TYPE=1 /Z fileID, attributespath
1493  string h5attributes = S_HDF5ListAttributes
1494 
1495  variable nds = ItemsInList(h5datasets, ";")
1496  variable na = ItemsInList(h5attributes, ";")
1497  variable ids
1498  variable idest = 0
1499  variable n_attr
1500  string s_attr
1501  string s_source
1502 
1503  make /n=(nds+na) /t /o IN, ID, IV, IU
1504 
1505  for (ids = 0; ids < nds; ids += 1)
1506  datasetname = StringFromList(ids, h5datasets, ";")
1507  HDF5LoadData /O/Q fileID, datasetname
1508  if (v_flag == 0)
1509  datawavename = StringFromList(0, s_wavenames)
1510  else
1511  datawavename = ""
1512  endif
1513  HDF5LoadData /A="source"/O/Q/TYPE=2 fileID, datasetname
1514  if (v_flag == 0)
1515  wave /t source
1516  s_source = source[0]
1517  else
1518  s_source = ""
1519  endif
1520  read_attribute_info(datawavename, s_source, idest)
1521  endfor
1522 
1523  // attributes of NDAttributes group
1524  if (v_flag == 0)
1525  nds = ItemsInList(h5attributes, ";")
1526  else
1527  nds = 0
1528  endif
1529  for (ids = 0; ids < nds; ids += 1)
1530  datasetname = StringFromList(ids, h5attributes, ";")
1531  HDF5LoadData /A=datasetname/O/Q/TYPE=1 fileID, attributespath
1532  if (v_flag == 0)
1533  datawavename = StringFromList(0, s_wavenames)
1534  read_attribute_info(datawavename, "", idest)// we don't get the source of these attributes
1535  endif
1536  endfor
1537 
1538  redimension /n=(idest) IN, ID, IV, IU
1539  sort {IN, ID}, IN, ID, IV, IU
1540 
1541  killwaves /z source
1542  #else
1543  Abort "HDF5 XOP not loaded."
1544  #endif
1545 
1546 };
1547 
1561 static variable read_attribute_info(string datawavename, string source, variable* idest){
1562  string datawavename// name of the attribute wave in the current folder.
1563  // can be text or numeric.
1564  string source
1565  // source identifier (EPICS name) of the attribute.
1566  variable &idest
1567  // destination index in IN, ID, IV, IU where the results are written.
1568  // the variable is incremented if data was written, otherwise it is left unchanged.
1569  // make sure IN, ID, IV, IU have at least idest + 1 elements.
1570 
1571  wave /t IN
1572  wave /t ID
1573  wave /t IV
1574  wave /t IU
1575 
1576  variable n_attr
1577  string s_attr
1578 
1579  if (exists(datawavename) == 1)
1580  if (strlen(source) > 0)
1581  Note $datawavename, "PV=" + source
1582  endif
1583  switch(WaveType($datawavename, 1))
1584  case 1:// numeric
1585  wave w_attr = $datawavename
1586  n_attr = numpnts(w_attr)
1587  sprintf s_attr, "%.12g", w_attr[0]
1588  break
1589  case 2:// text
1590  wave /t wt_attr = $datawavename
1591  n_attr = numpnts(wt_attr)
1592  s_attr = wt_attr[0]
1593  break
1594  default:// unknown
1595  n_attr = 0
1596  endswitch
1597  if (n_attr == 1)
1598  IN[idest] = source
1599  ID[idest] = datawavename
1600  IV[idest] = s_attr
1601  IU[idest] = ""// we don't get the units
1602  idest += 1
1603  endif
1604  endif
1605 };
1606 
1614 variable adh5_scale_scienta(wave data){
1615  wave data
1616 
1617  dfref saveDF = GetDataFolderDFR()
1618 
1619  dfref dataDF = GetWavesDataFolderDFR(data)
1620  dfref attrDF = GetAttrDataFolderDFR(data)
1621 
1622  wave /SDFR=attrDF LensMode
1623  wave /SDFR=attrDF /Z ChannelBegin, ChannelEnd
1624  wave /SDFR=attrDF /Z SliceBegin, SliceEnd
1625 
1626  variable EDim, ADim
1627  variable ELow, EHigh, ALow, AHigh
1628  string EUnit, AUnit
1629 
1630  // which dimension is angle and which one is energy?
1631  strswitch(GetDimLabel(data, 0, -1))
1632  case "AD_Dim0":
1633  EDim = 0
1634  break
1635  case "AD_Dim1":
1636  EDim = 1
1637  break
1638  default:
1639  EDim = -1
1640  endswitch
1641  strswitch(GetDimLabel(data, 1, -1))
1642  case "AD_Dim0":
1643  ADim = 0
1644  break
1645  case "AD_Dim1":
1646  ADim = 1
1647  break
1648  default:
1649  ADim = -1
1650  endswitch
1651 
1652  // defaults (point scaling)
1653  if (EDim >= 0)
1654  ELow = dimoffset(data, EDim)
1655  EHigh = dimoffset(data, EDim) + dimdelta(data, EDim) * (dimsize(data, EDim) - 1)
1656  EUnit = "eV"
1657  endif
1658  if (ADim >= 0)
1659  ALow = dimoffset(data, ADim)
1660  AHigh = dimoffset(data, ADim) + dimdelta(data, ADim) * (dimsize(data, ADim) - 1)
1661  AUnit = "arb."
1662  endif
1663 
1664  // lens mode can give more detail
1665  if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
1666  switch(LensMode[0])
1667  case 1:// Angular45
1668  ALow = -45/2
1669  AHigh = +45/2
1670  AUnit = "°"
1671  break
1672  case 2:// Angular60
1673  ALow = -60/2
1674  AHigh = +60/2
1675  AUnit = "°"
1676  break
1677  endswitch
1678  endif
1679 
1680  // best option if scales are explicit in separate waves
1681  if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
1682  ELow = ChannelBegin[0]
1683  EHigh = ChannelEnd[0]
1684  endif
1685  if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
1686  ALow = SliceBegin[0]
1687  AHigh = SliceEnd[0]
1688  endif
1689 
1690  // apply new scales
1691  switch(EDim)
1692  case 0:
1693  setscale /i x ELow, EHigh, EUnit, data
1694  break
1695  case 1:
1696  setscale /i y ELow, EHigh, EUnit, data
1697  break
1698  endswitch
1699  switch(ADim)
1700  case 0:
1701  setscale /i x ALow, AHigh, AUnit, data
1702  break
1703  case 1:
1704  setscale /i y ALow, AHigh, AUnit, data
1705  break
1706  endswitch
1707 
1708  setscale d 0, 0, "arb.", data
1709 
1710  setdatafolder saveDF
1711 };
1712 
1719 variable adh5_scale_scan(wave data){
1720  wave data
1721 
1722  dfref saveDF = GetDataFolderDFR()
1723 
1724  dfref dataDF = GetWavesDataFolderDFR(data)
1725  wave /SDFR=dataDF AcquisitionMode, DetectorMode, EnergyMode
1726 
1727  wave /SDFR=dataDF /z Scan1Active, Scan2Active
1728  wave /SDFR=dataDF /t /z Scan1Positioner1, Scan1Readback1
1729  wave /SDFR=dataDF /t /z Scan1Positioner2, Scan1Readback2
1730  wave /SDFR=dataDF /t /z Scan2Positioner1, Scan2Readback1
1731  wave /SDFR=dataDF /t /z Scan2Positioner2, Scan2Readback2
1732 
1733  // TODO : search the data folder for positioner waves,
1734  // i.e. waves with the PV name corresponding to Scan1Positioner1 in their wave note.
1735  wave /z zscale
1736 
1737  strswitch(GetDimLabel(data, 0, -1))
1738  case "AD_DimN":
1739  setscale /i x zscale[0], zscale[numpnts(zscale)-1], "", data
1740  break
1741  endswitch
1742  strswitch(GetDimLabel(data, 1, -1))
1743  case "AD_DimN":
1744  setscale /i y zscale[0], zscale[numpnts(zscale)-1], "", data
1745  break
1746  endswitch
1747  strswitch(GetDimLabel(data, 2, -1))
1748  case "AD_DimN":
1749  setscale /i z zscale[0], zscale[numpnts(zscale)-1], "", data
1750  break
1751  endswitch
1752 
1753  setdatafolder saveDF
1754 };
1755 
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.
+
variable kill_progress_panel()
+
variable display_progress_panel(string title, string message, variable progress_max)
+
string adh5_load_info(string APathName, string AFileName)
load descriptive info from a HDF5 file created by the Area Detector software.
+
variable ad_load_dialog(string APathName)
load area detector data files selected in a file dialog window
+
threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
static variable read_attribute_info(string datawavename, string source, variable *idest)
sub-function of adh5_loadattr_all.
+
static dfr GetAttrDataFolderDFR(wave data)
find the attributes data folder of an area detector dataset.
+
threadsafe variable adh5_setup_profile(wave image, wave profile, variable dim)
set up a one-dimensional wave for a line profile based on a 2D original wave.
+
static threadsafe variable reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param)
+
variable adh5_scale_scienta(wave data)
set the energy and angle scales of an area detector dataset from the Scienta analyser.
+
string adh5_test_reduction_func(wave source, wave dest1, wave dest2, funcref reduction_func, string reduction_param)
wrapper function for testing reduction functions from the command line.
+
variable adh5_loadattr_all(variable fileID, string attributespath)
load an NDAttributes group from an open HDF5 file into the current data folder.
+
variable adh5_scale_scan(wave data)
scales the extra dimensions of an area detector dataset according to the EPICS scan ...
+
threadsafe variable adh5_default_reduction(wave source, wave dest1, wave dest2, string *param)
function prototype for adh5_load_reduced_detector
+
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.
+
threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
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.
+
variable adh5_load_reduced_detector(variable fileID, string detectorpath, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
load a reduced detector dataset from the open HDF5 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. ...
+
variable adh5_redim(wave data)
redimension a multi-dimensional area detector array loaded from HDF5.
+
variable adh5_load_detector_slabs(variable fileID, string detectorpath, variable progress=defaultValue)
load the detector dataset from the open HDF5 file.
+
variable adh5_scale(wave data, string source=defaultValue)
set the dimension scales of an area detector dataset.
+
variable update_progress_panel(variable progress, string message=defaultValue, variable progress_max=defaultValue)
+
variable adh5_load_detector(variable fileID, string detectorpath)
load the detector dataset from the open HDF5 file.
+
static variable BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind)
callback function for drag&drop of HDF5 files into Igor.
+
string adh5_list_reduction_funcs()
get a list of functions which can be used as reduction functions.
+
variable adh5_load_detector_image(variable fileID, string detectorpath, variable dim2start, variable dim2count, variable dim3start, variable dim3count)
load a single image from the detector dataset of the open HDF5 file
+
static threadsafe variable reduce_slab_worker(funcref reduction_func)
+
+
+ + + + diff --git a/doc/html/pearl-area-live_8ipf.html b/doc/html/pearl-area-live_8ipf.html new file mode 100644 index 0000000..5148c73 --- /dev/null +++ b/doc/html/pearl-area-live_8ipf.html @@ -0,0 +1,478 @@ + + + + + + +PEARL Procedures: pearl-area-live.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-area-live.ipf File Reference
+
+
+
#include "pearl-epics"
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + +

+Functions

variable ad_connect (string epicsname, string nickname)
 
variable ad_live_callback (variable chan)
 
static variable ad_update_ROI (string graphname, variable iroi)
 
static variable ad_update_ROI_rect (string graphname, variable iroi, variable x1, variable y1, variable x2, variable y2, variable enable)
 
variable ad_set_ROI (string nickname, variable iroi, variable p1, variable q1, variable p2, variable q2, variable enable)
 
variable add_roi_controls ()
 
static variable pmp_set_roi (WMPopupAction *pa)
 
+ + + + + + + +

+Variables

 version
 
static const string package_path = "root:pearl_epics:"
 
static const string prefs_objects = ""
 
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ad_connect (string epicsname,
string nickname 
)
+
+ +

Definition at line 20 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ad_live_callback (variable chan)
+
+ +

Definition at line 117 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_set_ROI (string nickname,
variable iroi,
variable p1,
variable q1,
variable p2,
variable q2,
variable enable 
)
+
+ +

Definition at line 292 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static variable ad_update_ROI (string graphname,
variable iroi 
)
+
+static
+
+ +

Definition at line 226 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable ad_update_ROI_rect (string graphname,
variable iroi,
variable x1,
variable y1,
variable x2,
variable y2,
variable enable 
)
+
+static
+
+ +

Definition at line 269 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable add_roi_controls ()
+
+ +

Definition at line 339 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pmp_set_roi (WMPopupAction * pa)
+
+static
+
+ +

Definition at line 346 of file pearl-area-live.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string package_path = "root:pearl_epics:"
+
+static
+
+ +

Definition at line 16 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string prefs_objects = ""
+
+static
+
+ +

Definition at line 18 of file pearl-area-live.ipf.

+ +
+
+ +
+
+ + + + +
version
+
+Initial value:
= 1.02
+
+
+
+
+
+
+
+
+
+
static const string package_name = "pearl_epics"
+
static const string package_name
+
+

Definition at line 5 of file pearl-area-live.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-area-live_8ipf.js b/doc/html/pearl-area-live_8ipf.js new file mode 100644 index 0000000..fc9b433 --- /dev/null +++ b/doc/html/pearl-area-live_8ipf.js @@ -0,0 +1,13 @@ +var pearl_area_live_8ipf = +[ + [ "ad_connect", "pearl-area-live_8ipf.html#ad2f678b5d225703dd6870c3af7e24731", null ], + [ "ad_live_callback", "pearl-area-live_8ipf.html#a1ecdd9fd0a8ee6ef202345576477e59c", null ], + [ "ad_set_ROI", "pearl-area-live_8ipf.html#ae2b394e70908038dccb28c0c9ad955df", null ], + [ "ad_update_ROI", "pearl-area-live_8ipf.html#a64cb0e4fa69a113692dd528a3e5afc6e", null ], + [ "ad_update_ROI_rect", "pearl-area-live_8ipf.html#a1f5d1f9d9eee43ff423fb4d406b69d1d", null ], + [ "add_roi_controls", "pearl-area-live_8ipf.html#aa7064a75bef3b2d92c4f0b7632b9a3c3", null ], + [ "pmp_set_roi", "pearl-area-live_8ipf.html#a6c48e033671df6041ee45a04d5e6a04c", null ], + [ "package_path", "pearl-area-live_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b", null ], + [ "prefs_objects", "pearl-area-live_8ipf.html#a20720748c82a7eaa4b02d4084a4219b2", null ], + [ "version", "pearl-area-live_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-area-live_8ipf_source.html b/doc/html/pearl-area-live_8ipf_source.html new file mode 100644 index 0000000..967cca2 --- /dev/null +++ b/doc/html/pearl-area-live_8ipf_source.html @@ -0,0 +1,510 @@ + + + + + + +PEARL Procedures: pearl-area-live.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-area-live.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 = PearlAreaLive
+
4 #pragma version = 1.03
+
5 #include "pearl-epics", version >= 1.02
+
6 
+
7 // preview panel for EPICS area detectors
+
8 // such as CCD cameras, 2D electron analysers
+
9 // the image is read from the NDPluginStdArrays plugin of the area detector
+
10 // make sure that plugin is enabled
+
11 
+
12 // created: matthias.muntwiler@psi.ch, 2013-05-29
+
13 // $Id$
+
14 
+
15 static const string package_name = "pearl_epics";
+
16 static const string package_path = "root:pearl_epics:";
+
17 // semicolon-separated list of persistent variable, string, and wave names
+
18 static const string prefs_objects = "";
+
19 
+
20 variable ad_connect(string epicsname, string nickname){
+
21  // connects to the necessary EPICS channels of the detector
+
22  // to disconnect, call epics_disconnect()
+
23  // (caution: this will disconnect all EPICS channels of all PEARL EPICS procedures!)
+
24  string epicsname// base name of the detector, e.g. X03DA-SCIENTA:
+
25  // image1: and cam1: are appended by the function
+
26  string nickname// nick name under which this detector is referred to in Igor
+
27  // must be a valid data folder name
+
28  // the data folder is created under root:pearl_epics
+
29 
+
30  dfref savedf = GetDataFolderDFR()
+
31  setdatafolder root:
+
32 
+
33  // data folder for common EPICS metadata
+
34  newdatafolder /o/s $package_name
+
35  dfref epicsdf = GetDataFolderDFR()
+
36  string /g ad_chids
+
37  string /g ad_nicknames
+
38 
+
39  // data folder this detector
+
40  string foldername = nickname
+
41  newdatafolder /s/o $foldername
+
42  dfref detectordf = GetDataFolderDFR()
+
43 
+
44  // create variables and waves
+
45  make /n=(1)/o arraydata, xscale, yscale
+
46  make /n=(1,1)/o image
+
47  variable /g ndimensions
+
48  variable /g arraysize0, arraysize1
+
49  variable /g datatype
+
50  variable /g colormode
+
51  string /g controls, monitors
+
52  string /g xunits, yunits
+
53 
+
54  print "connecting EPICS channels..."
+
55 
+
56  // channel lists
+
57  controls = ""
+
58  monitors = ""
+
59  string imagename = epicsname + "image1:"
+
60  string camname = epicsname + "cam1:"
+
61 
+
62  // we will set our own monitor on ArrayData, so add this to the controls list
+
63  controls = ReplaceStringByKey("ArrayData", controls, imagename + "ArrayData", "=")
+
64  // check whether it has been set already
+
65  variable chidArrayData = epics_chid(imagename + "ArrayData")
+
66  variable array_connected = chidArrayData > 0
+
67 
+
68  monitors = ReplaceStringByKey("NDimensions", monitors, imagename + "NDimensions_RBV", "=")
+
69  monitors = ReplaceStringByKey("ArraySize0", monitors, imagename + "ArraySize0_RBV", "=")
+
70  monitors = ReplaceStringByKey("ArraySize1", monitors, imagename + "ArraySize1_RBV", "=")
+
71  monitors = ReplaceStringByKey("DataType", monitors, imagename + "DataType_RBV", "=")
+
72  monitors = ReplaceStringByKey("ColorMode", monitors, imagename + "ColorMode_RBV", "=")
+
73  monitors = ReplaceStringByKey("XScale", monitors, camname + "CHANNEL_SCALE_RBV", "=")
+
74  monitors = ReplaceStringByKey("YScale", monitors, camname + "SLICE_SCALE_RBV", "=")
+
75 
+
76  variable nroi = 4
+
77  variable iroi
+
78  string roikey, roiname
+
79  for (iroi = 0; iroi < nroi; iroi += 1)
+
80  roikey = "ROI" + num2str(iroi + 1)
+
81  roiname = epicsname + "ROI" + num2str(iroi + 1) + ":"
+
82 
+
83  controls = ReplaceStringByKey(roikey + "Enable", controls, roiname + "EnableCallbacks", "=")
+
84  controls = ReplaceStringByKey(roikey + "EnableX", controls, roiname + "EnableX", "=")
+
85  controls = ReplaceStringByKey(roikey + "MinX", controls, roiname + "MinX", "=")
+
86  controls = ReplaceStringByKey(roikey + "SizeX", controls, roiname + "SizeX", "=")
+
87  controls = ReplaceStringByKey(roikey + "EnableY", controls, roiname + "EnableY", "=")
+
88  controls = ReplaceStringByKey(roikey + "MinY", controls, roiname + "MinY", "=")
+
89  controls = ReplaceStringByKey(roikey + "SizeY", controls, roiname + "SizeY", "=")
+
90 
+
91  monitors = ReplaceStringByKey(roikey + "Enable", monitors, roiname + "EnableCallbacks_RBV", "=")
+
92  monitors = ReplaceStringByKey(roikey + "EnableX", monitors, roiname + "EnableX_RBV", "=")
+
93  monitors = ReplaceStringByKey(roikey + "MinX", monitors, roiname + "MinX_RBV", "=")
+
94  monitors = ReplaceStringByKey(roikey + "SizeX", monitors, roiname + "SizeX_RBV", "=")
+
95  monitors = ReplaceStringByKey(roikey + "EnableY", monitors, roiname + "EnableY_RBV", "=")
+
96  monitors = ReplaceStringByKey(roikey + "MinY", monitors, roiname + "MinY_RBV", "=")
+
97  monitors = ReplaceStringByKey(roikey + "SizeY", monitors, roiname + "SizeY_RBV", "=")
+
98  endfor
+
99 
+
100  // connect EPICS channels
+
101  epics_connect(controls, monitors)
+
102 
+
103  // keep track of detector IDs
+
104  ad_nicknames = AddListItem(nickname, ad_nicknames)
+
105  variable iad = WhichListItem(nickname, ad_nicknames, ";", 0, 0)
+
106  ad_chids = AddListItem(num2istr(epics_chid(imagename + "ArrayData")), ad_chids, ";", iad)
+
107 
+
108  // set callback function
+
109  if (!array_connected)
+
110  pvMonitor /F=ad_live_callback epics_chid(imagename + "ArrayData")
+
111  endif
+
112 
+
113  print "...done"
+
114  setdatafolder savedf
+
115 };
+
116 
+
117 variable ad_live_callback(variable chan){
+
118  variable chan
+
119 
+
120  dfref savedf = GetDataFolderDFR()
+
121  setdatafolder $package_path
+
122 
+
123  // find the data folder of the detector
+
124  svar ad_chids
+
125  svar ad_nicknames
+
126  variable iad = WhichListItem(num2istr(chan), ad_chids, ";", 0, 0)
+
127  if (iad >= 0)
+
128  string nickname = StringFromList(iad, ad_nicknames)
+
129  else
+
130  return -1
+
131  endif
+
132  setdatafolder $nickname
+
133 
+
134  // retrieve data
+
135  svar controls
+
136  svar monitors
+
137  variable chidArrayData = epics_chid(StringByKey("ArrayData", controls, "="))
+
138  variable chidNDimensions = epics_chid(StringByKey("NDimensions", monitors, "="))
+
139  variable chidArraySize0 = epics_chid(StringByKey("ArraySize0", monitors, "="))
+
140  variable chidArraySize1 = epics_chid(StringByKey("ArraySize1", monitors, "="))
+
141  variable chidDataType = epics_chid(StringByKey("DataType", monitors, "="))
+
142  variable chidColorMode = epics_chid(StringByKey("ColorMode", monitors, "="))
+
143  variable chidXScale = epics_chid(StringByKey("XScale", monitors, "="))
+
144  variable chidYScale = epics_chid(StringByKey("YScale", monitors, "="))
+
145 
+
146  wave arraydata
+
147  wave image
+
148  nvar ndimensions
+
149  nvar arraysize0
+
150  nvar arraysize1
+
151  nvar datatype
+
152  nvar colormode
+
153  wave xscale
+
154  wave yscale
+
155 
+
156  pvGet chidNDimensions, ndimensions
+
157  pvGet chidArraySize0, arraysize0
+
158  pvGet chidArraySize1, arraysize1
+
159  pvGet chidDataType, datatype
+
160  pvGet chidColorMode, colormode
+
161 
+
162  // sanity checks
+
163  if (ndimensions != 2)
+
164  return -2
+
165  endif
+
166  if (colormode != 0)
+
167  return -3
+
168  endif
+
169 
+
170  redimension /n=(arraysize0 * arraysize1) arraydata
+
171  redimension /n=(arraysize0, arraysize1) image
+
172  redimension /n=(arraysize0) xscale
+
173  redimension /n=(arraysize1) yscale
+
174 
+
175  switch(datatype)
+
176  case 0:// int8
+
177  redimension /b arraydata, image
+
178  break
+
179  case 1:// uint8
+
180  redimension /b/u arraydata, image
+
181  break
+
182  case 2:// int16
+
183  redimension /w arraydata, image
+
184  break
+
185  case 3:// uint16
+
186  redimension /w/u arraydata, image
+
187  break
+
188  case 4:// int32
+
189  redimension /i arraydata, image
+
190  break
+
191  case 5:// uint32
+
192  redimension /i/u arraydata, image
+
193  break
+
194  case 6:// float32
+
195  redimension /s arraydata, image
+
196  break
+
197  case 7:// float64
+
198  redimension /d arraydata, image
+
199  break
+
200  endswitch
+
201 
+
202  pvGetWave chidArrayData, arraydata
+
203  pvGetWave chidXScale, xscale
+
204  pvGetWave chidYScale, yscale
+
205 
+
206  image = arraydata[p + q * arraysize0]
+
207  setscale /i x xscale[0], xscale[numpnts(xscale)-1], image
+
208  setscale /i y yscale[0], yscale[numpnts(yscale)-1], image
+
209 
+
210  ad_update_profiles(image)
+
211 
+
212  // update ROI rectangles
+
213  svar /z graphname = :view_image:prof_graphname
+
214  if (svar_exists(graphname))
+
215  variable nroi = 4
+
216  variable iroi
+
217  for (iroi = 0; iroi < nroi; iroi += 1)
+
218  ad_update_ROI(graphname, iroi)
+
219  endfor
+
220  endif
+
221 
+
222  setdatafolder savedf
+
223  return 0
+
224 };
+
225 
+
226 static variable ad_update_ROI(string graphname, variable iroi){
+
227  string graphname
+
228  variable iroi
+
229 
+
230  string roikey
+
231  variable enable
+
232  svar monitors
+
233 
+
234  wave xscale
+
235  wave yscale
+
236 
+
237  variable enableX = 0
+
238  variable minX = 0
+
239  variable sizeX = numpnts(xscale)
+
240 
+
241  variable enableY = 0
+
242  variable minY = 0
+
243  variable sizeY = numpnts(yscale)
+
244 
+
245  roikey = "ROI" + num2str(iroi + 1)
+
246  enable = epics_get_num(StringByKey(roikey + "Enable", monitors, "="))
+
247  if (enable)
+
248  enableX = epics_get_num(StringByKey(roikey + "EnableX", monitors, "="))
+
249  if (enableX)
+
250  minX = epics_get_num(StringByKey(roikey + "MinX", monitors, "="))
+
251  sizeX = epics_get_num(StringByKey(roikey + "SizeX", monitors, "="))
+
252  endif
+
253 
+
254  enableY = epics_get_num(StringByKey(roikey + "EnableY", monitors, "="))
+
255  if (enableY)
+
256  minY = epics_get_num(StringByKey(roikey + "MinY", monitors, "="))
+
257  sizeY = epics_get_num(StringByKey(roikey + "SizeY", monitors, "="))
+
258  endif
+
259 
+
260  variable x1 = xscale[minX]
+
261  variable x2 = xscale[minX + sizeX - 1]
+
262  variable y1 = yscale[minY]
+
263  variable y2 = yscale[minY + sizeY - 1]
+
264  endif
+
265 
+
266  ad_update_ROI_rect(graphname, iroi, x1, y1, x2, y2, enable)
+
267 };
+
268 
+
269 static variable ad_update_ROI_rect(string graphname, variable iroi, variable x1, variable y1, variable x2, variable y2, variable enable){
+
270  string graphname
+
271  variable iroi// 0...3
+
272  variable x1,y1,x2,y2
+
273  variable enable// enable = 1; disable = 0
+
274  string roiname = "roi" + num2str(iroi + 1)
+
275  variable color = 65536 * (1 - iroi/8) - 1
+
276 
+
277  if (enable)
+
278  DrawAction /w=$graphname getgroup=$roiname, delete, begininsert
+
279  SetDrawEnv /w=$graphname gstart,gname=$roiname
+
280  SetDrawEnv /w=$graphname xcoord= bottom,ycoord= left
+
281  SetDrawEnv /w=$graphname linefgc= (65535,color,color)
+
282  SetDrawEnv /w=$graphname fillpat= 0
+
283  SetDrawEnv /w=$graphname linethick= 0.50
+
284  DrawRect /w=$graphname x1,y1,x2,y2
+
285  SetDrawEnv /w=$graphname gstop
+
286  DrawAction /w=$graphname endinsert
+
287  else
+
288  DrawAction /w=$graphname getgroup=$roiname, delete
+
289  endif
+
290 };
+
291 
+
292 variable ad_set_ROI(string nickname, variable iroi, variable p1, variable q1, variable p2, variable q2, variable enable){
+
293  // set a ROI rectangle to the given coordinates
+
294  string nickname
+
295  variable iroi// 0...3
+
296  variable p1,q1,p2,q2// rectangular coordinates of the new ROI (point scaling)
+
297  variable enable// enable = 1; disable = 0
+
298 
+
299  string roiname = "roi" + num2str(iroi + 1)
+
300  string roikey
+
301 
+
302  dfref savedf = GetDataFolderDFR()
+
303  setdatafolder $package_path
+
304  setdatafolder $nickname
+
305 
+
306  svar controls
+
307  wave xscale
+
308  wave yscale
+
309 
+
310  variable minX = min(p1, p2)
+
311  variable sizeX = max(p1, p2) - min(p1, p2) + 1
+
312  variable enableX = sizeX > 0
+
313  variable minY = min(q1, q2)
+
314  variable sizeY = max(q1, q2) - min(q1, q2) + 1
+
315  variable enableY = sizeY > 0
+
316 
+
317  roikey = "ROI" + num2str(iroi + 1)
+
318  epics_set_num(StringByKey(roikey + "Enable", controls, "="), enable)
+
319  if (enable)
+
320  epics_set_num(StringByKey(roikey + "EnableX", controls, "="), enableX)
+
321  if (enableX)
+
322  epics_set_num(StringByKey(roikey + "MinX", controls, "="), minX)
+
323  epics_set_num(StringByKey(roikey + "SizeX", controls, "="), sizeX)
+
324  endif
+
325 
+
326  epics_set_num(StringByKey(roikey + "EnableY", controls, "="), enableY)
+
327  if (enableY)
+
328  epics_set_num(StringByKey(roikey + "MinY", controls, "="), minY)
+
329  epics_set_num(StringByKey(roikey + "SizeY", controls, "="), sizeY)
+
330  endif
+
331  endif
+
332 
+
333  svar graphname = :view_image:prof_graphname
+
334  ad_update_ROI(graphname, iroi)
+
335 
+
336  setdatafolder savedf
+
337 };
+
338 
+
339 variable add_roi_controls(){
+
340  PopupMenu pm_set_roi mode=0,value="ROI 1;ROI 2;ROI 3;ROI 4",title="Set ROI"
+
341  PopupMenu pm_set_roi pos={400,0},bodyWidth=60,proc=PearlAreaLive#pmp_set_roi
+
342  PopupMenu pm_set_roi help={"Set a detector ROI to the current cursor selection"}
+
343 };
+
344 
+
345 
+
346 static variable pmp_set_roi(WMPopupAction* pa){
+
347  STRUCT WMPopupAction &pa
+
348 
+
349  switch( pa.eventCode )
+
350  case 2:// mouse up
+
351  variable popNum = pa.popNum
+
352  string imgname = StringFromList(0, ImageNameList(pa.win, ";"))
+
353  wave /z image = ImageNameToWaveRef(pa.win, imgname)
+
354  if (waveexists(image))
+
355  wave /z source = PearlAreaDisplay#get_source_image(image)
+
356  if (waveexists(source))
+
357  dfref sourcedf = GetWavesDataFolderDFR(source)
+
358  string nickname = GetDataFolder(0, sourcedf)
+
359  ad_set_ROI(nickname, popNum - 1, pcsr(A, pa.win), qcsr(A, pa.win), pcsr(B, pa.win), qcsr(B, pa.win), 1)
+
360  endif
+
361  endif
+
362  break
+
363  case -1:// control being killed
+
364  break
+
365  endswitch
+
366 
+
367  return 0
+
368 };
+
369 
+
static variable epics_connect()
connect the angle scan tracker to EPICS
+
variable ad_update_profiles(wave image)
update a profiles graph with new data.
+
version
+
static const string package_path
+
static const string prefs_objects
+
instant visualization of angle scan and manipulator position.
+
static wave get_source_image(wave view)
find the source image wave corresponding to the given view.
+
static const string package_name
+
variable add_roi_controls()
+
static const string imgname
+
static variable ad_update_ROI(string graphname, variable iroi)
+
variable ad_set_ROI(string nickname, variable iroi, variable p1, variable q1, variable p2, variable q2, variable enable)
+
static const string camname
+
variable ad_live_callback(variable chan)
+
variable ad_connect(string epicsname, string nickname)
+
static variable ad_update_ROI_rect(string graphname, variable iroi, variable x1, variable y1, variable x2, variable y2, variable enable)
+
static variable pmp_set_roi(WMPopupAction *pa)
+
+
+ + + + diff --git a/doc/html/pearl-area-profiles-test_8ipf.html b/doc/html/pearl-area-profiles-test_8ipf.html new file mode 100644 index 0000000..2a375d4 --- /dev/null +++ b/doc/html/pearl-area-profiles-test_8ipf.html @@ -0,0 +1,455 @@ + + + + + + +PEARL Procedures: pearl-area-profiles-test.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-area-profiles-test.ipf File Reference
+
+
+ +

test suite for pearl-area-profiles.ipf +More...

+
#include "pearl-area-profiles"
+#include "unit-testing"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlAreaProfilesTest
 profile extraction for multi-dimensional datasets acquired from area detectors.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

static variable test_ad_profile_x_w ()
 test the ad_profile_x() function More...
 
static variable test_ad_profile_y_w ()
 test the ad_profile_y() function More...
 
static variable test_ad_extract_slab_x ()
 test the ad_extract_slab_x() function More...
 
static variable test_ad_extract_slab_y ()
 test the ad_extract_slab_y() function More...
 
static variable test_ad_extract_slab_z ()
 test the ad_extract_slab_z() function More...
 
static variable test_ad_extract_slab ()
 test the ad_extract_slab() function More...
 
static variable test_ad_extract_rod_x ()
 test the ad_extract_rod_x() function More...
 
static variable test_ad_extract_rod__x ()
 test the ad_extract_rod() function, X coordinate More...
 
static variable test_ad_extract_rod__y ()
 test the ad_extract_rod() function, Y coordinate More...
 
static variable test_ad_extract_rod__z ()
 test the ad_extract_rod() function, Z coordinate More...
 
+

Detailed Description

+

test suite for pearl-area-profiles.ipf

+

unit testing framework: http://www.igorexchange.com/project/unitTesting. run all test cases with RunTest("pearl-area-profiles-test.ipf"). if wave equalities fail, EnableDebugOutput() and read Igor help on equalWaves().

+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-area-profiles-test.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_rod__x ()
+
+static
+
+ +

test the ad_extract_rod() function, X coordinate

+ +

Definition at line 337 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_rod__y ()
+
+static
+
+ +

test the ad_extract_rod() function, Y coordinate

+ +

Definition at line 377 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_rod__z ()
+
+static
+
+ +

test the ad_extract_rod() function, Z coordinate

+ +

Definition at line 417 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_rod_x ()
+
+static
+
+ +

test the ad_extract_rod_x() function

+ +

Definition at line 301 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_slab ()
+
+static
+
+ +

test the ad_extract_slab() function

+ +

Definition at line 220 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_slab_x ()
+
+static
+
+ +

test the ad_extract_slab_x() function

+ +

Definition at line 85 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_slab_y ()
+
+static
+
+ +

test the ad_extract_slab_y() function

+ +

Definition at line 130 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_extract_slab_z ()
+
+static
+
+ +

test the ad_extract_slab_z() function

+ +

Definition at line 175 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_profile_x_w ()
+
+static
+
+ +

test the ad_profile_x() function

+ +

Definition at line 33 of file pearl-area-profiles-test.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable test_ad_profile_y_w ()
+
+static
+
+ +

test the ad_profile_y() function

+ +

Definition at line 59 of file pearl-area-profiles-test.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-area-profiles-test_8ipf.js b/doc/html/pearl-area-profiles-test_8ipf.js new file mode 100644 index 0000000..6884827 --- /dev/null +++ b/doc/html/pearl-area-profiles-test_8ipf.js @@ -0,0 +1,13 @@ +var pearl_area_profiles_test_8ipf = +[ + [ "test_ad_extract_rod__x", "pearl-area-profiles-test_8ipf.html#aeb4c79268a38d31e77a1224c252023ec", null ], + [ "test_ad_extract_rod__y", "pearl-area-profiles-test_8ipf.html#a9553dfdb7b294ba449702214b99946a1", null ], + [ "test_ad_extract_rod__z", "pearl-area-profiles-test_8ipf.html#a26c14be48f362ca710b3130fb64d796e", null ], + [ "test_ad_extract_rod_x", "pearl-area-profiles-test_8ipf.html#a3f49e50122a716eaf94bd141fd7b15b2", null ], + [ "test_ad_extract_slab", "pearl-area-profiles-test_8ipf.html#a8a7bf066d689a2c03d4de2b182d37b6d", null ], + [ "test_ad_extract_slab_x", "pearl-area-profiles-test_8ipf.html#a1dca3a69d6407c5e299f76f0865bffec", null ], + [ "test_ad_extract_slab_y", "pearl-area-profiles-test_8ipf.html#a65a1faa2a1b299ffde0ca447e636fcde", null ], + [ "test_ad_extract_slab_z", "pearl-area-profiles-test_8ipf.html#abb4926d128e6eb736b0b75041e86f4c5", null ], + [ "test_ad_profile_x_w", "pearl-area-profiles-test_8ipf.html#a93fb31cf76e921f15af8d89c47a87b39", null ], + [ "test_ad_profile_y_w", "pearl-area-profiles-test_8ipf.html#a3c7b6ec6ecabc9508c6e52fd89c551fb", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-area-profiles-test_8ipf_source.html b/doc/html/pearl-area-profiles-test_8ipf_source.html new file mode 100644 index 0000000..29d2169 --- /dev/null +++ b/doc/html/pearl-area-profiles-test_8ipf_source.html @@ -0,0 +1,568 @@ + + + + + + +PEARL Procedures: pearl-area-profiles-test.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-area-profiles-test.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 = PearlAreaProfilesTest
+
4 #pragma version = 1.02
+
5 
+
6 #include "pearl-area-profiles"
+
7 #include "unit-testing"
+
8 
+
9 
+
24 
+
30 
+
31 
+
33 static variable test_ad_profile_x_w(){
+
34  make /n=(11,21) /d /free source
+
35  setscale /p x 10, 1, "X", source
+
36  setscale /p y 100, 100, "Y", source
+
37  setscale d 0, 0, "D", source
+
38  source = x + y
+
39 
+
40  make /n=11 /d /free expected
+
41  setscale /p x 10, 1, "X", expected
+
42  setscale d 0, 0, "D", expected
+
43  expected = 30 + 3 * p + 500 + 600 + 700
+
44 
+
45  make /n=1 /d /free result1, result0
+
46  variable p1, p2
+
47 
+
48  p1 = 4
+
49  p2 = 6
+
50  ad_profile_x_w(source, p1, p2, result1, noavg=1)
+
51  CHECK_EQUAL_WAVES(result1, expected, tol=1e-6)
+
52 
+
53  expected /= 3
+
54  ad_profile_x_w(source, p1, p2, result0, noavg=0)
+
55  CHECK_EQUAL_WAVES(result0, expected, tol=1e-6)
+
56 };
+
57 
+
59 static variable test_ad_profile_y_w(){
+
60  make /n=(11,21) /d /free source
+
61  setscale /p x 10, 1, "X", source
+
62  setscale /p y 100, 100, "Y", source
+
63  setscale d 0, 0, "D", source
+
64  source = x + y
+
65 
+
66  make /n=21 /d /free expected
+
67  setscale /p x 100, 100, "Y", expected
+
68  setscale d 0, 0, "D", expected
+
69  expected = 3 * x + 14 + 15 + 16
+
70 
+
71  make /n=1 /d /free result1, result0
+
72  variable p1, p2
+
73 
+
74  p1 = 4
+
75  p2 = 6
+
76  ad_profile_y_w(source, p1, p2, result1, noavg=1)
+
77  CHECK_EQUAL_WAVES(result1, expected)
+
78 
+
79  expected /= 3
+
80  ad_profile_y_w(source, p1, p2, result0, noavg=0)
+
81  CHECK_EQUAL_WAVES(result0, expected)
+
82 };
+
83 
+
85 static variable test_ad_extract_slab_x(){
+
86  variable nx = 11
+
87  variable ny = 16
+
88  variable nz = 21
+
89  make /n=(nx,ny,nz) /d /free source
+
90  setscale /i x -1, 1, "X", source
+
91  setscale /i y -2, 2, "Y", source
+
92  setscale /i z -3, 3, "Z", source
+
93  setscale d 0, 0, "D", source
+
94  source = x + y + z
+
95  source[4][][] = 1
+
96  source[5][][] = 1
+
97 
+
98  make /n=(ny,nz) /d /free expected
+
99  setscale /i x -2, 2, "Y", expected
+
100  setscale /i y -3, 3, "Z", expected
+
101  setscale d 0, 0, "D", expected
+
102  expected = 2
+
103 
+
104  variable p1, p2
+
105  p1 = 4
+
106  p2 = 5
+
107 
+
108  wave result = ad_extract_slab_x(source, p1, p2, "", noavg=1)
+
109  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
110 
+
111  expected = 1
+
112  wave result = ad_extract_slab_x(source, p1, p2, "", noavg=0)
+
113  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
114 
+
115  p1 = -inf
+
116  p2 = 5
+
117  source = y + z
+
118  expected = (x + y) * 6
+
119  wave result = ad_extract_slab_x(source, p1, p2, "", noavg=1)
+
120  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
121 
+
122  p1 = 4
+
123  p2 = +inf
+
124  expected = (x + y) * (nx - 4)
+
125  wave result = ad_extract_slab_x(source, p1, p2, "", noavg=1)
+
126  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
127 };
+
128 
+
130 static variable test_ad_extract_slab_y(){
+
131  variable nx = 11
+
132  variable ny = 16
+
133  variable nz = 21
+
134  make /n=(nx,ny,nz) /d /free source
+
135  setscale /i x -1, 1, "X", source
+
136  setscale /i y -2, 2, "Y", source
+
137  setscale /i z -3, 3, "Z", source
+
138  setscale d 0, 0, "D", source
+
139  source = x + y + z
+
140  source[][4][] = 1
+
141  source[][5][] = 1
+
142 
+
143  make /n=(nx,nz) /d /free expected
+
144  setscale /i x -1, 1, "X", expected
+
145  setscale /i y -3, 3, "Z", expected
+
146  setscale d 0, 0, "D", expected
+
147  expected = 2
+
148 
+
149  variable p1, p2
+
150  p1 = 4
+
151  p2 = 5
+
152 
+
153  wave result = ad_extract_slab_y(source, p1, p2, "", noavg=1)
+
154  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
155 
+
156  expected = 1
+
157  wave result = ad_extract_slab_y(source, p1, p2, "", noavg=0)
+
158  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
159 
+
160  p1 = -inf
+
161  p2 = 5
+
162  source = x + z
+
163  expected = (x + y) * 6
+
164  wave result = ad_extract_slab_y(source, p1, p2, "", noavg=1)
+
165  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
166 
+
167  p1 = 4
+
168  p2 = +inf
+
169  expected = (x + y) * (ny - 4)
+
170  wave result = ad_extract_slab_y(source, p1, p2, "", noavg=1)
+
171  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
172 };
+
173 
+
175 static variable test_ad_extract_slab_z(){
+
176  variable nx = 11
+
177  variable ny = 16
+
178  variable nz = 21
+
179  make /n=(nx,ny,nz) /d /free source
+
180  setscale /i x -1, 1, "X", source
+
181  setscale /i y -2, 2, "Y", source
+
182  setscale /i z -3, 3, "Z", source
+
183  setscale d 0, 0, "D", source
+
184  source = x + y + z
+
185  source[][][4] = 1
+
186  source[][][5] = 1
+
187 
+
188  make /n=(nx,ny) /d /free expected
+
189  setscale /i x -1, 1, "X", expected
+
190  setscale /i y -2, 2, "Y", expected
+
191  setscale d 0, 0, "D", expected
+
192  expected = 2
+
193 
+
194  variable p1, p2
+
195  p1 = 4
+
196  p2 = 5
+
197 
+
198  wave result = ad_extract_slab_z(source, p1, p2, "", noavg=1)
+
199  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
200 
+
201  expected = 1
+
202  wave result = ad_extract_slab_z(source, p1, p2, "", noavg=0)
+
203  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
204 
+
205  p1 = -inf
+
206  p2 = 5
+
207  source = x + y
+
208  expected = (x + y) * 6
+
209  wave result = ad_extract_slab_z(source, p1, p2, "", noavg=1)
+
210  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
211 
+
212  p1 = 4
+
213  p2 = +inf
+
214  expected = (x + y) * (nz - 4)
+
215  wave result = ad_extract_slab_z(source, p1, p2, "", noavg=1)
+
216  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
217 };
+
218 
+
220 static variable test_ad_extract_slab(){
+
221  variable nx = 11
+
222  variable ny = 16
+
223  variable nz = 21
+
224 
+
225  make /n=(nx,ny,nz) /d /free source
+
226  setscale /i x -1, 1, "X", source
+
227  setscale /i y -2, 2, "Y", source
+
228  setscale /i z -3, 3, "Z", source
+
229  setscale d 0, 0, "D", source
+
230  source = x + y + z
+
231 
+
232  variable x1, x2
+
233  variable y1, y2
+
234  variable z1, z2
+
235 
+
236  make /n=(ny,nz) /d /free expected
+
237  setscale /i x -2, 2, "Y", expected
+
238  setscale /i y -3, 3, "Z", expected
+
239  setscale d 0, 0, "D", expected
+
240 
+
241  x1 = 0
+
242  x2 = 0
+
243  y1 = nan
+
244  y2 = nan
+
245  z1 = nan
+
246  z2 = nan
+
247  expected = source[(nx-1)/2][p][q]
+
248  wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
249  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
250 
+
251  x1 = -inf
+
252  x2 = inf
+
253  expected = (x + y) * nx
+
254  wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
255  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
256 
+
257  make /n=(nx,nz) /d /free expected
+
258  setscale /i x -1, 1, "X", expected
+
259  setscale /i y -3, 3, "Z", expected
+
260  setscale d 0, 0, "D", expected
+
261 
+
262  x1 = nan
+
263  x2 = nan
+
264  y1 = 0
+
265  y2 = 0
+
266  z1 = nan
+
267  z2 = nan
+
268  expected = source[p][(ny-1)/2][q]
+
269  wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
270  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
271 
+
272  y1 = -inf
+
273  y2 = +inf
+
274  expected = (x + y) * ny
+
275  wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
276  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
277 
+
278  make /n=(nx,ny) /d /free expected
+
279  setscale /i x -1, 1, "X", expected
+
280  setscale /i y -2, 2, "Y", expected
+
281  setscale d 0, 0, "D", expected
+
282 
+
283  x1 = nan
+
284  x2 = nan
+
285  y1 = nan
+
286  y2 = nan
+
287  z1 = 0
+
288  z2 = 0
+
289  expected = source[p][q][(nz-1)/2]
+
290  wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
291  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
292 
+
293  z1 = -inf
+
294  z2 = inf
+
295  expected = (x + y) * nz
+
296  wave result = ad_extract_slab(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
297  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
298 };
+
299 
+
301 static variable test_ad_extract_rod_x(){
+
302  variable nx = 11
+
303  variable ny = 16
+
304  variable nz = 21
+
305  make /n=(nx,ny,nz) /d /free source
+
306  setscale /i x -1, 1, "X", source
+
307  setscale /i y -2, 2, "Y", source
+
308  setscale /i z -3, 3, "Z", source
+
309  setscale d 0, 0, "D", source
+
310  source = x + y + z
+
311  source[][4][4] = 1
+
312  source[][4][5] = 1
+
313  source[][5][4] = 1
+
314  source[][5][5] = 1
+
315 
+
316  make /n=(nx) /d /free expected
+
317  setscale /i x -1, 1, "X", expected
+
318  setscale d 0, 0, "D", expected
+
319  expected = 4
+
320 
+
321  variable q1, q2
+
322  variable r1, r2
+
323  q1 = 4
+
324  q2 = 5
+
325  r1 = 4
+
326  r2 = 5
+
327 
+
328  wave result = ad_extract_rod_x(source, q1, q2, r1, r2, "", noavg=1)
+
329  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
330 
+
331  expected = 1
+
332  wave result = ad_extract_rod_x(source, q1, q2, r1, r2, "", noavg=0)
+
333  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
334 };
+
335 
+
337 static variable test_ad_extract_rod__x(){
+
338  variable nx = 11
+
339  variable ny = 16
+
340  variable nz = 21
+
341 
+
342  make /n=(nx,ny,nz) /d /free source
+
343  setscale /i x -1, 1, "X", source
+
344  setscale /i y -2, 2, "Y", source
+
345  setscale /i z -3, 3, "Z", source
+
346  setscale d 0, 0, "D", source
+
347  source = x + y + z
+
348 
+
349  variable x1, x2
+
350  variable y1, y2
+
351  variable z1, z2
+
352 
+
353  make /n=(nx) /d /free expected
+
354  setscale /i x -1, 1, "X", expected
+
355  setscale d 0, 0, "D", expected
+
356 
+
357  x1 = nan
+
358  x2 = nan
+
359  y1 = 0
+
360  y2 = 0
+
361  z1 = 0
+
362  z2 = 0
+
363  expected = source[p][(ny-1)/2][(nz-1)/2]
+
364  wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
365  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
366 
+
367  y1 = -inf
+
368  y2 = +inf
+
369  z1 = -inf
+
370  z2 = +inf
+
371  expected = x * ny * nz
+
372  wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
373  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
374 };
+
375 
+
377 static variable test_ad_extract_rod__y(){
+
378  variable nx = 11
+
379  variable ny = 16
+
380  variable nz = 21
+
381 
+
382  make /n=(nx,ny,nz) /d /free source
+
383  setscale /i x -1, 1, "X", source
+
384  setscale /i y -2, 2, "Y", source
+
385  setscale /i z -3, 3, "Z", source
+
386  setscale d 0, 0, "D", source
+
387  source = x + y + z
+
388 
+
389  variable x1, x2
+
390  variable y1, y2
+
391  variable z1, z2
+
392 
+
393  make /n=(ny) /d /free expected
+
394  setscale /i x -2, 2, "Y", expected
+
395  setscale d 0, 0, "D", expected
+
396 
+
397  x1 = 0
+
398  x2 = 0
+
399  y1 = nan
+
400  y2 = nan
+
401  z1 = 0
+
402  z2 = 0
+
403  expected = source[(nx-1)/2][p][(nz-1)/2]
+
404  wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
405  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
406 
+
407  x1 = -inf
+
408  x2 = +inf
+
409  z1 = -inf
+
410  z2 = +inf
+
411  expected = x * nx * nz
+
412  wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
413  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
414 };
+
415 
+
417 static variable test_ad_extract_rod__z(){
+
418  variable nx = 11
+
419  variable ny = 16
+
420  variable nz = 21
+
421 
+
422  make /n=(nx,ny,nz) /d /free source
+
423  setscale /i x -1, 1, "X", source
+
424  setscale /i y -2, 2, "Y", source
+
425  setscale /i z -3, 3, "Z", source
+
426  setscale d 0, 0, "D", source
+
427  source = x + y + z
+
428 
+
429  variable x1, x2
+
430  variable y1, y2
+
431  variable z1, z2
+
432 
+
433  make /n=(nz) /d /free expected
+
434  setscale /i x -3, 3, "Z", expected
+
435  setscale d 0, 0, "D", expected
+
436 
+
437  x1 = 0
+
438  x2 = 0
+
439  y1 = 0
+
440  y2 = 0
+
441  z1 = nan
+
442  z2 = nan
+
443  expected = source[(nx-1)/2][(ny-1)/2][p]
+
444  wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
445  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
446 
+
447  x1 = -inf
+
448  x2 = +inf
+
449  y1 = -inf
+
450  y2 = +inf
+
451  expected = x * nx * ny
+
452  wave result = ad_extract_rod(source, x1, x2, y1, y2, z1, z2, "", noavg=1)
+
453  CHECK_EQUAL_WAVES(result, expected, tol=0.001)
+
454 };
+
455 
+
threadsafe wave ad_extract_slab_x(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
+
threadsafe wave ad_extract_rod_x(wave dataset, variable q1, variable q2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along X dimension.
+
static variable test_ad_extract_rod__x()
test the ad_extract_rod() function, X coordinate
+
static variable test_ad_extract_slab()
test the ad_extract_slab() function
+
static variable test_ad_extract_rod__z()
test the ad_extract_rod() function, Z coordinate
+
threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
threadsafe wave ad_extract_slab_z(wave dataset, variable r1, variable r2, string destname, variable noavg=defaultValue)
+
static variable test_ad_extract_rod__y()
test the ad_extract_rod() function, Y coordinate
+
threadsafe wave ad_extract_slab_y(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
+
static variable test_ad_extract_slab_z()
test the ad_extract_slab_z() function
+
static variable test_ad_profile_x_w()
test the ad_profile_x() function
+
static variable test_ad_extract_slab_y()
test the ad_extract_slab_y() function
+
threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
static variable test_ad_extract_rod_x()
test the ad_extract_rod_x() function
+
static variable test_ad_profile_y_w()
test the ad_profile_y() function
+
static variable test_ad_extract_slab_x()
test the ad_extract_slab_x() function
+
threadsafe wave ad_extract_rod(wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg=defaultValue, variable sdev=defaultValue, variable pscale=defaultValue)
1D cut through 3D dataset, integrate in normal dimensions
+
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
+
+
+ + + + diff --git a/doc/html/pearl-area-profiles_8ipf.html b/doc/html/pearl-area-profiles_8ipf.html new file mode 100644 index 0000000..f8041cb --- /dev/null +++ b/doc/html/pearl-area-profiles_8ipf.html @@ -0,0 +1,976 @@ + + + + + + +PEARL Procedures: pearl-area-profiles.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-area-profiles.ipf File Reference
+
+
+ +

profile extraction for multi-dimensional datasets acquired from area detectors. +More...

+ +

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlAreaProfiles
 profile extraction for multi-dimensional datasets acquired from area detectors.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

threadsafe wave ad_extract_rod (wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg=defaultValue, variable sdev=defaultValue, variable pscale=defaultValue)
 1D cut through 3D dataset, integrate in normal dimensions More...
 
threadsafe wave ad_extract_rod_x (wave dataset, variable q1, variable q2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
 1D cut through 3D dataset along X dimension. More...
 
threadsafe wave ad_extract_rod_y (wave dataset, variable p1, variable p2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
 1D cut through 3D dataset along Y dimension. More...
 
threadsafe wave ad_extract_rod_z (wave dataset, variable p1, variable p2, variable q1, variable q2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
 1D cut through 3D dataset along Z dimension. More...
 
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 More...
 
threadsafe wave ad_extract_slab_x (wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
 
threadsafe wave ad_extract_slab_y (wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
 
threadsafe wave ad_extract_slab_z (wave dataset, variable r1, variable r2, string destname, variable noavg=defaultValue)
 
threadsafe wave ad_profile_x (wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
 1D cut through 2D dataset along X dimension, new destination wave. More...
 
threadsafe wave ad_profile_x_w (wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
 1D cut through 2D dataset along X dimension, existing destination wave. More...
 
threadsafe wave ad_profile_y (wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
 1D cut through 2D dataset along Y dimension, new destination wave. More...
 
threadsafe wave ad_profile_y_w (wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
 1D cut through 2D dataset along X dimension, existing destination wave. More...
 
threadsafe variable calc_y_profile_mins (wave image)
 
variable ad_collect_multiscan_y (wave dataset, wave positions, wave destwave, variable noavg=defaultValue)
 collect profiles from a multi-scan. More...
 
+

Detailed Description

+

profile extraction for multi-dimensional datasets acquired from area detectors.

+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-area-profiles.ipf.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ad_collect_multiscan_y (wave dataset,
wave positions,
wave destwave,
variable noavg = defaultValue 
)
+
+ +

collect profiles from a multi-scan.

+
Warning
experimental: name and interface of this function may change.
+ +

Definition at line 621 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_rod (wave dataset,
variable x1,
variable x2,
variable y1,
variable y2,
variable z1,
variable z2,
string destname,
variable noavg = defaultValue,
variable sdev = defaultValue,
variable pscale = defaultValue 
)
+
+ +

1D cut through 3D dataset, integrate in normal dimensions

+
Parameters
+ + + + + + + +
dataset
x1,x2,y1,y2,z1,z2coordinates of integration region by default, the coordinates use wave scaling coordinates of rod dimensions (to be preserved) must be nan coordinate pairs don't have to be ordered, i.e. both x1 <= x2 and x1 >= x2 are allowed.
destnamename of destination wave. to be created in current data folder. if empty, the function returns a free wave
noavgnon-zero = calculate the sum, default = 0 as of version 1.05, this option should rather be called "calc_sum" or similar. it is noavg for compatibility with older code.
sdevnon-zero = calculate the standard deviation, default = 0 by default, the function calculates the average of the integration region set either the noavg or sdev option to select the sum or the standard deviation, respectively. if both options are set, noavg (sum) takes precedence.
pscalescaling of the slab coordinates x1, x2, ..., z2: zero or default = wave scaling, non-zero = point scaling
+
+
+
Remarks
    +
  • version 1.02: the specification of the destination coordinates has changed
  • +
  • version 1.04: the function returns an empty wave reference if an error occurred
  • +
+
+ +

Definition at line 54 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_rod_x (wave dataset,
variable q1,
variable q2,
variable r1,
variable r2,
string destname,
variable noavg = defaultValue,
variable sdev = defaultValue 
)
+
+ +

1D cut through 3D dataset along X dimension.

+

see ad_extract_rod() for descriptions of common parameters.

+ +

Definition at line 106 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_rod_y (wave dataset,
variable p1,
variable p2,
variable r1,
variable r2,
string destname,
variable noavg = defaultValue,
variable sdev = defaultValue 
)
+
+ +

1D cut through 3D dataset along Y dimension.

+

see ad_extract_rod() for descriptions of common parameters.

+ +

Definition at line 168 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_rod_z (wave dataset,
variable p1,
variable p2,
variable q1,
variable q2,
string destname,
variable noavg = defaultValue,
variable sdev = defaultValue 
)
+
+ +

1D cut through 3D dataset along Z dimension.

+

see ad_extract_rod() for descriptions of common parameters.

+ +

Definition at line 231 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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

+
Parameters
+ + + + + + +
dataset
x1,x2,y1,y2,z1,z2coordinates of integration region. by default, the coordinates use wave scaling. coordinates of slab dimensions (to be preserved) must be nan. coordinate pairs don't have to be ordered, i.e. both x1 <= x2 and x1 >= x2 are allowed. coordinates can be out of range (-inf and +inf allowed) to select the whole range.
destnamename of destination wave. to be created in current data folder. if empty, the function returns a free wave.
noavgzero or default = average, non-zero = sum.
pscalescaling of the slab coordinates x1, x2, ..., z2: zero or default = wave scaling, non-zero = point scaling.
+
+
+
Remarks
    +
  • version 1.02: the specification of the destination coordinates has changed
  • +
  • version 1.04: the function returns an empty wave reference if an error occurred
  • +
+
+ +

Definition at line 313 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_slab_x (wave dataset,
variable p1,
variable p2,
string destname,
variable noavg = defaultValue 
)
+
+ +

Definition at line 358 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_slab_y (wave dataset,
variable q1,
variable q2,
string destname,
variable noavg = defaultValue 
)
+
+ +

Definition at line 398 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_extract_slab_z (wave dataset,
variable r1,
variable r2,
string destname,
variable noavg = defaultValue 
)
+
+ +

Definition at line 438 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_profile_x (wave dataset,
variable q1,
variable q2,
string destname,
variable noavg = defaultValue 
)
+
+ +

1D cut through 2D dataset along X dimension, new destination wave.

+ +

Definition at line 480 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_profile_x_w (wave dataset,
variable q1,
variable q2,
wave destwave,
variable noavg = defaultValue 
)
+
+ +

1D cut through 2D dataset along X dimension, existing destination wave.

+ +

Definition at line 504 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_profile_y (wave dataset,
variable p1,
variable p2,
string destname,
variable noavg = defaultValue 
)
+
+ +

1D cut through 2D dataset along Y dimension, new destination wave.

+ +

Definition at line 542 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe wave ad_profile_y_w (wave dataset,
variable p1,
variable p2,
wave destwave,
variable noavg = defaultValue 
)
+
+ +

1D cut through 2D dataset along X dimension, existing destination wave.

+ +

Definition at line 567 of file pearl-area-profiles.ipf.

+ +
+
+ +
+
+ + + + + + + + +
threadsafe variable calc_y_profile_mins (wave image)
+
+ +

Definition at line 603 of file pearl-area-profiles.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-area-profiles_8ipf.js b/doc/html/pearl-area-profiles_8ipf.js new file mode 100644 index 0000000..4c2ad50 --- /dev/null +++ b/doc/html/pearl-area-profiles_8ipf.js @@ -0,0 +1,17 @@ +var pearl_area_profiles_8ipf = +[ + [ "ad_collect_multiscan_y", "pearl-area-profiles_8ipf.html#a3cadf0b28d1fd84e9922610c20868283", null ], + [ "ad_extract_rod", "pearl-area-profiles_8ipf.html#a8de5d4f1bcca91df5bbff568ab7b582d", null ], + [ "ad_extract_rod_x", "pearl-area-profiles_8ipf.html#a83700e2faf844e2480c89b6ca4c66a79", null ], + [ "ad_extract_rod_y", "pearl-area-profiles_8ipf.html#a363af257a04d51fff2a8d5b282f65f21", null ], + [ "ad_extract_rod_z", "pearl-area-profiles_8ipf.html#a3483707fbdbfdbaec069591a5d3b07a6", null ], + [ "ad_extract_slab", "pearl-area-profiles_8ipf.html#a65bb359c057a9d900c486e186c9974df", null ], + [ "ad_extract_slab_x", "pearl-area-profiles_8ipf.html#af612340d1d132cacda9de7bb77c2e0aa", null ], + [ "ad_extract_slab_y", "pearl-area-profiles_8ipf.html#a2eb6a0bcced893e827cfa4e1236e8460", null ], + [ "ad_extract_slab_z", "pearl-area-profiles_8ipf.html#a71f02613c4a4d21c014493e906dbe922", null ], + [ "ad_profile_x", "pearl-area-profiles_8ipf.html#ab1a65cf82f6933db3dd7b564582e8ed1", null ], + [ "ad_profile_x_w", "pearl-area-profiles_8ipf.html#aa40fd5049f993e72fd52a66a6cdde7cc", null ], + [ "ad_profile_y", "pearl-area-profiles_8ipf.html#abb1eed32a982037ebab00f5c3ea95e62", null ], + [ "ad_profile_y_w", "pearl-area-profiles_8ipf.html#a8b09e13162fa47cc076e1e661e80b002", null ], + [ "calc_y_profile_mins", "pearl-area-profiles_8ipf.html#ab58b7c0a88743ecbcb0fc8296577a792", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-area-profiles_8ipf_source.html b/doc/html/pearl-area-profiles_8ipf_source.html new file mode 100644 index 0000000..de41aac --- /dev/null +++ b/doc/html/pearl-area-profiles_8ipf_source.html @@ -0,0 +1,139 @@ + + + + + + +PEARL Procedures: pearl-area-profiles.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-area-profiles.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 = PearlAreaProfiles
4 #pragma version = 1.05
5 
19 
25 
54 threadsafe wave ad_extract_rod(wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg = defaultValue, variable sdev = defaultValue, variable pscale = defaultValue){
55  wave dataset
56  variable x1, x2, y1, y2, z1, z2
57  string destname
58  variable noavg
59  variable sdev
60  variable pscale
61 
62  if (wavedims(dataset) != 3)
63  return $""
64  endif
65  if (ParamIsDefault(noavg))
66  noavg = 0
67  endif
68  if (ParamIsDefault(sdev))
69  sdev = 0
70  endif
71  if (ParamIsDefault(pscale))
72  pscale = 0
73  endif
74 
75  variable p1, p2, q1, q2, r1, r2
76  if (pscale)
77  p1 = x1
78  p2 = x2
79  q1 = y1
80  q2 = y2
81  r1 = z1
82  r2 = z2
83  else
84  p1 = round((x1 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
85  p2 = round((x2 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
86  q1 = round((y1 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
87  q2 = round((y2 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
88  r1 = round((z1 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
89  r2 = round((z2 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
90  endif
91 
92  if ((numtype(p1) == 2) || (numtype(p2) == 2))
93  return ad_extract_rod_x(dataset, min(q1, q2), max(q1, q2), min(r1, r2), max(r1, r2), destname, noavg=noavg, sdev=sdev)
94  else if ((numtype(q1) == 2) || (numtype(q2) == 2))
95  return ad_extract_rod_y(dataset, min(p1, p2), max(p1, p2), min(r1, r2), max(r1, r2), destname, noavg=noavg, sdev=sdev)
96  else if ((numtype(r1) == 2) || (numtype(r2) == 2))
97  return ad_extract_rod_z(dataset, min(p1, p2), max(p1, p2), min(q1, q2), max(q1, q2), destname, noavg=noavg, sdev=sdev)
98  else
99  return $""
100  endif
101 };
102 
106 threadsafe wave ad_extract_rod_x(wave dataset, variable q1, variable q2, variable r1, variable r2, string destname, variable noavg = defaultValue, variable sdev = defaultValue){
107  wave dataset
108  variable q1, q2, r1, r2
109  // -inf < q1 < q2 < +inf, -inf < r1 < r2 < +inf
110  string destname
111  variable noavg
112  variable sdev
113 
114  if (ParamIsDefault(noavg))
115  noavg = 0
116  endif
117  if (ParamIsDefault(sdev))
118  sdev = 0
119  endif
120  variable avg = !noavg && !sdev
121 
122  q1 = max(q1, 0)
123  q2 = min(q2, dimsize(dataset, 1) - 1)
124  r1 = max(r1, 0)
125  r2 = min(r2, dimsize(dataset, 2) - 1)
126 
127  if (strlen(destname) > 0)
128  duplicate /r=[][q1,q1][r1,r1]/o dataset, $destname
129  wave w_dest = $destname
130  else
131  duplicate /r=[][q1,q1][r1,r1] /free dataset, w_dest
132  endif
133  redimension /n=(dimsize(w_dest, 0)) w_dest
134  setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
135 
136  w_dest = 0
137  variable qq, rr
138  variable nn = 0
139  for (qq = q1; qq <= q2; qq += 1)
140  for (rr = r1; rr <= r2; rr += 1)
141  w_dest += dataset[p][qq][rr]
142  nn += 1
143  endfor
144  endfor
145 
146  if (sdev)
147  duplicate /free w_dest, w_squares
148  w_squares = 0
149  for (qq = q1; qq <= q2; qq += 1)
150  for (rr = r1; rr <= r2; rr += 1)
151  w_squares += dataset[p][qq][rr]^2
152  endfor
153  endfor
154  endif
155 
156  if (avg)
157  w_dest /= nn
158  else if (sdev)
159  w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
160  endif
161 
162  return w_dest
163 };
164 
168 threadsafe wave ad_extract_rod_y(wave dataset, variable p1, variable p2, variable r1, variable r2, string destname, variable noavg = defaultValue, variable sdev = defaultValue){
169  wave dataset
170  variable p1, p2, r1, r2
171  // 0 <= p1 < p2 < dimsize(0), 0 <= r1 < r2 < dimsize(2)
172  string destname
173  variable noavg
174  variable sdev
175 
176  if (ParamIsDefault(noavg))
177  noavg = 0
178  endif
179  if (ParamIsDefault(sdev))
180  sdev = 0
181  endif
182  variable avg = !noavg && !sdev
183 
184  p1 = max(p1, 0)
185  p2 = min(p2, dimsize(dataset, 0) - 1)
186  r1 = max(r1, 0)
187  r2 = min(r2, dimsize(dataset, 2) - 1)
188 
189  if (strlen(destname) > 0)
190  duplicate /r=[p1,p1][][r1,r1]/o dataset, $destname
191  wave w_dest = $destname
192  else
193  duplicate /r=[p1,p1][][r1,r1] /free dataset, w_dest
194  endif
195  redimension /n=(dimsize(w_dest, 1)) w_dest
196  setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
197 
198  w_dest = 0
199  variable pp, rr
200  variable nn = 0
201  for (pp = p1; pp <= p2; pp += 1)
202  for (rr = r1; rr <= r2; rr += 1)
203  w_dest += dataset[pp][p][rr]
204  nn += 1
205  endfor
206  endfor
207 
208  if (sdev)
209  duplicate /free w_dest, w_squares
210  w_squares = 0
211  for (pp = p1; pp <= p2; pp += 1)
212  for (rr = r1; rr <= r2; rr += 1)
213  w_squares += dataset[pp][p][rr]^2
214  nn += 1
215  endfor
216  endfor
217  endif
218 
219  if (avg)
220  w_dest /= nn
221  else if (sdev)
222  w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
223  endif
224 
225  return w_dest
226 };
227 
231 threadsafe wave ad_extract_rod_z(wave dataset, variable p1, variable p2, variable q1, variable q2, string destname, variable noavg = defaultValue, variable sdev = defaultValue){
232  wave dataset
233  variable p1, p2, q1, q2
234  // 0 <= p1 < p2 < dimsize(0), 0 <= q1 < q2 < dimsize(1)
235  string destname
236  variable noavg
237  variable sdev
238 
239  if (ParamIsDefault(noavg))
240  noavg = 0
241  endif
242  if (ParamIsDefault(sdev))
243  sdev = 0
244  endif
245  variable avg = !noavg && !sdev
246 
247  p1 = max(p1, 0)
248  p2 = min(p2, dimsize(dataset, 0) - 1)
249  q1 = max(q1, 0)
250  q2 = min(q2, dimsize(dataset, 1) - 1)
251 
252  if (strlen(destname) > 0)
253  duplicate /r=[p1,p1][q1,q1][]/o dataset, $destname
254  wave w_dest = $destname
255  else
256  duplicate /r=[p1,p1][q1,q1][] /free dataset, w_dest
257  endif
258  redimension /n=(dimsize(w_dest, 2)) w_dest
259  setscale /p x dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
260 
261  w_dest = 0
262  variable pp, qq
263  variable nn = 0
264  for (pp = p1; pp <= p2; pp += 1)
265  for (qq = q1; qq <= q2; qq += 1)
266  w_dest += dataset[pp][qq][p]
267  nn += 1
268  endfor
269  endfor
270 
271  if (sdev)
272  duplicate /free w_dest, w_squares
273  w_squares = 0
274  for (pp = p1; pp <= p2; pp += 1)
275  for (qq = q1; qq <= q2; qq += 1)
276  w_squares += dataset[pp][qq][p]^2
277  nn += 1
278  endfor
279  endfor
280  endif
281 
282  if (avg)
283  w_dest /= nn
284  else if (sdev)
285  w_dest = sqrt( (w_squares - w_dest^2 / nn) / (nn - 1) )
286  endif
287 
288  return w_dest
289 };
290 
313 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){
314  wave dataset
315  variable x1, x2, y1, y2, z1, z2
316  string destname
317  variable noavg
318  variable pscale
319 
320  if (wavedims(dataset) != 3)
321  return $""
322  endif
323  if (ParamIsDefault(noavg))
324  noavg = 0
325  endif
326  if (ParamIsDefault(pscale))
327  pscale = 0
328  endif
329 
330  variable p1, p2, q1, q2, r1, r2
331  if (pscale)
332  p1 = x1
333  p2 = x2
334  q1 = y1
335  q2 = y2
336  r1 = z1
337  r2 = z2
338  else
339  p1 = round((x1 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
340  p2 = round((x2 - DimOffset(dataset, 0)) / DimDelta(dataset, 0))
341  q1 = round((y1 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
342  q2 = round((y2 - DimOffset(dataset, 1)) / DimDelta(dataset, 1))
343  r1 = round((z1 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
344  r2 = round((z2 - DimOffset(dataset, 2)) / DimDelta(dataset, 2))
345  endif
346 
347  if ((numtype(p1) < 2) && (numtype(p2) < 2))
348  return ad_extract_slab_x(dataset, min(p1, p2), max(p1, p2), destname, noavg=noavg)
349  else if ((numtype(q1) < 2) && (numtype(q2) < 2))
350  return ad_extract_slab_y(dataset, min(q1, q2), max(q1, q2), destname, noavg=noavg)
351  else if ((numtype(r1) < 2) && (numtype(r2) < 2))
352  return ad_extract_slab_z(dataset, min(r1, r2), max(r1, r2), destname, noavg=noavg)
353  else
354  return $""
355  endif
356 };
357 
358 threadsafe wave ad_extract_slab_x(wave dataset, variable p1, variable p2, string destname, variable noavg = defaultValue){
359  wave dataset
360  variable p1, p2
361  // x coordinate range (point scaling) to be integrated
362  // -inf <= p1 < p2 <= +inf
363  string destname// name of destination wave. to be created in current data folder. overrides existing.
364  // if empty, the function returns a free wave
365  variable noavg// zero or default = average, non-zero = sum
366 
367  if (ParamIsDefault(noavg))
368  noavg = 0
369  endif
370  p1 = max(p1, 0)
371  p2 = min(p2, dimsize(dataset, 0) - 1)
372 
373  if (strlen(destname) > 0)
374  duplicate /r=[p1,p1][][]/o dataset, $destname
375  wave w_dest = $destname
376  else
377  duplicate /r=[p1,p1][][] /free dataset, w_dest
378  endif
379  redimension /n=(dimsize(w_dest, 1), dimsize(w_dest, 2)) w_dest
380  setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
381  setscale /p y dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
382 
383  w_dest = 0
384  variable pp
385  variable nn = 0
386  for (pp = p1; pp <= p2; pp += 1)
387  w_dest += dataset[pp][p][q]
388  nn += 1
389  endfor
390 
391  if (noavg == 0)
392  w_dest /= nn
393  endif
394 
395  return w_dest
396 };
397 
398 threadsafe wave ad_extract_slab_y(wave dataset, variable q1, variable q2, string destname, variable noavg = defaultValue){
399  wave dataset
400  variable q1, q2
401  // y coordinate range (point scaling) to be integrated
402  // -inf <= q1 < q2 <= +inf
403  string destname// name of destination wave. to be created in current data folder. overrides existing.
404  // if empty, the function returns a free wave
405  variable noavg// zero or default = average, non-zero = sum
406 
407  if (ParamIsDefault(noavg))
408  noavg = 0
409  endif
410  q1 = max(q1, 0)
411  q2 = min(q2, dimsize(dataset, 1) - 1)
412 
413  if (strlen(destname) > 0)
414  duplicate /r=[][q1,q1][]/o dataset, $destname
415  wave w_dest = $destname
416  else
417  duplicate /r=[][q1,q1][] /free dataset, w_dest
418  endif
419  redimension /n=(dimsize(w_dest, 0), dimsize(w_dest, 2)) w_dest
420  setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
421  setscale /p y dimoffset(dataset, 2), dimdelta(dataset, 2), waveunits(dataset, 2), w_dest
422 
423  w_dest = 0
424  variable qq
425  variable nn = 0
426  for (qq = q1; qq <= q2; qq += 1)
427  w_dest += dataset[p][qq][q]
428  nn += 1
429  endfor
430 
431  if (noavg == 0)
432  w_dest /= nn
433  endif
434 
435  return w_dest
436 };
437 
438 threadsafe wave ad_extract_slab_z(wave dataset, variable r1, variable r2, string destname, variable noavg = defaultValue){
439  wave dataset
440  variable r1, r2
441  // z coordinate range (point scaling) to be integrated
442  // -inf <= r1 < r2 <= +inf
443  string destname// name of destination wave. to be created in current data folder. overrides existing.
444  // if empty, the function returns a free wave
445  variable noavg// zero or default = average, non-zero = sum
446 
447  if (ParamIsDefault(noavg))
448  noavg = 0
449  endif
450  r1 = max(r1, 0)
451  r2 = min(r2, dimsize(dataset, 2) - 1)
452 
453  if (strlen(destname) > 0)
454  duplicate /r=[][][r1,r1]/o dataset, $destname
455  wave w_dest = $destname
456  else
457  duplicate /r=[][][r1,r1] /free dataset, w_dest
458  endif
459  redimension /n=(dimsize(w_dest, 0), dimsize(w_dest, 1)) w_dest
460  setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), w_dest
461  setscale /p y dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), w_dest
462 
463  w_dest = 0
464  variable rr
465  variable nn = 0
466  for (rr = r1; rr <= r2; rr += 1)
467  w_dest += dataset[p][q][rr]
468  nn += 1
469  endfor
470 
471  if (noavg == 0)
472  w_dest /= nn
473  endif
474 
475  return w_dest
476 };
477 
480 threadsafe wave ad_profile_x(wave dataset, variable q1, variable q2, string destname, variable noavg = defaultValue){
481  wave dataset
482  variable q1, q2// -inf <= q1 < q2 <= +inf
483  // deprecated: q2 = -1 stands for dimsize(0) - 1
484  string destname// name of destination wave. to be created in current data folder. overrides existing.
485  // if empty, the function returns a free wave
486  variable noavg// zero or default = average, non-zero = sum
487 
488  if (ParamIsDefault(noavg))
489  noavg = 0
490  endif
491 
492  if (strlen(destname) > 0)
493  duplicate /r=[0,0][] /o dataset, $destname
494  wave w_dest = $destname
495  else
496  duplicate /r=[0,0][] /free dataset, w_dest
497  endif
498 
499  return ad_profile_x_w(dataset, q1, q2, w_dest, noavg=noavg)
500 };
501 
504 threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg = defaultValue){
505  wave dataset
506  variable q1, q2// -inf <= q1 < q2 <= +inf
507  // deprecated: q2 = -1 stands for dimsize(0) - 1
508  wave destwave// existing destination wave
509  variable noavg// zero or default = average, non-zero = sum
510 
511  if (ParamIsDefault(noavg))
512  noavg = 0
513  endif
514 
515  redimension /n=(dimsize(dataset, 0)) destwave
516  setscale /p x dimoffset(dataset, 0), dimdelta(dataset, 0), waveunits(dataset, 0), destwave
517  setscale d 0, 0, waveunits(dataset, -1), destwave
518 
519  q1 = max(q1, 0)
520  if (q2 < 0)
521  q2 = inf
522  endif
523  q2 = min(q2, dimsize(dataset, 1) - 1)
524 
525  destwave = 0
526  variable qq
527  variable nn = 0
528  for (qq = q1; qq <= q2; qq += 1)
529  destwave += dataset[p][qq]
530  nn += 1
531  endfor
532 
533  if (noavg == 0)
534  destwave /= nn
535  endif
536 
537  return destwave
538 };
539 
542 threadsafe wave ad_profile_y(wave dataset, variable p1, variable p2, string destname, variable noavg = defaultValue){
543  wave dataset
544  variable p1, p2// -inf <= p1 < p2 < inf
545  // deprecated: p2 = -1 stands for dimsize(0) - 1
546  string destname// name of destination wave. to be created in current data folder. overrides existing.
547  // if empty, the function returns a free wave
548  variable noavg// zero or default = average, non-zero = sum
549 
550  if (ParamIsDefault(noavg))
551  noavg = 0
552  endif
553 
554  if (strlen(destname) > 0)
555  duplicate /r=[][0,0] /o dataset, $destname
556  wave w_dest = $destname
557  else
558  duplicate /r=[][0,0] /free dataset, w_dest
559  endif
560  MatrixTranspose w_dest
561 
562  return ad_profile_y_w(dataset, p1, p2, w_dest, noavg=noavg)
563 };
564 
567 threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg = defaultValue){
568  wave dataset
569  variable p1, p2// -inf <= p1 < p2 < inf
570  // deprecated: p2 = -1 stands for dimsize(0) - 1
571  wave destwave// existing destination wave
572  variable noavg// zero or default = average, non-zero = sum
573 
574  if (ParamIsDefault(noavg))
575  noavg = 0
576  endif
577 
578  redimension /n=(dimsize(dataset, 1)) destwave
579  setscale /p x dimoffset(dataset, 1), dimdelta(dataset, 1), waveunits(dataset, 1), destwave
580  setscale d 0, 0, waveunits(dataset, -1), destwave
581 
582  p1 = max(p1, 0)
583  if (p2 < 0)
584  p2 = inf
585  endif
586  p2 = min(p2, dimsize(dataset, 0) - 1)
587 
588  destwave = 0
589  variable pp
590  variable nn = 0
591  for (pp = p1; pp <= p2; pp += 1)
592  destwave += dataset[pp][p]
593  nn += 1
594  endfor
595 
596  if (noavg == 0)
597  destwave /= nn
598  endif
599 
600  return destwave
601 };
602 
603 threadsafe variable calc_y_profile_mins(wave image){
604  // experimental
605  wave image
606 
607  wave yminlocs = ad_profile_x(image, 0, 0, "ymins", noavg=1)
608  variable nx = dimsize(image, 0)
609  variable ix
610  for (ix = 0; ix < nx; ix += 1)
611  wave profile = ad_profile_y(image, ix, ix, "", noavg=1)
612  wavestats /q/m=1 profile
613  yminlocs[ix] = v_minloc
614  endfor
615 };
616 
621 variable ad_collect_multiscan_y(wave dataset, wave positions, wave destwave, variable noavg = defaultValue){
622  wave dataset
623  wave positions
624  wave destwave
625  variable noavg
626 
627  variable tol = (wavemax(positions) - wavemin(positions)) / numpnts(positions) / 100
628 
629  duplicate /free positions, positions_sorted
630  sort positions_sorted, positions_sorted
631  duplicate /free positions_sorted, positions_diff
632  differentiate /p /meth=2 positions_sorted /d=positions_diff
633  positions_diff[0] = 1
634  extract /free positions_sorted, positions_unique, positions_diff > tol
635  variable n_unique = numpnts(positions_unique)
636  redimension /n=(dimsize(dataset, 0), n_unique) destwave
637 
638  variable i
639  variable nx, ny
640  for (i = 0; i < n_unique; i += 1)
641  extract /free dataset, data_extract, abs(positions[q] - positions_unique[i]) < tol
642  nx = dimsize(dataset, 0)
643  ny = dimsize(data_extract, 0) / nx
644  redimension /n=(nx, ny) data_extract
645  wave profile = ad_profile_x(data_extract, -inf, inf, "", noavg=noavg)
646  destwave[][i] = profile[p]
647  endfor
648 };
649 
threadsafe wave ad_extract_slab_x(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
+
threadsafe wave ad_extract_rod_x(wave dataset, variable q1, variable q2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along X dimension.
+
threadsafe wave ad_profile_y(wave dataset, variable p1, variable p2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along Y dimension, new destination wave.
+
threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
threadsafe wave ad_extract_slab_z(wave dataset, variable r1, variable r2, string destname, variable noavg=defaultValue)
+
variable ad_collect_multiscan_y(wave dataset, wave positions, wave destwave, variable noavg=defaultValue)
collect profiles from a multi-scan.
+
threadsafe wave ad_extract_slab_y(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
+
threadsafe wave ad_extract_rod_z(wave dataset, variable p1, variable p2, variable q1, variable q2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along Z dimension.
+
threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
threadsafe wave ad_extract_rod_y(wave dataset, variable p1, variable p2, variable r1, variable r2, string destname, variable noavg=defaultValue, variable sdev=defaultValue)
1D cut through 3D dataset along Y dimension.
+
threadsafe variable calc_y_profile_mins(wave image)
+
threadsafe wave ad_profile_x(wave dataset, variable q1, variable q2, string destname, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, new destination wave.
+
threadsafe wave ad_extract_rod(wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg=defaultValue, variable sdev=defaultValue, variable pscale=defaultValue)
1D cut through 3D dataset, integrate in normal dimensions
+
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
+
+
+ + + + diff --git a/doc/html/pearl-arpes-scans_8ipf.html b/doc/html/pearl-arpes-scans_8ipf.html new file mode 100644 index 0000000..c73491b --- /dev/null +++ b/doc/html/pearl-arpes-scans_8ipf.html @@ -0,0 +1,348 @@ + + + + + + +PEARL Procedures: pearl-arpes-scans.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-arpes-scans.ipf File Reference
+
+
+
#include "mm-physconst"
+#include "pearl-optics-theory"
+#include "pearl-epics"
+
+

Go to the source code of this file.

+ + + + + + + + + + +

+Functions

variable scienta_connect ()
 
variable pearl_set_attr_ch (string attr_wave_name, string attr_channel_name)
 
variable pearl_set_sscan (variable scan_rec_num)
 
variable pearl_repeat_scan ()
 
+ + + + + + + + + + + +

+Variables

 version
 
static const string camname = "cam1:"
 
static const string hdfname = "HDF1:"
 
static const string imgname = "image1:"
 
static const string statsname = "Stats1:"
 
+

Function Documentation

+ +
+
+ + + + + + + +
variable pearl_repeat_scan ()
+
+ +

Definition at line 144 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable pearl_set_attr_ch (string attr_wave_name,
string attr_channel_name 
)
+
+ +

Definition at line 81 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable pearl_set_sscan (variable scan_rec_num)
+
+ +

Definition at line 109 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable scienta_connect ()
+
+ +

Definition at line 19 of file pearl-arpes-scans.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string camname = "cam1:"
+
+static
+
+ +

Definition at line 14 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string hdfname = "HDF1:"
+
+static
+
+ +

Definition at line 15 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string imgname = "image1:"
+
+static
+
+ +

Definition at line 16 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string statsname = "Stats1:"
+
+static
+
+ +

Definition at line 17 of file pearl-arpes-scans.ipf.

+ +
+
+ +
+
+ + + + +
version
+
+Initial value:
= 1.01
+
+
+
+
+
+
static const string basename = "X03DA-SCIENTA:"
+
+

Definition at line 7 of file pearl-arpes-scans.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-arpes-scans_8ipf.js b/doc/html/pearl-arpes-scans_8ipf.js new file mode 100644 index 0000000..ad47613 --- /dev/null +++ b/doc/html/pearl-arpes-scans_8ipf.js @@ -0,0 +1,12 @@ +var pearl_arpes_scans_8ipf = +[ + [ "pearl_repeat_scan", "pearl-arpes-scans_8ipf.html#a5b2f104c8466eb172e23ef178da0e206", null ], + [ "pearl_set_attr_ch", "pearl-arpes-scans_8ipf.html#af0b12d7e0297ad419cfaa2c2d1c7b1c0", null ], + [ "pearl_set_sscan", "pearl-arpes-scans_8ipf.html#ac31a20c8e74e096d971ee60d89fe967c", null ], + [ "scienta_connect", "pearl-arpes-scans_8ipf.html#ad43d03d1950ae6a4588a798183394ad2", null ], + [ "camname", "pearl-arpes-scans_8ipf.html#a4df5fe0fab0f5073666d913fda12cb37", null ], + [ "hdfname", "pearl-arpes-scans_8ipf.html#aa3958e207908d818a8f929a94c4964df", null ], + [ "imgname", "pearl-arpes-scans_8ipf.html#a74ca01adc7c4a60ae1d3130369710f2a", null ], + [ "statsname", "pearl-arpes-scans_8ipf.html#afc31096ba568b84f616613dfb3d121d1", null ], + [ "version", "pearl-arpes-scans_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-arpes-scans_8ipf_source.html b/doc/html/pearl-arpes-scans_8ipf_source.html new file mode 100644 index 0000000..3420325 --- /dev/null +++ b/doc/html/pearl-arpes-scans_8ipf_source.html @@ -0,0 +1,287 @@ + + + + + + +PEARL Procedures: pearl-arpes-scans.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-arpes-scans.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 = PearlArpesScans
+
4 #pragma version = 1.01
+
5 #include "mm-physconst"
+
6 #include "pearl-optics-theory"
+
7 #include "pearl-epics", version >= 1.01
+
8 
+
9 // EPICS scans of Scienta
+
10 // matthias muntwiler, 2013-03-15
+
11 // $Id: pearl-optics-scans.ipf 129 2013-06-26 15:53:13Z muntwiler_m $
+
12 
+
13 static const string basename = "X03DA-SCIENTA:";
+
14 static const string camname = "cam1:";
+
15 static const string hdfname = "HDF1:";
+
16 static const string imgname = "image1:";
+
17 static const string statsname = "Stats1:";
+
18 
+
19 variable scienta_connect(){
+
20 
+
21  dfref savedf = GetDataFolderDFR()
+
22  print "connecting EPICS channels..."
+
23 
+
24  // channel lists
+
25  string controls = ""
+
26  controls += basename + camname + "PASS_ENERGY;"
+
27  controls += basename + camname + "LOW_ENERGY;"
+
28  controls += basename + camname + "CENTRE_ENERGY;"
+
29  controls += basename + camname + "HIGH_ENERGY;"
+
30  controls += basename + camname + "LENS_MODE;"
+
31  controls += basename + camname + "ACQ_MODE;"
+
32  controls += basename + camname + "ENERGY_MODE;"
+
33  controls += basename + camname + "DETECTOR_MODE;"
+
34  controls += basename + camname + "ELEMENT_SET;"
+
35  controls += basename + camname + "STEP_SIZE;"
+
36  controls += basename + camname + "SLICES;"
+
37  controls += basename + camname + "NumExposures;"
+
38  controls += basename + camname + "FRAMES;"
+
39  controls += basename + camname + "STEP_TIME;"
+
40 
+
41  string monitors = ""
+
42  monitors += basename + camname + "PASS_ENERGY_RBV;"
+
43  monitors += basename + camname + "LOW_ENERGY_RBV;"
+
44  monitors += basename + camname + "CENTRE_ENERGY_RBV;"
+
45  monitors += basename + camname + "HIGH_ENERGY_RBV;"
+
46  monitors += basename + camname + "ENERGY_WIDTH_RBV;"
+
47  monitors += basename + camname + "LENS_MODE_RBV;"
+
48  monitors += basename + camname + "ACQ_MODE_RBV;"
+
49  monitors += basename + camname + "ENERGY_MODE_RBV;"
+
50  monitors += basename + camname + "DETECTOR_MODE_RBV;"
+
51  monitors += basename + camname + "ELEMENT_SET_RBV;"
+
52  monitors += basename + camname + "STEP_SIZE_RBV;"
+
53  monitors += basename + camname + "SLICES_RBV;"
+
54  monitors += basename + camname + "NumExposures_RBV;"
+
55  monitors += basename + camname + "CURRENT_CHANNEL_RBV;"
+
56  monitors += basename + camname + "TOTAL_POINTS_RBV;"
+
57  monitors += basename + camname + "PROGRESS_RBV;"
+
58  //monitors += basename + camname + "INT_SPECTRUM;"
+
59  monitors += basename + camname + "BinX_RBV;"
+
60  monitors += basename + camname + "BinY_RBV;"
+
61  monitors += basename + camname + "MinX_RBV;"
+
62  monitors += basename + camname + "MinY_RBV;"
+
63  monitors += basename + camname + "SizeX_RBV;"
+
64  monitors += basename + camname + "SizeY_RBV;"
+
65  monitors += basename + camname + "ReverseX_RBV;"
+
66  monitors += basename + camname + "ReverseY_RBV;"
+
67 
+
68  // variable name list corresponding to channel lists
+
69  string variables = ""
+
70  variables = AddListItem("ArrayData", variables, ";", ItemsInList(variables))
+
71 
+
72  // connect EPICS channels
+
73  epics_connect(controls, monitors)
+
74 
+
75 
+
76  print "...done"
+
77  setdatafolder savedf
+
78 
+
79 };
+
80 
+
81 variable pearl_set_attr_ch(string attr_wave_name, string attr_channel_name){
+
82  string attr_wave_name
+
83  string attr_channel_name
+
84 
+
85  variable result
+
86  variable chid
+
87  pvOpen chid, attr_channel_name
+
88 
+
89  switch(wavetype($attr_wave_name, 1))
+
90  case 1:// numeric
+
91  wave w_attr = $attr_wave_name
+
92  pvPutNumber /Q chid, w_attr[0]
+
93  result = 0
+
94  break
+
95  case 2:// text
+
96  wave /t wt_attr = $attr_wave_name
+
97  pvPutString /Q chid, wt_attr[0]
+
98  result = 0
+
99  break
+
100  default:// error
+
101  result = -1
+
102  endswitch
+
103 
+
104  pvClose chid
+
105 
+
106  return result
+
107 };
+
108 
+
109 variable pearl_set_sscan(variable scan_rec_num){
+
110  variable scan_rec_num
+
111 
+
112  string chan_base = "X03DA-PC:scan" + num2str(scan_rec_num) + ":"
+
113  string wave_base = "Scan" + num2str(scan_rec_num)
+
114 
+
115  variable nfields
+
116  variable ifield
+
117  string wave_name
+
118  string chan_name
+
119  wave /z w_active = $(wave_base + "Active")
+
120  if (WaveExists(w_active))
+
121  if (w_active[0] != 0)
+
122  nfields = 4
+
123  for (ifield = 1; ifield <= nfields; ifield += 1)
+
124  sscanf wave_name, "%sPositioner%u", ifield
+
125  sscanf chan_name, "%sP%uPV", chan_base, ifield
+
126  pearl_set_attr_ch(wave_name, chan_name)
+
127  sscanf wave_name, "%sReadback%u", ifield
+
128  sscanf chan_name, "%sR%uPV", chan_base, ifield
+
129  pearl_set_attr_ch(wave_name, chan_name)
+
130  sscanf wave_name, "%sTrigger%u", ifield
+
131  sscanf chan_name, "%sT%uPV", chan_base, ifield
+
132  pearl_set_attr_ch(wave_name, chan_name)
+
133  endfor
+
134  nfields = 20
+
135  for (ifield = 1; ifield <= nfields; ifield += 1)
+
136  sscanf wave_name, "%sDetector%u", ifield
+
137  sscanf chan_name, "%sD%uPV", chan_base, ifield
+
138  pearl_set_attr_ch(wave_name, chan_name)
+
139  endfor
+
140  endif
+
141  endif
+
142 };
+
143 
+
144 variable pearl_repeat_scan(){
+
145  // set up a scan according to the attributes of the given dataset
+
146  dfref savedf = GetDataFolderDFR()
+
147 
+
148  setdatafolder :attr
+
149 
+
150 
+
151  setdatafolder savedf
+
152 };
+
153 
+
variable pearl_set_sscan(variable scan_rec_num)
+
static variable epics_connect()
connect the angle scan tracker to EPICS
+ +
static const string statsname
+
variable pearl_set_attr_ch(string attr_wave_name, string attr_channel_name)
+
static const string imgname
+
static const string camname
+
variable scienta_connect()
+
static const string hdfname
+
variable pearl_repeat_scan()
+
+
+ + + + diff --git a/doc/html/pearl-arpes_8ipf.html b/doc/html/pearl-arpes_8ipf.html new file mode 100644 index 0000000..67ede08 --- /dev/null +++ b/doc/html/pearl-arpes_8ipf.html @@ -0,0 +1,217 @@ + + + + + + +PEARL Procedures: pearl-arpes.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-arpes.ipf File Reference
+
+
+ +

data acquisition and analysis package for ARPES at PEARL. +More...

+
#include "pearl-area-display"
+#include "pearl-area-profiles"
+#include "pearl-area-import"
+#include "pearl-pshell-import"
+#include "pearl-data-explorer"
+#include "pearl-anglescan-process"
+#include "pearl-anglescan-tracker"
+#include "pearl-scienta-preprocess"
+#include "pearl-elog"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlArpes
 data acquisition and analysis package for ARPES at PEARL.
 
+ + + + + + +

+Functions

static variable AfterCompiledHook ()
 initializes package data once when the procedure is first loaded More...
 
variable UnloadPearlArpesPackage ()
 
+

Detailed Description

+

data acquisition and analysis package for ARPES at PEARL.

+

this procedure defines the PEARL ARPES package the main purpose of this file is to load the necessary dependent procedures (see the include statements at the top)

+
Precondition
    +
  • HDF5 XOP must be loaded.
  • +
  • on-line data acquisition functionality requires the EPICS XOP to be loaded
  • +
+
+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-arpes.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static variable AfterCompiledHook ()
+
+static
+
+ +

initializes package data once when the procedure is first loaded

+ +

Definition at line 81 of file pearl-arpes.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable UnloadPearlArpesPackage ()
+
+ +

Definition at line 88 of file pearl-arpes.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-arpes_8ipf.js b/doc/html/pearl-arpes_8ipf.js new file mode 100644 index 0000000..f097027 --- /dev/null +++ b/doc/html/pearl-arpes_8ipf.js @@ -0,0 +1,5 @@ +var pearl_arpes_8ipf = +[ + [ "AfterCompiledHook", "pearl-arpes_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed", null ], + [ "UnloadPearlArpesPackage", "pearl-arpes_8ipf.html#ac41f24572943dac2b40c255797a6c7a8", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-arpes_8ipf_source.html b/doc/html/pearl-arpes_8ipf_source.html new file mode 100644 index 0000000..d30c594 --- /dev/null +++ b/doc/html/pearl-arpes_8ipf_source.html @@ -0,0 +1,127 @@ + + + + + + +PEARL Procedures: pearl-arpes.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-arpes.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 = PearlArpes
4 #pragma version = 1.04
5 #include "pearl-area-display"// 2D and 3D data visualization
6 #include "pearl-area-profiles"// data processing for multi-dimensional datasets
7 #include "pearl-area-import"// import data files generated by area detector software
8 #include "pearl-pshell-import"
9 #include "pearl-data-explorer"// preview and import panel for PEARL data
10 #include "pearl-anglescan-process"
11 #include "pearl-anglescan-tracker"// live preview of hemispherical angle scan
12 #include "pearl-scienta-preprocess"// pre-processing functions for Scienta detector images
13 #include "pearl-elog"
14 #if exists("pvOpen")
15 #include "pearl-area-live"// live view of area detector
16 #include "pearl-epics"// EPICS access under Igor
17 #include "pearl-arpes-scans"// run ARPES scans under Igor
18 #endif
19 
20 // $Id$
21 //
22 // author: matthias.muntwiler@psi.ch
23 // Copyright (c) 2012-15 Paul Scherrer Institut
24 //
25 // Licensed under the Apache License, Version 2.0 (the "License");
26 // you may not use this file except in compliance with the License.
27 // You may obtain a copy of the License at
28 // http://www.apache.org/licenses/LICENSE-2.0
29 
48 
54 
79 
81 static variable AfterCompiledHook(){
82 
83  dfref savefolder = GetDataFolderDFR()
84 
85  return 0
86 };
87 
89  execute /p/q/z "DELETEINCLUDE \"pearl-arpes\""
90  execute /p/q/z "COMPILEPROCEDURES "
91 };
92 
variable UnloadPearlArpesPackage()
Definition: pearl-arpes.ipf:88
+
static variable AfterCompiledHook()
initializes package data once when the procedure is first loaded
Definition: pearl-arpes.ipf:81
+
+
+ + + + diff --git a/doc/html/pearl-data-explorer_8ipf.html b/doc/html/pearl-data-explorer_8ipf.html new file mode 100644 index 0000000..ccf814c --- /dev/null +++ b/doc/html/pearl-data-explorer_8ipf.html @@ -0,0 +1,1904 @@ + + + + + + +PEARL Procedures: pearl-data-explorer.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-data-explorer.ipf File Reference
+
+
+ +

preview and import panel for PEARL data +More...

+
#include "pearl-area-import"
+#include "pearl-area-profiles"
+#include "pearl-area-display"
+#include "pearl-pshell-import"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlDataExplorer
 preview and import panel for PEARL data
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

variable pearl_data_explorer ()
 
static variable init_package ()
 initialize the global variables of the data explorer. More...
 
static variable save_prefs ()
 
static variable load_prefs ()
 
static variable pearl_file_type (string filename)
 check whether a file can be imported by this module. More...
 
static variable update_filelist ()
 read a list of PEARL files from the file system More...
 
static variable update_datasets ()
 
static variable preview_file (string filename)
 
static wave preview_pshell_file (string filename)
 load the preview of a PShell HDF5 file. More...
 
static wave preview_hdf_file (string filename)
 load the preview of a PEARL HDF5 file. More...
 
static wave preview_itx_file (string filename)
 
static wave preview_mtrx_file (string filename)
 load the preview of a Matrix STM file. More...
 
static variable extract_preview_image (wave data, wave preview)
 
static variable preview_dataset (string datasetname)
 
static variable preview_datafolder ()
 
static variable preview_setscale_x (wave data, wave preview)
 
static variable preview_attributes (dfref attr_folder, dfref dest_folder=defaultValue, wave attr_filter=defaultValue, variable include_datawaves=defaultValue, variable include_infowaves=defaultValue)
 
static variable display_dataset (string datasetname)
 
variable test_attributes_notebook ()
 
static variable attributes_notebook (wave attr_names, wave attr_values, string title)
 
static variable notebook_add_attributes (string notebook_name, wave attr_filter, wave attr_names, wave attr_values)
 
static string show_preview_graph (wave data, wave xdata=defaultValue)
 
static string display_preview_trace (wave xtrace, wave ytrace)
 
static variable load_selected_files (string options=defaultValue)
 
static variable load_file (string filename, string options=defaultValue)
 
static variable prompt_hdf_options (string *options)
 
variable prompt_default_process (string *param)
 prototype for prompting for processing function parameters. More...
 
variable prompt_func_params (string func_name, string *func_param)
 
static dfr load_pshell_file (string filename, string options=defaultValue)
 
static dfr load_hdf_file (string filename, string options=defaultValue)
 
static dfr load_itx_file (string filename, string options=defaultValue)
 
static dfr load_mtrx_file (string filename, string options=defaultValue)
 load a matrix (STM) data file More...
 
string itx_suggest_foldername (string filename, variable ignoredate=defaultValue, string sourcename=defaultValue, variable unique=defaultValue)
 
void PearlDataExplorer ()
 
static variable bp_load_prefs (WMButtonAction *ba)
 
static variable bp_save_prefs (WMButtonAction *ba)
 
static variable bp_browse_filepath (WMButtonAction *ba)
 
static variable bp_update_filelist (WMButtonAction *ba)
 
static variable bp_load_files (WMButtonAction *ba)
 
static variable bp_load_files_opt (WMButtonAction *ba)
 
static variable bp_file_next (WMButtonAction *ba)
 
static variable bp_file_prev (WMButtonAction *ba)
 
static variable lbp_filelist (WMListboxAction *lba)
 
static variable bp_update_datasets (WMButtonAction *ba)
 
static variable bp_dataset_folder (WMButtonAction *ba)
 
static variable bp_dataset_display (WMButtonAction *ba)
 
static variable bp_dataset_next (WMButtonAction *ba)
 
static variable bp_dataset_prev (WMButtonAction *ba)
 
static variable lbp_datasets (WMListboxAction *lba)
 
static variable bp_attr_notebook (WMButtonAction *ba)
 
+ + + + + + + + + + + + + +

+Variables

static const string package_name = "pearl_explorer"
 
static const string package_path = "root:packages:pearl_explorer:"
 
static const string ks_filematch_adh5 = "*.h5"
 
static const string ks_filematch_pshell = "psh*.h5"
 
static const string ks_filematch_itx = "*.itx"
 
static const string ks_filematch_mtrx = "*_mtrx"
 
+

Detailed Description

+

preview and import panel for PEARL data

+

preview and import panel for PEARL data:

    +
  • area detector (HDF5) files from scienta analyser and prosilica cameras (if HDF5.xop is installed).
  • +
  • igor text files from s-scans and otf-scans.
  • +
  • pshell (HDF5) data files (if HDF5.xop is installed).
  • +
  • matrix STM files (if MatrixFileReader.xop is installed).
  • +
+ +

Definition in file pearl-data-explorer.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static variable attributes_notebook (wave attr_names,
wave attr_values,
string title 
)
+
+static
+
+ +

Definition at line 793 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_attr_notebook (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1721 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_browse_filepath (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1407 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_dataset_display (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1612 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_dataset_folder (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1586 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_dataset_next (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1632 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_dataset_prev (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1659 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_file_next (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1473 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_file_prev (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1505 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_load_files (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1445 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_load_files_opt (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1459 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_load_prefs (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1379 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_save_prefs (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1393 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_update_datasets (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1572 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_update_filelist (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1431 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable display_dataset (string datasetname)
+
+static
+
+ +

Definition at line 753 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string display_preview_trace (wave xtrace,
wave ytrace 
)
+
+static
+
+ +

Definition at line 910 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static variable extract_preview_image (wave data,
wave preview 
)
+
+static
+
+ +

Definition at line 465 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable init_package ()
+
+static
+
+ +

initialize the global variables of the data explorer.

+

initializes the global variables and data folder for this procedure file must be called once before the panel is created warning: this function overwrites previous values

+ +

Definition at line 55 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string itx_suggest_foldername (string filename,
variable ignoredate = defaultValue,
string sourcename = defaultValue,
variable unique = defaultValue 
)
+
+ +

Definition at line 1229 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable lbp_datasets (WMListboxAction * lba)
+
+static
+
+ +

Definition at line 1686 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable lbp_filelist (WMListboxAction * lba)
+
+static
+
+ +

Definition at line 1537 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static variable load_file (string filename,
string options = defaultValue 
)
+
+static
+
+ +

Definition at line 967 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static dfr load_hdf_file (string filename,
string options = defaultValue 
)
+
+static
+
+ +

Definition at line 1113 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static dfr load_itx_file (string filename,
string options = defaultValue 
)
+
+static
+
+ +

Definition at line 1163 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static dfr load_mtrx_file (string filename,
string options = defaultValue 
)
+
+static
+
+ +

load a matrix (STM) data file

+ +

Definition at line 1206 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable load_prefs ()
+
+static
+
+ +

Definition at line 116 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static dfr load_pshell_file (string filename,
string options = defaultValue 
)
+
+static
+
+ +

Definition at line 1061 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable load_selected_files (string options = defaultValue)
+
+static
+
+ +

Definition at line 943 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable notebook_add_attributes (string notebook_name,
wave attr_filter,
wave attr_names,
wave attr_values 
)
+
+static
+
+ +

Definition at line 832 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable pearl_data_explorer ()
+
+ +

Definition at line 44 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable pearl_file_type (string filename)
+
+static
+
+ +

check whether a file can be imported by this module.

+

the file type is determined by the extension of the file name.

+
Returns
file type
    +
  • 0 not a recognized file type
  • +
  • 1 PShell file (HDF5, name starts with psh_)
  • +
  • 2 area detector HDF5 file
  • +
  • 3 Igor text (itx) file
  • +
  • 4 Matrix STM file (*_mtrx)
  • +
+
+ +

Definition at line 161 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + + + +
void PearlDataExplorer ()
+
+ +

Definition at line 1288 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable preview_attributes (dfref attr_folder,
dfref dest_folder = defaultValue,
wave attr_filter = defaultValue,
variable include_datawaves = defaultValue,
variable include_infowaves = defaultValue 
)
+
+static
+
+ +

Definition at line 618 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable preview_datafolder ()
+
+static
+
+ +

Definition at line 547 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable preview_dataset (string datasetname)
+
+static
+
+ +

Definition at line 504 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable preview_file (string filename)
+
+static
+
+ +

Definition at line 255 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave preview_hdf_file (string filename)
+
+static
+
+ +

load the preview of a PEARL HDF5 file.

+

the preview is an arbitrary detector image extracted from the file, see adh5_load_preview(). the preview is loaded to the preview_image wave in the pear_explorer data folder.

+

the s_file_info string is updated with information about the scan dimensions.

+
Parameters
+ + +
filenamename of a file in the directory specified by the pearl_explorer_filepath path object.
+
+
+
Returns
wave reference of the preview image
+ +

Definition at line 350 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave preview_itx_file (string filename)
+
+static
+
+ +

Definition at line 382 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave preview_mtrx_file (string filename)
+
+static
+
+ +

load the preview of a Matrix STM file.

+

the preview is loaded to the preview_image wave in the pearl_explorer data folder.

+

the s_file_info string is updated with information about the scan dimensions.

+

this function requires the MatrixFileReader.xop and pearl-matrix-import.ipf to be loaded. otherwise it will return an empty wave reference.

+
Parameters
+ + +
filenamename of a file in the directory specified by the pearl_explorer_filepath path object.
+
+
+
Returns
wave reference of the preview image. empty wave reference if the function failed.
+ +

Definition at line 422 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave preview_pshell_file (string filename)
+
+static
+
+ +

load the preview of a PShell HDF5 file.

+

the preview is an arbitrary detector image extracted from the file, see adh5_load_preview(). the preview is loaded to the preview_image wave in the pear_explorer data folder.

+

the s_file_info string is updated with information about the scan dimensions.

+
Parameters
+ + +
filenamename of a file in the directory specified by the pearl_explorer_filepath path object.
+
+
+
Returns
wave reference of the preview image
+ +

Definition at line 307 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static variable preview_setscale_x (wave data,
wave preview 
)
+
+static
+
+ +

Definition at line 588 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable prompt_default_process (string * param)
+
+ +

prototype for prompting for processing function parameters.

+

the function should prompt the user for function parameters, and update the param argument if the user clicked OK. returns 0 if the user clicked OK, 1 if the user cancelled.

+

prompt functions must have the same name as the corresponding reduction function with the prefix "prompt_". be aware of the limited length of function names in Igor.

+

this function is a prototype. it does nothing but returns OK.

+ +

Definition at line 1041 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable prompt_func_params (string func_name,
string * func_param 
)
+
+ +

Definition at line 1047 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable prompt_hdf_options (string * options)
+
+static
+
+ +

Definition at line 1002 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable save_prefs ()
+
+static
+
+ +

Definition at line 96 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string show_preview_graph (wave data,
wave xdata = defaultValue 
)
+
+static
+
+ +

Definition at line 859 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable test_attributes_notebook ()
+
+ +

Definition at line 786 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable update_datasets ()
+
+static
+
+ +

Definition at line 212 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable update_filelist ()
+
+static
+
+ +

read a list of PEARL files from the file system

+

wtFiles and wSelectedFiles in the package data folder are updated. only files for which pearl_file_type() returns non-zero are listed.

+ +

Definition at line 184 of file pearl-data-explorer.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string ks_filematch_adh5 = "*.h5"
+
+static
+
+ +

Definition at line 39 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string ks_filematch_itx = "*.itx"
+
+static
+
+ +

Definition at line 41 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string ks_filematch_mtrx = "*_mtrx"
+
+static
+
+ +

Definition at line 42 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string ks_filematch_pshell = "psh*.h5"
+
+static
+
+ +

Definition at line 40 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_name = "pearl_explorer"
+
+static
+
+ +

Definition at line 36 of file pearl-data-explorer.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_path = "root:packages:pearl_explorer:"
+
+static
+
+ +

Definition at line 37 of file pearl-data-explorer.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-data-explorer_8ipf.js b/doc/html/pearl-data-explorer_8ipf.js new file mode 100644 index 0000000..9db751d --- /dev/null +++ b/doc/html/pearl-data-explorer_8ipf.js @@ -0,0 +1,59 @@ +var pearl_data_explorer_8ipf = +[ + [ "attributes_notebook", "pearl-data-explorer_8ipf.html#ad6cfb2c00d5112add84542a25eb68b19", null ], + [ "bp_attr_notebook", "pearl-data-explorer_8ipf.html#a4ef196f752bb5780ed4f4a588f9ebc81", null ], + [ "bp_browse_filepath", "pearl-data-explorer_8ipf.html#a02a64144b7ed2c1bc230e265c55e81a1", null ], + [ "bp_dataset_display", "pearl-data-explorer_8ipf.html#a5660c6f5f78d880b0805bad4eefed1d5", null ], + [ "bp_dataset_folder", "pearl-data-explorer_8ipf.html#a6b642da731bde1029e0fa2ff69d5fb06", null ], + [ "bp_dataset_next", "pearl-data-explorer_8ipf.html#a3bbb332e319ef7ec5f0fe2d16afaf005", null ], + [ "bp_dataset_prev", "pearl-data-explorer_8ipf.html#add62ff5193206c9f207952bcd72dac88", null ], + [ "bp_file_next", "pearl-data-explorer_8ipf.html#a9cefcdc49b2169e99c743b0a683ed3a6", null ], + [ "bp_file_prev", "pearl-data-explorer_8ipf.html#a6aa44ff12b8530adbaaaf7405b1a68ba", null ], + [ "bp_load_files", "pearl-data-explorer_8ipf.html#a742902dfaf2246f10b70f52805c6df1f", null ], + [ "bp_load_files_opt", "pearl-data-explorer_8ipf.html#ad61aa85dcf24dbf7e093dac3d0bf6f19", null ], + [ "bp_load_prefs", "pearl-data-explorer_8ipf.html#a1868754e64cb1448e564c0936e78574d", null ], + [ "bp_save_prefs", "pearl-data-explorer_8ipf.html#ad8a01428a137278a31d4f1f4f9c634c5", null ], + [ "bp_update_datasets", "pearl-data-explorer_8ipf.html#af9f8769ca2989f152f23d976d1467a48", null ], + [ "bp_update_filelist", "pearl-data-explorer_8ipf.html#a45be265789a5260e3daa05eca0ec309e", null ], + [ "display_dataset", "pearl-data-explorer_8ipf.html#ae79a57a41c734ce8836f427b81011b5d", null ], + [ "display_preview_trace", "pearl-data-explorer_8ipf.html#a001074020ad32b290d390a450a389c69", null ], + [ "extract_preview_image", "pearl-data-explorer_8ipf.html#a0adc1b370fd3bf230b61b094b3c0accb", null ], + [ "init_package", "pearl-data-explorer_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725", null ], + [ "itx_suggest_foldername", "pearl-data-explorer_8ipf.html#a6b5e9729ee6dedbb217c741639a168ed", null ], + [ "lbp_datasets", "pearl-data-explorer_8ipf.html#a8ec37ab6c651003957d7e1ba728de89e", null ], + [ "lbp_filelist", "pearl-data-explorer_8ipf.html#a614e89b9c06511144ccb380e61cc7bd6", null ], + [ "load_file", "pearl-data-explorer_8ipf.html#a1bbf3e1592f3344f3628526fa549dfdf", null ], + [ "load_hdf_file", "pearl-data-explorer_8ipf.html#a0c839d5f8f49e6937a6532bba3ef3714", null ], + [ "load_itx_file", "pearl-data-explorer_8ipf.html#a26f2f2bf5efc39dabb2a01abcc559e3e", null ], + [ "load_mtrx_file", "pearl-data-explorer_8ipf.html#a98e327fa65bbcb3cd7c97545f7201afe", null ], + [ "load_prefs", "pearl-data-explorer_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3", null ], + [ "load_pshell_file", "pearl-data-explorer_8ipf.html#a74c69e870329c5dd3b08f92bdeb21d87", null ], + [ "load_selected_files", "pearl-data-explorer_8ipf.html#a2178d5acf21fe4372ecc06224bec28ba", null ], + [ "notebook_add_attributes", "pearl-data-explorer_8ipf.html#a0c162346b59b0f66d34ee26ce5fe1e52", null ], + [ "pearl_data_explorer", "pearl-data-explorer_8ipf.html#ab7e3b3a0a901f7559ee9f5affb9a6fca", null ], + [ "pearl_file_type", "pearl-data-explorer_8ipf.html#a8a923d7095071e7e6f99018379807732", null ], + [ "PearlDataExplorer", "pearl-data-explorer_8ipf.html#a5b824531904179a94e0eaa3ffa09172e", null ], + [ "preview_attributes", "pearl-data-explorer_8ipf.html#a415e4867be1ee37d84fd609b06f6dcb8", null ], + [ "preview_datafolder", "pearl-data-explorer_8ipf.html#a6e8eaf8c092f5da60bd425f9bd8bf178", null ], + [ "preview_dataset", "pearl-data-explorer_8ipf.html#a68d38e9464f7d13520ec040cffdf5c3b", null ], + [ "preview_file", "pearl-data-explorer_8ipf.html#a3232c51a8c19eaf86b9bc67352967a9f", null ], + [ "preview_hdf_file", "pearl-data-explorer_8ipf.html#a1731f8e1507d90e285885723ae32ba13", null ], + [ "preview_itx_file", "pearl-data-explorer_8ipf.html#a4633885afab755fbc5d262178b9ddcb8", null ], + [ "preview_mtrx_file", "pearl-data-explorer_8ipf.html#a340f334c6caa966ee1eb891614e57b5b", null ], + [ "preview_pshell_file", "pearl-data-explorer_8ipf.html#a457d2257ffd5880ab858fa583a5d1c99", null ], + [ "preview_setscale_x", "pearl-data-explorer_8ipf.html#a5a7d3c00360944c00f236900b992694d", null ], + [ "prompt_default_process", "pearl-data-explorer_8ipf.html#a505ebda6bdecc4120e01766d7aedaf5d", null ], + [ "prompt_func_params", "pearl-data-explorer_8ipf.html#a1d7f4ad59b81ecd84bb63cfabd9f24dc", null ], + [ "prompt_hdf_options", "pearl-data-explorer_8ipf.html#a200e7ba052fbce4614fb4254701646ab", null ], + [ "save_prefs", "pearl-data-explorer_8ipf.html#ac729557a307bddd2f2ad298199976c01", null ], + [ "show_preview_graph", "pearl-data-explorer_8ipf.html#a4db79d04c74beb1af71b72916f8f0362", null ], + [ "test_attributes_notebook", "pearl-data-explorer_8ipf.html#a71f9c277d310c3f4e7739be69dad0ab5", null ], + [ "update_datasets", "pearl-data-explorer_8ipf.html#ad50f4c430d8bfe0fb5a1356cd9b84bf4", null ], + [ "update_filelist", "pearl-data-explorer_8ipf.html#a04cc0b9d5e3a649ba3514fcbf126eefe", null ], + [ "ks_filematch_adh5", "pearl-data-explorer_8ipf.html#a181ccce237172811baf3de5a7a06370d", null ], + [ "ks_filematch_itx", "pearl-data-explorer_8ipf.html#a53af8689144e3aeb27ca177db5dd0c22", null ], + [ "ks_filematch_mtrx", "pearl-data-explorer_8ipf.html#ad720655ff881ddecae2e1b8afed58fa0", null ], + [ "ks_filematch_pshell", "pearl-data-explorer_8ipf.html#a00bf5267a40b2b3d760c64d73e139878", null ], + [ "package_name", "pearl-data-explorer_8ipf.html#aca457d1f4414d20a911254b1de13ebbb", null ], + [ "package_path", "pearl-data-explorer_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-data-explorer_8ipf_source.html b/doc/html/pearl-data-explorer_8ipf_source.html new file mode 100644 index 0000000..192a425 --- /dev/null +++ b/doc/html/pearl-data-explorer_8ipf_source.html @@ -0,0 +1,198 @@ + + + + + + +PEARL Procedures: pearl-data-explorer.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
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
+
+
+ + + + diff --git a/doc/html/pearl-data-export_8ipf.html b/doc/html/pearl-data-export_8ipf.html new file mode 100644 index 0000000..648907b --- /dev/null +++ b/doc/html/pearl-data-export_8ipf.html @@ -0,0 +1,152 @@ + + + + + + +PEARL Procedures: pearl-data-export.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-data-export.ipf File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Functions

variable export_otf ()
 
+

Function Documentation

+ +
+
+ + + + + + + +
variable export_otf ()
+
+ +

Definition at line 3 of file pearl-data-export.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-data-export_8ipf.js b/doc/html/pearl-data-export_8ipf.js new file mode 100644 index 0000000..5c1b873 --- /dev/null +++ b/doc/html/pearl-data-export_8ipf.js @@ -0,0 +1,4 @@ +var pearl_data_export_8ipf = +[ + [ "export_otf", "pearl-data-export_8ipf.html#a27b4af8e1f750b82aeafa153bddcc0f8", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-data-export_8ipf_source.html b/doc/html/pearl-data-export_8ipf_source.html new file mode 100644 index 0000000..1002fb6 --- /dev/null +++ b/doc/html/pearl-data-export_8ipf_source.html @@ -0,0 +1,154 @@ + + + + + + +PEARL Procedures: pearl-data-export.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-data-export.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3// Use modern global access method and strict wave access.
+
2 
+
3 variable export_otf(){
+
4  // export OTF folders to text files
+
5 
+
6  string objname
+
7  variable index= 0
+
8 
+
9  setdatafolder root:
+
10  dfref parentfolder = getdatafolderdfr()
+
11  string filename
+
12 
+
13  do
+
14  objname = GetindexedObjNameDFR(parentfolder, 4, index)
+
15  if (strlen(objname) > 0)
+
16  if (cmpstr(StringFromList(0, objname, "_"), "otf") == 0)
+
17  setdatafolder parentfolder
+
18  setdatafolder $objname
+
19  wave ringcurrent,photonenergy,current_ch1,current_ch2
+
20  filename = objname + ".txt"
+
21  Save/G/M="\r\n"/W/P=pearl_explorer_filepath photonenergy,current_ch1,current_ch2,ringcurrent as filename
+
22  endif
+
23  index += 1
+
24  else
+
25  break
+
26  endif
+
27  while(1)
+
28 };
+
29 
+
variable export_otf()
+
+
+ + + + diff --git a/doc/html/pearl-elog_8ipf.html b/doc/html/pearl-elog_8ipf.html new file mode 100644 index 0000000..7681041 --- /dev/null +++ b/doc/html/pearl-elog_8ipf.html @@ -0,0 +1,2259 @@ + + + + + + +PEARL Procedures: pearl-elog.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-elog.ipf File Reference
+
+
+ +

interface for writing ELOG entries with Igor graphs as attachment. +More...

+ +

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlElog
 interface for writing ELOG entries with Igor graphs as attachment.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

variable pearl_elog (string logbook)
 main function to initialize ELOG and to open an ELOG panel. More...
 
static variable IgorBeforeNewHook (string igorApplicationNameStr)
 save preferences and recent values before Igor opens a new experiment. More...
 
static variable IgorQuitHook (string igorApplicationNameStr)
 save preferences and recent values before Igor quits. More...
 
static variable AfterFileOpenHook (variable refNum, string file, string pathName, string type, string creator, variable kind)
 initialize the package and reload preferences after an experiment is loaded. More...
 
static dfr get_elog_df (string name, variable category)
 get the package, logbook, or template datafolder. More...
 
static variable init_package (variable clean=defaultValue)
 initialize the package data folder. More...
 
variable elog_init_pearl_templates ()
 setup PEARL template logbooks. More...
 
static variable init_volatile_vars ()
 initialize volatile variables. More...
 
variable elog_create_logbook (string name, string template=defaultValue)
 create a new logbook. More...
 
variable elog_config (string elog_path=defaultValue, string hostname=defaultValue, variable port=defaultValue, string subdir=defaultValue)
 set global module configuration parameters More...
 
variable elog_login (string logbook, string username, string password)
 set username and password for login to a logbook More...
 
variable elog_logout (string logbook)
 clear username and password of a logbook or all logbooks. More...
 
static variable save_prefs ()
 save persistent package data to the preferences file. More...
 
static variable load_prefs ()
 load persistent package data from the preferences file. More...
 
static string list_logbooks (variable templates=defaultValue)
 get a list of configured logbooks or templates. More...
 
variable elog_validate_attributes (string logbook, string attributes)
 validate attributes More...
 
variable elog_create_entry (string logbook, string attributes, string message, variable encoding=defaultValue, string graphs=defaultValue, variable replyto=defaultValue)
 create a new entry in ELOG More...
 
variable elog_add_attachment (string logbook, variable id, string graphs)
 add one or more graphs to an existing ELOG entry More...
 
static string prepare_command_line (string logbook)
 format the ELOG command and essential address arguments. More...
 
static string format_url (string logbook)
 format the URL for display to the user More...
 
static string prepare_graph_attachments (string graphs)
 prepare screenshots of graph windows for attachments More...
 
static string get_timestamp (string sep)
 
static string create_message_file (string message)
 
static string create_graph_file (string graphname, variable fileindex)
 
static string create_cmd_file (string cmd)
 
static string get_log_path ()
 
static variable cleanup_temp_files ()
 delete temporary files created by the ELOG module. More...
 
static variable parse_result ()
 parse the result file from an elog invokation. More...
 
string elog_prompt_logbook ()
 prompt to open or create a logbook More...
 
variable elog_prompt_login (string logbook)
 prompt the user for login to a logbook More...
 
string PearlElogPanel (string logbook)
 open a new panel for submitting data to ELOG. More...
 
static variable elog_panel_hook (WMWinHookStruct *s)
 
static variable update_attach_items (string logbook)
 update the list of attachments More...
 
static variable move_attach_item (string logbook, variable item, variable distance)
 move an attachment item in the list of attachments More...
 
static variable bp_attach_updown (WMButtonAction *ba)
 button procedure for the attachment up and down buttons More...
 
static variable bp_submit (WMButtonAction *ba)
 button procedure for the Submit and Reply buttons More...
 
static variable bp_attach_top (WMButtonAction *ba)
 select top graph window for attachment More...
 
static variable bp_attach_allnone (WMButtonAction *ba)
 select/deselect all graph windows for attachment More...
 
static variable bp_attach (WMButtonAction *ba)
 
static variable bp_save_graphs (WMButtonAction *ba)
 
static variable bp_clear (WMButtonAction *ba)
 
static variable bp_login (WMButtonAction *ba)
 
static variable bp_logout (WMButtonAction *ba)
 
static string get_default_panel_name ()
 
static string get_panel_attributes (string windowname)
 get a list of attributes from the fields of the ELOG panel. More...
 
static string set_panel_attributes (string windowname, string attributes, variable clear=defaultValue)
 set the fields of the ELOG panel More...
 
static string get_panel_message (string windowname)
 get the message field of the ELOG panel More...
 
static string set_panel_message (string windowname, string message)
 set the message field of the ELOG panel More...
 
static string get_panel_graphs (string windowname)
 get the names of the graphs selected for attachment More...
 
static string set_panel_graphs (string windowname, string graphs)
 update selection of graphs for attachment More...
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Variables

static const string package_name = "pearl_elog"
 
static const string package_path = "root:packages:pearl_elog:"
 
static const variable kdfRoot = 0
 
static const variable kdfVolatile = 1
 
static const variable kdfPersistent = 2
 
static const variable kdfTemplates = 3
 
static const string elog_success_msg = "Message successfully transmitted"
 
static const string elog_parse_id = "ID=%u"
 
static const variable kAttachColSel = 0
 
static const variable kAttachColTitle = 1
 
static const variable kAttachColName = 2
 
+

Detailed Description

+

interface for writing ELOG entries with Igor graphs as attachment.

+

the functions in this module support the following ELOG features:

    +
  • submit new entries and replies to existing entries.
  • +
  • text field, list box, and check box attributes.
  • +
  • attach any Igor graph to ELOG.
  • +
  • configurable logbook templates for logbooks that share the same configuration.
  • +
  • common server configurations available on the ELOG command line (hostname, port, SSL, username, password, sub-directory).
  • +
  • not specific to the configuration at PEARL. PEARL code is concentrated in the elog_init_pearl_templates() function.
  • +
  • the configuration of the ELOG server and logbooks as well as the most recently used attributes are persisted in the preference file.
  • +
+

usage:

    +
  1. the administrator of the ELOG server creates logbook templates according to the configuration of the logbooks. the templates are written in Igor code.
  2. +
  3. the user opens logbooks via the Open ELOG panel menu item. before first use, select a template and enter a name for the logbook. the new logbook is written to the preference file, and can afterwards be opened directly.
  4. +
  5. if the server requires a user name and password, click the login button.
  6. +
  7. edit the message, attributes and attachments as necessary, and submit to ELOG.
  8. +
  9. log out before saving the experiment to clear the password.
  10. +
+
Attention
the user name and password are stored in the global data tree of an experiment. it is not possible to handle passwords safely in Igor. they can be read by anyone having access to an open Igor experiment or a saved experiment file (unless the password is reset before saving). therefore:
    +
  • use a password for the ELOG server which is different from your other passwords.
  • +
  • clear the password (logout button in the panel) before saving an experiment.
  • +
+
+

elog command line

*  elog -h <hostname> [-p port] [-d subdir]
+*                               Location where elogd is running
+*      -l logbook               Name of logbook
+*      -s                       Use SSL for communication
+*      [-v]                     For verbose output
+*      [-w password]            Write password defined on server
+*      [-u username password]   User name and password
+*      [-f <attachment>]        Up to 50 attachments
+*      -a <attribute>=<value>   Up to 50 attributes
+*      [-r <id>]                Reply to existing message
+*      [-q]                     Quote original text on reply
+*      [-e <id>]                Edit existing message
+*      [-x]                     Suppress email notification
+*      [-n 0|1|2]               Encoding: 0:ELcode,1:plain,2:HTML
+*      -m <textfile>] | <text>
+* 
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-elog.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable AfterFileOpenHook (variable refNum,
string file,
string pathName,
string type,
string creator,
variable kind 
)
+
+static
+
+ +

initialize the package and reload preferences after an experiment is loaded.

+ +

Definition at line 143 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_attach (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1558 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_attach_allnone (WMButtonAction * ba)
+
+static
+
+ +

select/deselect all graph windows for attachment

+ +

Definition at line 1537 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_attach_top (WMButtonAction * ba)
+
+static
+
+ +

select top graph window for attachment

+ +

Definition at line 1521 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_attach_updown (WMButtonAction * ba)
+
+static
+
+ +

button procedure for the attachment up and down buttons

+ +

Definition at line 1442 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_clear (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1619 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_login (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1635 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_logout (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1653 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_save_graphs (WMButtonAction * ba)
+
+static
+
+ +

Definition at line 1591 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable bp_submit (WMButtonAction * ba)
+
+static
+
+ +

button procedure for the Submit and Reply buttons

+ +

Definition at line 1474 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable cleanup_temp_files ()
+
+static
+
+ +

delete temporary files created by the ELOG module.

+

this deletes all temporary graph files that are referenced by the volatile temp_graph_files list. temp_graph_files is a semicolon-delimited string. items are added by create_graph_file().

+

this function should be called before a new experiment is loaded or igor quits.

+ +

Definition at line 1039 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string create_cmd_file (string cmd)
+
+static
+
+ +

Definition at line 1001 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string create_graph_file (string graphname,
variable fileindex 
)
+
+static
+
+ +

Definition at line 976 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string create_message_file (string message)
+
+static
+
+ +

Definition at line 957 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable elog_add_attachment (string logbook,
variable id,
string graphs 
)
+
+ +

add one or more graphs to an existing ELOG entry

+
Parameters
+ + + + +
logbookname of the target logbook
ididentification number of the existing entry
graphsnames of graph windows to be added as attachments, semicolon separated
+
+
+
Warning
this will delete all existing attachments of the entry!
+ +

Definition at line 788 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable elog_config (string elog_path = defaultValue,
string hostname = defaultValue,
variable port = defaultValue,
string subdir = defaultValue 
)
+
+ +

set global module configuration parameters

+ +

Definition at line 473 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable elog_create_entry (string logbook,
string attributes,
string message,
variable encoding = defaultValue,
string graphs = defaultValue,
variable replyto = defaultValue 
)
+
+ +

create a new entry in ELOG

+

this is the main function to create a new entry in a logbook.

+
Parameters
+ + + + + + + +
logbookname of the target logbook.
attributeskey=value list of attributes, semicolon separated.
messagefree text part of the entry.
encodingencoding of message, 0:ELcode, 1:plain (default), 2:HTML.
graphsnames of graph windows to be added as attachments, semicolon separated.
replytoexisting message ID (> 1) to follow up on. 0 or default: start new thread.
+
+
+
Returns
ID number of the new entry (> 0), or error code (< 0).
    +
  • -1: failed to save temporary message file.
  • +
  • -2: invalid/missing command line.
  • +
  • -3: invalid/missing attributes.
  • +
  • -4: elog returned error
  • +
+
+ +

Definition at line 685 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable elog_create_logbook (string name,
string template = defaultValue 
)
+
+ +

create a new logbook.

+

create a new empty logbook or duplicate from a template.

+
Parameters
+ + + +
namename of the new logbook. if the logbook exists, the existing logbook folder is killed and replaced by a new one. this may fail if a window is still open.
templatename of the template. if empty string, a new empty logbook is created.
+
+
+ +

Definition at line 414 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable elog_init_pearl_templates ()
+
+ +

setup PEARL template logbooks.

+

template logbooks for PEARL.

+
Remarks
this function is specific to the setup at PEARL.
+ +

Definition at line 262 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable elog_login (string logbook,
string username,
string password 
)
+
+ +

set username and password for login to a logbook

+

the username and password are stored (in plain text) in global strings under the selected logbook folder. this is necessary for sending data to the ELOG server.

+

call elog_logout() to clear the password variables and to avoid unintended use of your credentials.

+
Warning
igor does not have a built-in mechanism to protect passwords. user names and passwords are stored in plain text in the data folder tree. as such they are saved to experiment files and preferences.
+
Parameters
+ + +
logbookname of the target logbook.
+
+
+ +

Definition at line 513 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable elog_logout (string logbook)
+
+ +

clear username and password of a logbook or all logbooks.

+

the username and password are stored (in plain text) in global strings under the selected logbook folder. this function resets the username and password strings.

+
Parameters
+ + +
logbookname of the target logbook. if empty, the passwords of all logbooks are cleared.
+
+
+ +

Definition at line 533 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable elog_panel_hook (WMWinHookStruct * s)
+
+static
+
+ +

Definition at line 1318 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + +
string elog_prompt_logbook ()
+
+ +

prompt to open or create a logbook

+ +

Definition at line 1108 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable elog_prompt_login (string logbook)
+
+ +

prompt the user for login to a logbook

+ +

Definition at line 1138 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable elog_validate_attributes (string logbook,
string attributes 
)
+
+ +

validate attributes

+
Returns
0 if all required attributes are present and enumerated items are correct. non-zero if a violation is detected.
+
Todo:
function currently not implemented, always returns 0
+ +

Definition at line 653 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string format_url (string logbook)
+
+static
+
+ +

format the URL for display to the user

+
Parameters
+ + +
logbookname of the target logbook
+
+
+ +

Definition at line 894 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static string get_default_panel_name ()
+
+static
+
+ +

Definition at line 1670 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static dfr get_elog_df (string name,
variable category 
)
+
+static
+
+ +

get the package, logbook, or template datafolder.

+
Parameters
+ + + +
namename of logbook or template, or empty string for respective parent folder.
categoryparameter category:
    +
  • kdfRoot package root
  • +
  • kdfVolatile volatile
  • +
  • kdfPersistent persistent
  • +
  • kdfTemplates template
  • +
+
+
+
+
Returns
data folder reference
+ +

Definition at line 170 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static string get_log_path ()
+
+static
+
+ +

Definition at line 1019 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string get_panel_attributes (string windowname)
+
+static
+
+ +

get a list of attributes from the fields of the ELOG panel.

+
Parameters
+ + +
windownamewindow name of the ELOG panel if empty, use default name "PearlElogPanel"
+
+
+
Returns
list of attributes to in the format "key1=value1;key2=value2".
+ +

Definition at line 1683 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string get_panel_graphs (string windowname)
+
+static
+
+ +

get the names of the graphs selected for attachment

+
Parameters
+ + +
windownamepanel window name
+
+
+
Returns
a semicolon-separated list, or the empty string if the selection is not valid.
+ +

Definition at line 1838 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string get_panel_message (string windowname)
+
+static
+
+ +

get the message field of the ELOG panel

+
Parameters
+ + +
windownamewindow name of the ELOG panel if empty, use default name "PearlElogPanel"
+
+
+
Returns
message text
+ +

Definition at line 1792 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string get_timestamp (string sep)
+
+static
+
+ +

Definition at line 949 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable IgorBeforeNewHook (string igorApplicationNameStr)
+
+static
+
+ +

save preferences and recent values before Igor opens a new experiment.

+ +

Definition at line 127 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable IgorQuitHook (string igorApplicationNameStr)
+
+static
+
+ +

save preferences and recent values before Igor quits.

+ +

Definition at line 135 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable init_package (variable clean = defaultValue)
+
+static
+
+ +

initialize the package data folder.

+

the data folder is initialized with a default, local configuration without any logbooks. the server configuration should be set in the preferences.

+
Parameters
+ + +
cleandecides what to do if the package configuration exists.
    +
  • 0 (default) keep existing configuration.
  • +
  • 1 overwrite existing configuration.
  • +
+
+
+
+ +

Definition at line 217 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable init_volatile_vars ()
+
+static
+
+ +

initialize volatile variables.

+

create and initialize all volatile variables for the configured notebooks. values of existing variables are not changed.

+

this function must be called after new logbooks have been configured, specifically by elog_create_logbook() and load_prefs().

+ +

Definition at line 340 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string list_logbooks (variable templates = defaultValue)
+
+static
+
+ +

get a list of configured logbooks or templates.

+

this is list of data folder names under persistent:logbooks (or persistent:templates). the function does not check whether the folders contain valid data.

+
Parameters
+ + +
templatesselect whether logbooks (0, default) or templates (1) are returned.
+
+
+
Returns
semicolon-separated list of logbooks
+ +

Definition at line 618 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable load_prefs ()
+
+static
+
+ +

load persistent package data from the preferences file.

+

the preferences file is an Igor packed experiment file in a special preferences folder

+ +

Definition at line 584 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static variable move_attach_item (string logbook,
variable item,
variable distance 
)
+
+static
+
+ +

move an attachment item in the list of attachments

+ +

Definition at line 1418 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable parse_result ()
+
+static
+
+ +

parse the result file from an elog invokation.

+
Returns
the ID of the generated message, or a value <= 0 if an error occurred.
+ +

Definition at line 1065 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable pearl_elog (string logbook)
+
+ +

main function to initialize ELOG and to open an ELOG panel.

+

this function takes care of all necessary initialization, configuration, and preferences. if a panel exists, it will be moved to the front.

+
Parameters
+ + +
logbookname of the logbook if empty, the user is prompted to select or create a logbook by elog_prompt_logbook().
+
+
+ +

Definition at line 97 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string PearlElogPanel (string logbook)
+
+ +

open a new panel for submitting data to ELOG.

+

this function creates only the panel but not the necessary data folders. call init_package() and load_prefs() once before creating panels.

+
Parameters
+ + +
logbookname of the target logbook
+
+
+ +

Definition at line 1165 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string prepare_command_line (string logbook)
+
+static
+
+ +

format the ELOG command and essential address arguments.

+

the following arguments are included (from global variables) if applicable: host name, port, SSL, sub-dir, username, password the result string does not include leading or trailing space

+
Parameters
+ + +
logbookname of the target logbook
+
+
+ +

Definition at line 845 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static string prepare_graph_attachments (string graphs)
+
+static
+
+ +

prepare screenshots of graph windows for attachments

+

prepares the attachment files from Igor graph windows and returns the arguments to the elog command to attach the files. the result string does not include leading or trailing space

+
Parameters
+ + +
graphsnames of graph windows to be added as attachments, semicolon separated
+
+
+ +

Definition at line 930 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable save_prefs ()
+
+static
+
+ +

save persistent package data to the preferences file.

+

saves everything under the persistent folder of the package.

+ +

Definition at line 564 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static string set_panel_attributes (string windowname,
string attributes,
variable clear = defaultValue 
)
+
+static
+
+ +

set the fields of the ELOG panel

+
Parameters
+ + + + +
windownamewindow name of the ELOG panel if empty, use default name "PearlElogPanel"
attributeslist of attributes to set (format "key1=value1;key2=value2")
clearwhat to do if a key is missing in attributes?
    +
  • 0 (default) leave the field unchanged
  • +
  • 1 clear the field
  • +
+
+
+
+ +

Definition at line 1730 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string set_panel_graphs (string windowname,
string graphs 
)
+
+static
+
+ +

update selection of graphs for attachment

+
Parameters
+ + + +
windownamepanel window name. looks for default panel if empty.
graphssemicolon-separated list of names of graph windows to select for attachment.
+
+
+ +

Definition at line 1878 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string set_panel_message (string windowname,
string message 
)
+
+static
+
+ +

set the message field of the ELOG panel

+
Parameters
+ + + +
windownamewindow name of the ELOG panel if empty, use default name "PearlElogPanel"
messagemessage text that can be passed to the Notebook operation.
+
+
+
Returns
original message (unchanged)
+ +

Definition at line 1818 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable update_attach_items (string logbook)
+
+static
+
+ +

update the list of attachments

+ +

Definition at line 1357 of file pearl-elog.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string elog_parse_id = "ID=%u"
+
+static
+
+ +

Definition at line 1058 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string elog_success_msg = "Message successfully transmitted"
+
+static
+
+ +

Definition at line 1057 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kAttachColName = 2
+
+static
+
+ +

Definition at line 1354 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kAttachColSel = 0
+
+static
+
+ +

Definition at line 1352 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kAttachColTitle = 1
+
+static
+
+ +

Definition at line 1353 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kdfPersistent = 2
+
+static
+
+ +

Definition at line 155 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kdfRoot = 0
+
+static
+
+ +

Definition at line 153 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kdfTemplates = 3
+
+static
+
+ +

Definition at line 156 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const variable kdfVolatile = 1
+
+static
+
+ +

Definition at line 154 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_name = "pearl_elog"
+
+static
+
+ +

Definition at line 85 of file pearl-elog.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_path = "root:packages:pearl_elog:"
+
+static
+
+ +

Definition at line 86 of file pearl-elog.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-elog_8ipf.js b/doc/html/pearl-elog_8ipf.js new file mode 100644 index 0000000..1546be3 --- /dev/null +++ b/doc/html/pearl-elog_8ipf.js @@ -0,0 +1,64 @@ +var pearl_elog_8ipf = +[ + [ "AfterFileOpenHook", "pearl-elog_8ipf.html#a3f524f5190341d2accc8cb8c3ed2ceb5", null ], + [ "bp_attach", "pearl-elog_8ipf.html#acbba78d869a543edf7c2b80d7a8d2344", null ], + [ "bp_attach_allnone", "pearl-elog_8ipf.html#a4040736819edadf4b26982bcfdb9c7b9", null ], + [ "bp_attach_top", "pearl-elog_8ipf.html#a91b5f51982d23a36d1760b8874b5736a", null ], + [ "bp_attach_updown", "pearl-elog_8ipf.html#aa1dfae6d78a367d50ee8fc1ffe9cb69b", null ], + [ "bp_clear", "pearl-elog_8ipf.html#ab39637298c93b7aefd67febf3a4e7672", null ], + [ "bp_login", "pearl-elog_8ipf.html#a14f8376a0485aa654ccf3d2f30ab4d01", null ], + [ "bp_logout", "pearl-elog_8ipf.html#ad4472ea917691c41ad0b4ea6f36010a5", null ], + [ "bp_save_graphs", "pearl-elog_8ipf.html#a8251cea45c8d1f1993a4051a6d0760c4", null ], + [ "bp_submit", "pearl-elog_8ipf.html#adeff6678e57313cb218824f06d32b5ec", null ], + [ "cleanup_temp_files", "pearl-elog_8ipf.html#ad7640d06f004ecd4a8980ea29d24dcbe", null ], + [ "create_cmd_file", "pearl-elog_8ipf.html#ac8b61eefed231018cc36d47e95bd8c22", null ], + [ "create_graph_file", "pearl-elog_8ipf.html#a2417d079483f773f8231c5f2caba6cf0", null ], + [ "create_message_file", "pearl-elog_8ipf.html#af652f6f257be1ee749fe788d1b03f75f", null ], + [ "elog_add_attachment", "pearl-elog_8ipf.html#ac2f76abed8cfaa7ac02a46c0b89004f0", null ], + [ "elog_config", "pearl-elog_8ipf.html#a424460442afd5f6f853e68cd665ed785", null ], + [ "elog_create_entry", "pearl-elog_8ipf.html#a05301d497e4796e5fb5adde3728ba971", null ], + [ "elog_create_logbook", "pearl-elog_8ipf.html#ab6d97edbf33e8ec039b34ff756e7ab93", null ], + [ "elog_init_pearl_templates", "pearl-elog_8ipf.html#aaca820a0149ce6a0e843ca72b9c9e7ab", null ], + [ "elog_login", "pearl-elog_8ipf.html#a3eac4012891c2813e401aee2c1134763", null ], + [ "elog_logout", "pearl-elog_8ipf.html#a96e4cbbdb0fd8c58d87b502dc1883664", null ], + [ "elog_panel_hook", "pearl-elog_8ipf.html#af8b1ea711208bcc2cd1647abe04131dc", null ], + [ "elog_prompt_logbook", "pearl-elog_8ipf.html#acedf0c8ae34e9ebadd6fa0d9d1353aa4", null ], + [ "elog_prompt_login", "pearl-elog_8ipf.html#afbace5ffc3167b42b09657ce6cc854ca", null ], + [ "elog_validate_attributes", "pearl-elog_8ipf.html#ab2558ef5cd5e5dfba410bd58ed258b64", null ], + [ "format_url", "pearl-elog_8ipf.html#a3cc9074c84d684d207dfdf2045755df4", null ], + [ "get_default_panel_name", "pearl-elog_8ipf.html#a1376b5c9e6b1180a09961bc3296849ae", null ], + [ "get_elog_df", "pearl-elog_8ipf.html#ac45196cb9ce8b43b76c9daf67689c49a", null ], + [ "get_log_path", "pearl-elog_8ipf.html#ad1a72c63f269b2e22b21a72d1ef3b279", null ], + [ "get_panel_attributes", "pearl-elog_8ipf.html#a66e1200515eff8cd5c961572eccd7220", null ], + [ "get_panel_graphs", "pearl-elog_8ipf.html#ace94356f691cbe343761aabd67ced23c", null ], + [ "get_panel_message", "pearl-elog_8ipf.html#a7ce92b03b6a786129959d44bf1112efa", null ], + [ "get_timestamp", "pearl-elog_8ipf.html#a6b2d6cf641c61120332ac1983b2f3846", null ], + [ "IgorBeforeNewHook", "pearl-elog_8ipf.html#ae824bbf81f8b7d16b36b53e3f3d85f69", null ], + [ "IgorQuitHook", "pearl-elog_8ipf.html#a6fcae5eafc97bca9a637bd7800b13e25", null ], + [ "init_package", "pearl-elog_8ipf.html#a7a4572f4f861f7eb46c932508d1164f9", null ], + [ "init_volatile_vars", "pearl-elog_8ipf.html#a85cf9d39ea917860b463b1b4111705f2", null ], + [ "list_logbooks", "pearl-elog_8ipf.html#a356bebea8eb41c9ac3ea2148af22707f", null ], + [ "load_prefs", "pearl-elog_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3", null ], + [ "move_attach_item", "pearl-elog_8ipf.html#a7990f2948d48aefe990271d1961df833", null ], + [ "parse_result", "pearl-elog_8ipf.html#a5306514bf7d1a582aec146256ae45a12", null ], + [ "pearl_elog", "pearl-elog_8ipf.html#a4088a48a8428629f120c08a419af62d6", null ], + [ "PearlElogPanel", "pearl-elog_8ipf.html#a6da33f1bb2639cb912e9b25af25bf663", null ], + [ "prepare_command_line", "pearl-elog_8ipf.html#abd15431defaec6d770cc8cab2a40e6b0", null ], + [ "prepare_graph_attachments", "pearl-elog_8ipf.html#a4986de01085dc5481500240ef7667419", null ], + [ "save_prefs", "pearl-elog_8ipf.html#ac729557a307bddd2f2ad298199976c01", null ], + [ "set_panel_attributes", "pearl-elog_8ipf.html#a39a1f418c8a2f9a5e4ab976827d8efca", null ], + [ "set_panel_graphs", "pearl-elog_8ipf.html#a6eca5f4fab999984df32b50dd669c0b1", null ], + [ "set_panel_message", "pearl-elog_8ipf.html#aa7a3988440bb6d73573b50a4698a0e75", null ], + [ "update_attach_items", "pearl-elog_8ipf.html#a9c1cfd320e88e84dcf4f84bbcf3f46a5", null ], + [ "elog_parse_id", "pearl-elog_8ipf.html#a6a9923c6465c91b1f9d1d97b090f424b", null ], + [ "elog_success_msg", "pearl-elog_8ipf.html#a63aa38b624b66fe502505040c25bc0c3", null ], + [ "kAttachColName", "pearl-elog_8ipf.html#addbdec64930e9c1e417b16b25df8c723", null ], + [ "kAttachColSel", "pearl-elog_8ipf.html#aae61ff4d4a4d83dfc55af45d9ed1cbc3", null ], + [ "kAttachColTitle", "pearl-elog_8ipf.html#a5afeb893f92034532341ae51471dc2d2", null ], + [ "kdfPersistent", "pearl-elog_8ipf.html#a3498e65d04de046481170b49d4e3d0d6", null ], + [ "kdfRoot", "pearl-elog_8ipf.html#af34e46263aa50843f98f755988f9ab5c", null ], + [ "kdfTemplates", "pearl-elog_8ipf.html#a28eb44739e7d5c7f9899a69afa231b8e", null ], + [ "kdfVolatile", "pearl-elog_8ipf.html#a915905f2e57d0d9a25c75f39fcce485f", null ], + [ "package_name", "pearl-elog_8ipf.html#aca457d1f4414d20a911254b1de13ebbb", null ], + [ "package_path", "pearl-elog_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-elog_8ipf_source.html b/doc/html/pearl-elog_8ipf_source.html new file mode 100644 index 0000000..832eeff --- /dev/null +++ b/doc/html/pearl-elog_8ipf_source.html @@ -0,0 +1,187 @@ + + + + + + +PEARL Procedures: pearl-elog.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-elog.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.40
3 #pragma IgorVersion = 6.2
4 #pragma ModuleName = PearlElog
5 
6 // author: matthias.muntwiler@psi.ch
7 // Copyright (c) 2013-16 Paul Scherrer Institut
8 
9 // Licensed under the Apache License, Version 2.0 (the "License");
10 // you may not use this file except in compliance with the License.
11 // You may obtain a copy of the License at
12 // http://www.apache.org/licenses/LICENSE-2.0
13 
79 
84 
85 static const string package_name = "pearl_elog";
86 static const string package_path = "root:packages:pearl_elog:";
87 
97 variable pearl_elog(string logbook){
98  string logbook
99 
100  if (init_package() == 0)
101  load_prefs()
102  string templates = list_logbooks(templates=1)
103  if (ItemsInList(templates) < 1)
105  endif
106  endif
107 
108  if (strlen(logbook) == 0)
109  logbook = elog_prompt_logbook()
110  endif
111 
112  string win_name = logbook + "ElogPanel"
113  if (strlen(logbook) > 0)
114  if (strlen(WinList(win_name, ";", "")) > 0)
115  DoWindow /F $win_name
116  else
117  win_name = PearlElogPanel(logbook)
118  STRUCT WMWinHookStruct s
119  s.eventCode = 0
120  s.winName = win_name
121  elog_panel_hook(s)
122  endif
123  endif
124 };
125 
127 static variable IgorBeforeNewHook(string igorApplicationNameStr){
128  string igorApplicationNameStr
129  save_prefs()
131  return 0
132 };
133 
135 static variable IgorQuitHook(string igorApplicationNameStr){
136  string igorApplicationNameStr
137  save_prefs()
139  return 0
140 };
141 
143 static variable AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind){
144  Variable refNum,kind
145  String file,pathName,type,creator
146  if( (kind >= 1) && (kind <= 2))
147  init_package(clean=1)
148  load_prefs()
149  endif
150  return 0
151 };
152 
153 static const variable kdfRoot = 0;
154 static const variable kdfVolatile = 1;
155 static const variable kdfPersistent = 2;
156 static const variable kdfTemplates = 3;
157 
170 static dfr get_elog_df(string name, variable category){
171  string name
172  variable category
173 
174  dfref df_package = $package_path
175  dfref df_persistent = df_package:persistent
176  dfref df_volatile = df_package:volatile
177 
178  switch(category)
179  case kdfRoot:
180  dfref df_parent = df_package
181  break
182  case kdfPersistent:
183  dfref df_parent = df_persistent
184  break
185  case kdfTemplates:
186  dfref df_parent = df_persistent:templates
187  break
188  case kdfVolatile:
189  dfref df_parent = df_volatile
190  break
191  default:
192  Abort "get_elog_df: undefined data folder category."
193  endswitch
194 
195  if ((strlen(name) > 0) && (category >= 1))
196  if (category == kdfTemplates)
197  dfref df_logbooks = df_parent
198  else
199  dfref df_logbooks = df_parent:logbooks
200  endif
201  dfref df_logbook = df_logbooks:$name
202  return df_logbook
203  else
204  return df_parent
205  endif
206 };
207 
217 static variable init_package(variable clean = defaultValue){
218  variable clean
219 
220  if (ParamIsDefault(clean))
221  clean = 0
222  endif
223 
224  dfref savedf = getdatafolderdfr()
225  dfref df_root = get_elog_df("", kdfRoot)
226  if ((clean == 0) && (DataFolderRefStatus(df_root) == 1))
227  return 1
228  endif
229 
230  setdatafolder root:
231  newdatafolder /o/s packages
232  newdatafolder /o/s $package_name
233  dfref df_package_root = getdatafolderdfr()
234  newdatafolder /o/s volatile
235  dfref df_volatile = getdatafolderdfr()
236  newdatafolder /o logbooks
237  setdatafolder df_package_root
238  newdatafolder /o/s persistent
239  dfref df_persistent = getdatafolderdfr()
240  newdatafolder /o logbooks
241  newdatafolder /o templates
242 
243  // common configuration
244  setdatafolder df_persistent
245  string /g elog_path = "c:\\program files (x86)\\ELOG\\elog.exe"
246  string /g hostname = "localhost"
247  variable /g port = 0// 0 = unspecified (default)
248  variable /g ssl = 0// 0 = plain text (incl. passwords), 1 = secure connection
249  string /g subdir = ""
250  variable /g loglevel = 3
251 
252  setdatafolder savedf
253  return 0
254 };
255 
263  dfref savedf = getdatafolderdfr()
264 
265  dfref df_root = get_elog_df("", kdfRoot)
266  dfref df_persistent = get_elog_df("", kdfPersistent)
267  dfref df_templates = get_elog_df("", kdfTemplates)
268 
269  // Experiments template
270  setdatafolder df_templates
271  newdatafolder /o/s Experiments
272 
273  // attributes (persistent)
274  // available attributes
275  string /g attributes = "author;project;sample;source;task;technique;file;valid;"
276  // controls corresponding to attributes
277  // prefix determines the control type: sv_ = setvariable (string), pm_ = popup menu, cb = check box
278  string /g controls = "sv_author;sv_project;sv_sample;pm_source;pm_task;pm_technique;sv_file;cb_valid;"
279  // attributes with fixed options, value item declares the options string
280  string /g options = "source=sources;task=tasks;technique=techniques"
281  // attributes which must be defined
282  string /g required_attributes = "author;project;sample;source;task;technique;valid"
283 
284  // option lists
285  string /g sources = "Manual Entry;PShell;Scienta Data;SScan Data;Prosilica Data;OTF Data;Beamline Status;LEED Data;QMS Data;Matrix Data;Igor Pro;Other"
286  string /g tasks = "Measurement;Optimization;Analysis;Sample Preparation;Sample Storage;Comment;Development;Maintenance;Test;Other"
287  string /g techniques = "XPS;UPS;XPD;XAS;XMCD;PhD;ARUPS;STM;STS;LEED;AES;QMS;MBE;Sputter/Anneal;Test;Other"
288 
289  // Calculations template
290  setdatafolder df_templates
291  newdatafolder /o/s Calculations
292 
293  // attributes (persistent)
294  // available attributes
295  string /g attributes = "author;project;sample;program;revision;machine;job;experiment;source path;result path;valid"
296  // controls corresponding to attributes
297  // prefix determines the control type: sv_ = setvariable (string), pm_ = popup menu, cb = check box
298  string /g controls = "sv_author;sv_project;sv_sample;pm_program;sv_revision;pm_machine;sv_job;sv_experiment;sv_sourcepath;sv_resultpath;cb_valid"
299  // attributes with fixed options, value item declares the options string
300  string /g options = "program=programs;machine=machines"
301  // attributes which must be defined
302  string /g required_attributes = "author;project;sample"
303 
304  // option lists
305  string /g programs = "PMSCO;EDAC;MSC;SSC;MUFPOT;DMSUP;Other"
306  string /g machines = "PC;VM;Ra;Merlin;llcx;Other"
307 
308  // System template
309  setdatafolder df_templates
310  newdatafolder /o/s System
311 
312  // attributes (persistent)
313  // available attributes
314  string /g attributes = "author;type;system;source;file"
315  // controls corresponding to attributes
316  // prefix determines the control type: sv_ = setvariable (string), pm_ = popup menu, cb = check box
317  string /g controls = "sv_author;pm_type;pm_system;pm_source;sv_file"
318  // attributes with fixed options, value item declares the options string
319  string /g options = "type=types;system=systems;source=sources"
320  // attributes which must be defined
321  string /g required_attributes = "author;type;system"
322 
323  // option lists
324  string /g types = "Installation;Repair;Maintenance;Test;Commissioning;Bakeout;Incident;Cool-down;Warm-up;Storage;Other"
325  string /g systems = "Vacuum;Control System;BL;XA;XP;SA;SP;T;LL;Monochromator;Carving;Scienta;STM;PC-Scienta;PC-Matrix;PC-Console;PC-Console-Win;PC-XP;EPS;LAC;Desiccator"
326  string /g sources = "Manual Entry;PShell;Scienta Data;SScan Data;Prosilica Data;OTF Data;Beamline Status;LEED Data;QMS Data;Matrix Data;Igor Pro;Other"
327 
328  setdatafolder savedf
329  return 0
330 };
331 
340 static variable init_volatile_vars(){
341  dfref savedf = GetDataFolderDFR()
342 
343  dfref df_volatile_root = get_elog_df("", kdfVolatile)
344  dfref df_volatile_parent = df_volatile_root:logbooks
345 
346  string logbooks = list_logbooks()
347  string logbook
348  variable nlb = ItemsInList(logbooks)
349  variable ilb
350 
351  SetDataFolder df_volatile_root
352  if (exists("temp_graph_files") != 2)
353  string /g temp_graph_files = ""
354  endif
355 
356  for (ilb = 0; ilb < nlb; ilb += 1)
357  logbook = StringFromList(ilb, logbooks)
358 
359  SetDataFolder df_volatile_parent
360  if (DataFolderExists(logbook))
361  SetDataFolder $logbook
362  else
363  NewDataFolder /o/s $logbook
364  endif
365 
366  if (exists("username") != 2)
367  string /g username = ""
368  endif
369  if (exists("password") != 2)
370  string /g password = ""
371  endif
372  if (exists("msg_id") != 2)
373  variable /g msg_id = 0
374  endif
375  if (exists("att_list") != 1)
376  make /n=(0,3) /t /o attach_list
377  make /n=(0,3) /i /o attach_sel
378  endif
379  if (exists("url") != 2)
380  string /g url = ""
381  endif
382  endfor
383 
384  SetDataFolder savedf
385  return 0
386 };
387 
401 
414 variable elog_create_logbook(string name, string template = defaultValue){
415  string name
416  string template
417 
418  if (ParamIsDefault(template))
419  template = ""
420  endif
421 
422  dfref savedf = getdatafolderdfr()
423  dfref df_root = get_elog_df("", kdfRoot)
424  dfref df_persistent_root = get_elog_df("", kdfPersistent)
425  dfref df_persistent_parent = df_persistent_root:logbooks
426  dfref df_volatile_root = get_elog_df("", kdfVolatile)
427  dfref df_volatile_parent = df_volatile_root:logbooks
428 
429  setdatafolder df_persistent_parent
430  if (CheckName(name, 11) != 0)
431  setdatafolder savedf
432  Abort "invalid logbook name"
433  return -1
434  endif
435 
436  if (strlen(template) > 0)
437  dfref df_template = get_elog_df(template, kdfTemplates)
438  dfref df_existing = get_elog_df(name, kdfPersistent)
439  if (DataFolderRefStatus(df_existing))
440  KillDataFolder /Z df_existing
441  endif
442  DuplicateDataFolder df_template, df_persistent_parent:$name
443  else
444  NewDataFolder /o/s df_persistent_parent:$name
445 
446  // ELOG logbook name
447  string /g logbook = name
448  // attributes (persistent)
449  // available attributes
450  string /g attributes = ""
451  // controls corresponding to attributes
452  // prefix determines the control type: sv_ = setvariable (string), pm_ = popup menu, cb = check box
453  string /g controls = ""
454  // attributes with fixed options, value item declares the options string
455  string /g options = ""
456  // attributes which must be defined
457  string /g required_attributes = ""
458  endif
459 
460  // usage data (persistent)
461  setdatafolder get_elog_df(name, kdfPersistent)
462  string /g recent = ""
463  string /g recent_message = ""
464 
466 
467  setdatafolder savedf
468  return 0
469 };
470 
473 variable elog_config(string elog_path = defaultValue, string hostname = defaultValue, variable port = defaultValue, string subdir = defaultValue){
474  string elog_path
475  string hostname
476  variable port
477  string subdir
478 
479  dfref df = get_elog_df("", kdfPersistent)
480 
481  if (!ParamIsDefault(elog_path))
482  svar /sdfr=df g_elog_path = elog_path
483  g_elog_path = elog_path
484  endif
485  if (!ParamIsDefault(hostname))
486  svar /sdfr=df g_hostname = hostname
487  g_hostname = hostname
488  endif
489  if (!ParamIsDefault(port))
490  nvar /sdfr=df g_port = port
491  g_port = port
492  endif
493  if (!ParamIsDefault(subdir))
494  svar /sdfr=df g_subdir = subdir
495  g_subdir = subdir
496  endif
497 };
498 
513 variable elog_login(string logbook, string username, string password){
514  string logbook
515  string username
516  string password
517 
518  dfref df = get_elog_df(logbook, kdfVolatile)
519  svar /sdfr=df g_username=username
520  svar /sdfr=df g_password=password
521  g_username = username
522  g_password = password
523 };
524 
533 variable elog_logout(string logbook){
534  string logbook
535 
536  dfref df = get_elog_df(logbook, kdfVolatile)
537  if (strlen(logbook) > 0)
538  svar /z /sdfr=df g_username=username
539  svar /z /sdfr=df g_password=password
540  if (svar_exists(g_username))
541  g_username = ""
542  endif
543  if (svar_exists(g_password))
544  g_password = ""
545  endif
546  else
547  dfref df2 = df:logbooks
548  variable nlb = CountObjectsDFR(df2, 4)
549  variable ilb
550  string slb
551  for (ilb = 0; ilb < nlb; ilb += 1)
552  slb = GetIndexedObjNameDFR(df2, 4, ilb)
553  if (strlen(slb) > 0)
554  elog_logout(slb)
555  endif
556  endfor
557  endif
558 };
559 
564 static variable save_prefs(){
565  dfref saveDF = GetDataFolderDFR()
566 
567  dfref df = get_elog_df("", kdfPersistent)
568  if (DataFolderRefStatus(df) == 1)
569  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
570  fullPath += package_name
571  NewPath/O/C/Q tempPackagePrefsPath, fullPath
572  fullPath += ":preferences.pxp"
573  SetDataFolder df
574  SaveData /O /Q /R fullPath
575  KillPath/Z tempPackagePrefsPath
576  endif
577 
578  SetDataFolder saveDF
579 };
580 
584 static variable load_prefs(){
585  dfref saveDF = GetDataFolderDFR()
586 
587  variable result = -1
588  init_package()
589  setdatafolder get_elog_df("", kdfPersistent)
590 
591  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
592  fullPath += package_name
593 
594  GetFileFolderInfo /Q /Z fullPath
595  if (V_Flag == 0)// Disk directory exists?
596  fullPath += ":preferences.pxp"
597  GetFileFolderInfo /Q /Z fullPath
598  if (V_Flag == 0)// Preference file exist?
599  LoadData /O /R /Q fullPath
601  result = 0
602  endif
603  endif
604 
605  SetDataFolder saveDF
606  return result
607 };
608 
618 static string list_logbooks(variable templates = defaultValue){
619  variable templates
620 
621  if (ParamIsDefault(templates))
622  templates = 0
623  endif
624 
625  dfref df_persistent = get_elog_df("", kdfPersistent)
626  if (templates)
627  dfref df_logbooks = df_persistent:templates
628  else
629  dfref df_logbooks = df_persistent:logbooks
630  endif
631  string logbooks = ""
632 
633  variable nlb = CountObjectsDFR(df_logbooks, 4)
634  variable ilb
635  string slb
636  for (ilb = 0; ilb < nlb; ilb += 1)
637  slb = GetIndexedObjNameDFR(df_logbooks, 4, ilb)
638  if (strlen(slb) > 0)
639  logbooks = AddListItem(slb, logbooks)
640  endif
641  endfor
642 
643  return SortList(logbooks, ";", 16)
644 };
645 
653 variable elog_validate_attributes(string logbook, string attributes){
654 
655  string logbook// name of the logbook (as in igor folder name)
656  string attributes// key=value list of attributes, semicolon separated
657 
658  variable result = 0
659  return result
660 };
661 
685 variable elog_create_entry(string logbook, string attributes, string message, variable encoding = defaultValue, string graphs = defaultValue, variable replyto = defaultValue){
686  string logbook
687  string attributes
688  string message
689  variable encoding
690  string graphs
691  variable replyto
692 
693  if (ParamIsDefault(encoding))
694  encoding = 1
695  endif
696  if (ParamIsDefault(graphs))
697  graphs = ""
698  endif
699  if (ParamIsDefault(replyto))
700  replyto = 0
701  endif
702 
703  dfref savedf = getdatafolderdfr()
704  dfref df_general = get_elog_df("", kdfPersistent)
705  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
706 
707  variable result = 0
708  nvar /sdfr=df_volatile msg_id
709  nvar /sdfr=df_general loglevel
710 
711  if (elog_validate_attributes(logbook,attributes) != 0)
712  if (loglevel >= 2)
713  print "ELOG: failed to validate attributes."
714  endif
715  result = -3
716  endif
717 
718  string cmd = prepare_command_line(logbook)
719  if (strlen(cmd) == 0)
720  if (loglevel >= 2)
721  print "ELOG: failed to prepare command line."
722  endif
723  result = -2
724  endif
725 
726  if (replyto >= 1)
727  cmd += " -r " + num2str(replyto)
728  endif
729  cmd += " -n " + num2str(encoding)
730 
731  variable nattr = ItemsInList(attributes, ";")
732  variable iattr
733  string sattr
734  for (iattr = 0; (iattr < nattr) && (result == 0); iattr += 1)
735  sattr = StringFromList(iattr, attributes, ";")
736  if (strlen(StringFromList(1, sattr, "=")) > 0)
737  sattr = ReplaceString("%", sattr, "")
738  cmd += " -a \"" + sattr + "\""
739  endif
740  endfor
741 
742  if (result == 0)
743  string cmd_graphs = prepare_graph_attachments(graphs)
744  cmd += " " + cmd_graphs
745  endif
746 
747  if ((result == 0) && (strlen(message) > 0))
748  string messagefile = create_message_file(message)
749  if (strlen(messagefile) > 0)
750  cmd += " -m \"" + messagefile + "\""
751  cmd += " > \"" + get_log_path() + "\""
752  if (loglevel >= 5)
753  print cmd
754  endif
755  string cmd_file_path = create_cmd_file(cmd)
756  ExecuteScriptText cmd_file_path
757  variable id = parse_result()
758  if (id > 0)
759  msg_id = id
760  if (loglevel >= 4)
761  print "ELOG: sent message " + num2str(id)
762  endif
763  else
764  if (loglevel >= 2)
765  print "ELOG: sending message failed."
766  endif
767  result = -4
768  endif
769  else
770  if (loglevel >= 2)
771  print "ELOG: failed to create temporary message file."
772  endif
773  result = -1
774  endif
775  endif
776 
777  setdatafolder savedf
778  return result
779 };
780 
788 variable elog_add_attachment(string logbook, variable id, string graphs){
789  string logbook
790  variable id// existing entry ID
791  string graphs// names of graph windows to be added as attachments, semicolon separated
792 
793  dfref savedf = getdatafolderdfr()
794  dfref df_general = get_elog_df("", kdfPersistent)
795  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
796 
797  variable result = 0
798  nvar /sdfr=df_volatile msg_id
799  nvar /sdfr=df_general loglevel
800 
801  string cmd = prepare_command_line(logbook)
802  if (strlen(cmd) == 0)
803  result = -2// error: invalid/missing command line
804  endif
805 
806  cmd += " -e " + num2str(id)
807 
808  if (result == 0)
809  string cmd_graphs = prepare_graph_attachments(graphs)
810  if (strlen(cmd_graphs) == 0)
811  result = -3// error: invalid/missing graphs
812  endif
813  endif
814 
815  if (result == 0)
816  cmd += " " + cmd_graphs
817  cmd += " > \"" + get_log_path() + "\""
818  string cmd_file_path = create_cmd_file(cmd)
819  ExecuteScriptText cmd_file_path
820  id = parse_result()
821  if (id > 0)
822  msg_id = id
823  if (loglevel >= 4)
824  print "ELOG: attached graphs to message " + num2str(id)
825  endif
826  else
827  if (loglevel >= 2)
828  print "ELOG: failed to attach graphs."
829  endif
830  result = -4// error: elog returned error
831  endif
832  endif
833 
834  setdatafolder savedf
835  return result
836 };
837 
845 static string prepare_command_line(string logbook){
846  string logbook
847 
848  dfref df_general = get_elog_df("", kdfPersistent)
849  dfref df_persistent = get_elog_df(logbook, kdfPersistent)
850  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
851 
852  svar /sdfr=df_general elog_path
853  svar /sdfr=df_general hostname
854  nvar /sdfr=df_general port
855  nvar /sdfr=df_general ssl
856  svar /sdfr=df_general subdir
857  nvar /sdfr=df_general loglevel
858  svar /sdfr=df_volatile username
859  svar /sdfr=df_volatile password
860 
861  string cmd
862  cmd = "\"" + elog_path + "\""
863  if (loglevel >= 5)
864  cmd += " -v"
865  endif
866  cmd += " -h " + hostname
867  if ((nvar_exists(port)) && (port > 0))
868  cmd += " -p " + num2str(port)
869  endif
870  if ((svar_exists(subdir)) && (strlen(subdir) > 0))
871  cmd += " -d " + subdir
872  endif
873  cmd += " -l \"" + logbook + "\""
874  if ((nvar_exists(ssl)) && (ssl != 0))
875  cmd += " -s"
876  endif
877  //cmd += " -w " + password
878  if (svar_exists(username) && svar_exists(password) && (strlen(username) > 0) && (strlen(password) > 0))
879  cmd += " -u " + username + " " + password
880  endif
881 
882  if (loglevel >= 5)
883  print cmd
884  endif
885 
886  return cmd
887 };
888 
894 static string format_url(string logbook){
895  string logbook
896 
897  dfref df_general = get_elog_df("", kdfPersistent)
898 
899  svar /sdfr=df_general hostname
900  nvar /sdfr=df_general port
901  nvar /sdfr=df_general ssl
902  svar /sdfr=df_general subdir
903 
904  string cmd = ""
905  if ((nvar_exists(ssl)) && (ssl != 0))
906  cmd += "https://"
907  else
908  cmd += "http://"
909  endif
910  cmd += hostname
911  if ((nvar_exists(port)) && (port > 0))
912  cmd += ":" + num2str(port)
913  endif
914  if ((svar_exists(subdir)) && (strlen(subdir) > 0))
915  cmd += "/" + subdir
916  endif
917  cmd += "/" + logbook
918 
919  return cmd
920 };
921 
930 static string prepare_graph_attachments(string graphs){
931  string graphs// names of graph windows to be added as attachments, semicolon separated
932 
933  string cmd = ""
934  variable ngraphs = ItemsInList(graphs, ";")
935  variable igraph
936  string sgraph
937  string graph_path
938  for (igraph = 0; igraph < ngraphs; igraph += 1)
939  sgraph = StringFromList(igraph, graphs, ";")
940  graph_path = create_graph_file(sgraph, igraph)
941  if (strlen(graph_path) > 0)
942  cmd += " -f \"" + graph_path + "\""
943  endif
944  endfor
945 
946  return cmd
947 };
948 
949 static string get_timestamp(string sep){
950  string sep
951  Variable now = DateTime
952  string dat = ReplaceString("-", Secs2Date(DateTime, -2), "")
953  string tim = ReplaceString(":", Secs2Time(DateTime, 3), "")
954  return dat + sep + tim
955 };
956 
957 static string create_message_file(string message){
958  string message
959 
960  message = ReplaceString("%", message, "")
961  string path = SpecialDirPath("Temporary", 0, 1, 0)
962  variable len = strlen(path)
963  if (numtype(len) == 0)
964  path += "elog_temp_message.txt"
965  variable f1
966  Open f1 as path
967  fprintf f1, message
968  Close f1
969  else
970  path = ""
971  endif
972 
973  return path
974 };
975 
976 static string create_graph_file(string graphname, variable fileindex){
977  string graphname
978  variable fileindex
979 
980  dfref df_volatile_root = get_elog_df("", kdfVolatile)
981  svar /sdfr=df_volatile_root temp_graph_files
982 
983  string path = SpecialDirPath("Temporary", 0, 1, 0)
984  string ts = get_timestamp("_")
985  variable len = strlen(path)
986  if (numtype(len) == 0)
987  path += "elog_" + ts + "_" + num2str(fileindex) + ".png"
988  SavePICT /B=72 /E=-5 /M /O /W=(0,0,8,6) /WIN=$graphname /Z as path
989  if (v_flag == 0)
990  temp_graph_files = AddListItem(path, temp_graph_files, ";", inf)
991  else
992  path = ""
993  endif
994  else
995  path = ""
996  endif
997 
998  return path
999 };
1000 
1001 static string create_cmd_file(string cmd){
1002  string cmd
1003 
1004  string path = SpecialDirPath("Temporary", 0, 1, 0)
1005  variable len = strlen(path)
1006  if (numtype(len) == 0)
1007  path += "elog_temp_cmd.bat"
1008  variable f1
1009  Open f1 as path
1010  fprintf f1, cmd
1011  Close f1
1012  else
1013  path = ""
1014  endif
1015 
1016  return path
1017 };
1018 
1019 static string get_log_path(){
1020  string path = SpecialDirPath("Temporary", 0, 1, 0)
1021  variable len = strlen(path)
1022  if (numtype(len) == 0)
1023  path += "elog.log"
1024  else
1025  path = ""
1026  endif
1027 
1028  return path
1029 };
1030 
1039 static variable cleanup_temp_files(){
1040  dfref df_volatile_root = get_elog_df("", kdfVolatile)
1041  if (DataFolderRefStatus(df_volatile_root))
1042  svar /sdfr=df_volatile_root /z temp_graph_files
1043  if (SVAR_Exists(temp_graph_files))
1044  variable nfi = ItemsInList(temp_graph_files)
1045  variable ifi
1046  string sfi
1047  for (ifi = 0; ifi < nfi; ifi += 1)
1048  sfi = StringFromList(ifi, temp_graph_files)
1049  DeleteFile /Z sfi
1050  endfor
1051  temp_graph_files = ""
1052  endif
1053  endif
1054  return 0
1055 };
1056 
1057 static const string elog_success_msg = "Message successfully transmitted";
1058 static const string elog_parse_id = "ID=%u";
1059 
1065 static variable parse_result(){
1066  dfref df_general = get_elog_df("", kdfPersistent)
1067  nvar /sdfr=df_general loglevel
1068 
1069  string path = get_log_path()
1070  string line = ""
1071  string output = ""
1072  variable success = 0
1073  variable id = -1
1074  string part1 = ""
1075  string part2 = ""
1076 
1077  variable len = strlen(path)
1078  if (numtype(len) == 0)
1079  variable f1
1080  Open /R/Z f1 as path
1081  if (v_flag == 0)
1082  do
1083  FReadLine f1, line
1084  if (strlen(line) > 0)
1085  part1 = StringFromList(0, line, ",")
1086  part2 = ReplaceString(" ", StringFromList(1, line, ","), "")
1087  success = cmpstr(part1, elog_success_msg) == 0
1088  if (success)
1089  sscanf part2, elog_parse_id, id
1090  endif
1091  else
1092  break
1093  endif
1094  output += line
1095  while(!success)
1096  Close f1
1097  endif
1098  endif
1099  if (loglevel >= 5)
1100  print output
1101  endif
1102 
1103  return id
1104 };
1105 
1109  string logbooks = list_logbooks(templates=0)
1110  logbooks = AddListItem("(new)", logbooks)
1111  string templates = list_logbooks(templates=1)
1112  templates = AddListItem("(none)", templates)
1113 
1114  string logbook = StringFromList(0, logbooks)
1115  string template = StringFromList(0, logbooks)
1116  string name = ""
1117  string username = ""
1118  string password = ""
1119 
1120  prompt logbook, "logbook", popup logbooks
1121  prompt template, "template", popup templates
1122  prompt name, "new logbook name"
1123 
1124  doprompt "select logbook", logbook, template, name
1125  if (!v_flag)
1126  if (cmpstr(logbook, "(new)") == 0)
1127  elog_create_logbook(name, template=template)
1128  logbook = name
1129  endif
1130  else
1131  logbook = ""
1132  endif
1133  return logbook
1134 };
1135 
1138 variable elog_prompt_login(string logbook){
1139  string logbook
1140 
1141  string logbooks = list_logbooks(templates=0)
1142 
1143  string username = ""
1144  string password = ""
1145 
1146  prompt logbook, "logbook", popup logbooks
1147  prompt username, "user name"
1148  prompt password, "password (blank to log out)"
1149 
1150  doprompt "log in to logbook", logbook, username, password
1151  if (!v_flag)
1152  elog_login(logbook, username, password)
1153  endif
1154 
1155  return v_flag
1156 };
1157 
1165 string PearlElogPanel(string logbook){
1166  string logbook
1167 
1168  dfref savedf = getdatafolderdfr()
1169  dfref df_general = get_elog_df("", kdfPersistent)
1170  dfref df_persistent = get_elog_df(logbook, kdfPersistent)
1171  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1172 
1173  string win_name = logbook + "ElogPanel"
1174  string win_title = "ELOG " + logbook
1175 
1176  NewPanel /K=1 /N=$win_name /W=(600,200,1200,700) as win_title
1177  win_name = s_name
1178  ModifyPanel /w=$win_name cbRGB=(52224,52224,65280)
1179 
1180  svar /sdfr=df_persistent attributes
1181  svar /sdfr=df_persistent controls
1182  svar /sdfr=df_persistent options
1183  wave /t /sdfr=df_volatile attach_list
1184  wave /sdfr=df_volatile attach_sel
1185  svar /sdfr=df_volatile url
1186 
1187  variable iattr
1188  variable nattr = ItemsInList(attributes, ";")
1189  string s_attr
1190  string s_control
1191  string s_option
1192  string persistent_path = GetDataFolder(1, df_persistent)
1193  string volatile_path = GetDataFolder(1, df_volatile)
1194  string options_path
1195  string variable_path
1196  variable ypos = 2
1197  variable height = 0
1198 
1199  for (iattr = 0; iattr < nattr; iattr += 1)
1200  s_attr = StringFromList(iattr, attributes, ";")
1201  s_control = StringFromList(iattr, controls, ";")
1202  strswitch(s_control[0,1])
1203  case "sv":
1204  SetVariable $s_control, win=$win_name, pos={0,ypos}, size={300,16}, bodyWidth=230
1205  SetVariable $s_control, win=$win_name, title=s_attr, value= _STR:""
1206  SetVariable $s_control, win=$win_name, userdata(attribute)=s_attr
1207  ypos += 18
1208  break
1209  case "pm":
1210  options_path = persistent_path + StringByKey(s_attr, options, "=", ";")
1211  PopupMenu $s_control, win=$win_name, pos={0,ypos}, size={300,21}, bodyWidth=230
1212  PopupMenu $s_control, win=$win_name, title=s_attr
1213  PopupMenu $s_control, win=$win_name, mode=1, popvalue="Test", value= #options_path
1214  PopupMenu $s_control, win=$win_name, userdata(attribute)=s_attr
1215  ypos += 23
1216  break
1217  case "cb":
1218  CheckBox $s_control, win=$win_name, pos={70,ypos}, size={300,14}
1219  CheckBox $s_control, win=$win_name, title=s_attr, value= 1
1220  CheckBox $s_control, win=$win_name, userdata(attribute)=s_attr
1221  ypos += 17
1222  break
1223  endswitch
1224  endfor
1225 
1226  TitleBox t_attach, win=$win_name, pos={308,5}, size={70,14}, title="Attachments", frame=0
1227  height = ypos - 21 - 4
1228  ListBox lb_attach, win=$win_name, pos={308,21}, size={264,height}
1229  ListBox lb_attach, win=$win_name, listWave=attach_list
1230  ListBox lb_attach, win=$win_name, mode=1, selWave=attach_sel, selRow=-1
1231  ListBox lb_attach, win=$win_name, widths={20,160,80}
1232  ListBox lb_attach, win=$win_name, help={"Choose graphs to attach to the message."}
1233 
1234  Button b_attach_top, win=$win_name, pos={420,2}, size={40,18}, title="top"
1235  Button b_attach_top, win=$win_name, fcolor=(56576,60928,47872)
1236  Button b_attach_top, win=$win_name, proc=PearlElog#bp_attach_top
1237  Button b_attach_top, win=$win_name, help={"Select top graph for attachment."}
1238  Button b_attach_all, win=$win_name, pos={460,2}, size={40,18}, title="all"
1239  Button b_attach_all, win=$win_name, fcolor=(56576,60928,47872)
1240  Button b_attach_all, win=$win_name, proc=PearlElog#bp_attach_allnone
1241  Button b_attach_all, win=$win_name, help={"Select all graphs for attachment."}
1242  Button b_attach_none, win=$win_name, pos={500,2}, size={40,18}, title="none"
1243  Button b_attach_none, win=$win_name, fcolor=(56576,60928,47872)
1244  Button b_attach_none, win=$win_name, proc=PearlElog#bp_attach_allnone
1245  Button b_attach_none, win=$win_name, help={"Deselect all attachments."}
1246  Button b_save_graphs, win=$win_name, pos={540,2}, size={40,18}, title="save"
1247  Button b_save_graphs, win=$win_name, fcolor=(56576,60928,47872)
1248  Button b_save_graphs, win=$win_name, proc=PearlElog#bp_save_graphs
1249  Button b_save_graphs, win=$win_name, help={"Save selected graphs as PNG bitmap files."}
1250  Button b_attach_up, win=$win_name, pos={576,20}, size={20,20}, title="\\W517"
1251  Button b_attach_up, win=$win_name, fcolor=(56576,60928,47872)
1252  Button b_attach_up, win=$win_name, proc=PearlElog#bp_attach_updown
1253  Button b_attach_up, win=$win_name, help={"Move selected graph up."}
1254  Button b_attach_dw, win=$win_name, pos={576,40}, size={20,20}, title="\\W523"
1255  Button b_attach_dw, win=$win_name, fcolor=(56576,60928,47872)
1256  Button b_attach_dw, win=$win_name, proc=PearlElog#bp_attach_updown
1257  Button b_attach_dw, win=$win_name, help={"Move selected graph down."}
1258 
1259  ypos += 246-160
1260  Button b_submit,win=$win_name, pos={70,ypos},size={46,20},proc=PearlElog#bp_submit,title="Submit"
1261  Button b_submit,win=$win_name, help={"Submit form data to ELOG (new entry)."}
1262  Button b_submit,win=$win_name, fcolor=(56576,60928,47872)
1263  Button b_clear,win=$win_name, pos={120,ypos},size={46,20},proc=PearlElog#bp_clear,title="Clear"
1264  Button b_clear,win=$win_name, help={"Clear the form fields"}
1265  Button b_clear,win=$win_name, fcolor=(56576,60928,47872)
1266 
1267  ypos += 272-246
1268  variable_path = volatile_path + "msg_id"
1269  SetVariable sv_id,win=$win_name, pos={51,ypos},size={119,16},bodyWidth=77
1270  SetVariable sv_id,win=$win_name, title="ID",value=$variable_path
1271  SetVariable sv_id,win=$win_name, help={"ID of last submitted message, or message to attach or reply to."}
1272 
1273  TitleBox t_host, win=$win_name, pos={170,ypos+4}, size={112.00,14.00}, frame=0
1274  TitleBox t_host, win=$win_name, variable=url
1275 
1276  ypos += 270-272
1277  Button b_attach,win=$win_name, pos={170,ypos},size={48,20},proc=PearlElog#bp_attach,title="Attach"
1278  Button b_attach,win=$win_name, help={"Attach the selected graph to an existing ELOG entry (correct ID required)."}
1279  Button b_attach,win=$win_name, fcolor=(56576,60928,47872)
1280  Button b_reply,win=$win_name, pos={220,ypos},size={48,20},proc=PearlElog#bp_submit,title="Reply"
1281  Button b_reply,win=$win_name, help={"Submit form data to ELOG as a reply to an existing message (correct ID required)."}
1282  Button b_reply,win=$win_name, fcolor=(56576,60928,47872)
1283  Button b_login,win=$win_name, pos={550,ypos},size={46,20},proc=PearlElog#bp_login,title="Login"
1284  Button b_login,win=$win_name, help={"Enter user name and password."}
1285  Button b_login,win=$win_name, fcolor=(56576,60928,47872)
1286  Button b_logout,win=$win_name, pos={550,ypos},size={46,20},proc=PearlElog#bp_logout,title="Logout"
1287  Button b_logout,win=$win_name, help={"Clear user name and password."}
1288  Button b_logout,win=$win_name, fcolor=(56576,60928,47872), disable=3
1289 
1290  SetWindow $win_name, hook(elogPanelHook)=PearlElog#elog_panel_hook
1291  SetWindow $win_name, userdata(logbook)=logbook
1292 
1293  ypos += 160-270
1294  TitleBox t_message,win=$win_name, pos={10,ypos},size={58,16},fixedSize=1,frame=0,anchor=RT,title="Message"
1295  DefineGuide UGH0={FT,ypos},UGV0={FL,70},UGH1={FB,-52},UGV1={FR,-2}
1296  NewNotebook /F=0 /N=Message /OPTS=3 /W=(115,404,345,341)/FG=(UGV0,UGH0,UGV1,UGH1) /HOST=#
1297  Notebook kwTopWin, defaultTab=20, statusWidth=0, autoSave=0
1298  Notebook kwTopWin fSize=10, fStyle=0, textRGB=(0,0,0)
1299  RenameWindow #,Message
1300  string nb_name = win_name + "#Message"
1301  SetActiveSubwindow ##
1302 
1303  // restore recently used attributes and message
1304  svar /z /sdfr=df_persistent recent
1305  if (svar_exists(recent) && (strlen(recent) > 0))
1306  set_panel_attributes(win_name, recent)
1307  endif
1308  svar /z /sdfr=df_persistent recent_message
1309  if (svar_exists(recent_message) && (strlen(recent_message) > 0))
1310  set_panel_message(win_name, recent_message)
1311  endif
1312  Notebook $nb_name selection={startOfFile,startOfFile}, findText={"",1}
1313 
1314  setdatafolder savedf
1315  return win_name
1316 };
1317 
1318 static variable elog_panel_hook(WMWinHookStruct* s){
1319  STRUCT WMWinHookStruct &s
1320 
1321  Variable hookResult = 0
1322 
1323  switch(s.eventCode)
1324  case 0:// activate
1325  string logbook = GetUserData(s.winName, "", "logbook")
1326  if (strlen(logbook) > 0)
1327  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1328  svar /sdfr=df_volatile url
1329  url = format_url(logbook)
1330  update_attach_items(logbook)
1331  endif
1332  break
1333  case 6:// resize
1334  // move bottom-aligned controls when the window is resized
1335  variable b_top = s.winRect.bottom + 4
1336  Button b_submit,pos={70,b_top}
1337  Button b_clear,pos={120,b_top}
1338  TitleBox t_host, pos={170,b_top+4}
1339  b_top += 24
1340  Button b_attach,pos={170,b_top}
1341  Button b_reply,pos={220,b_top}
1342  Button b_login, pos={550,b_top}
1343  Button b_logout, pos={550,b_top}
1344  b_top += 2
1345  SetVariable sv_id,pos={51,b_top}
1346  break
1347  endswitch
1348 
1349  return hookResult// 0 if nothing done, else 1
1350 };
1351 
1352 static const variable kAttachColSel = 0;
1353 static const variable kAttachColTitle = 1;
1354 static const variable kAttachColName = 2;
1355 
1357 static variable update_attach_items(string logbook){
1358  string logbook
1359 
1360  dfref savedf = getdatafolderdfr()
1361  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1362  wave /t /sdfr=df_volatile attach_list
1363  wave /sdfr=df_volatile attach_sel
1364 
1365  if (!waveexists(attach_list))
1366  return -1
1367  endif
1368  string names = WinList("*", ";", "WIN:1;VISIBLE:1")
1369  names = SortList(names, ";", 16)
1370 
1371  // remove closed graphs
1372  variable i
1373  variable k
1374  variable n = DimSize(attach_list, 0)
1375  string s
1376  for (i = n-1; i >= 0; i -= 1)
1377  s = attach_list[i][kAttachColName]
1378  if (WhichListItem(s, names) < 0)
1379  DeletePoints /M=0 i, 1, attach_list, attach_sel
1380  endif
1381  endfor
1382 
1383  // add new graphs
1384  n = ItemsInList(names)
1385  for (i = 0; i < n; i += 1)
1386  s = StringFromList(i, names)
1387  FindValue /text=s /txop=4 /z attach_list
1388  if (v_value < 0)
1389  k = DimSize(attach_list, 0)
1390  Redimension /n=(k+1,3) attach_list, attach_sel
1391  //InsertPoints /M=0 k, 1, attach_list, attach_sel
1392  attach_list[k][kAttachColSel] = ""
1393  attach_list[k][kAttachColTitle] = ""
1394  attach_list[k][kAttachColName] = s
1395  attach_sel[k][kAttachColSel] = 32
1396  attach_sel[k][kAttachColTitle] = 0
1397  attach_sel[k][kAttachColName] = 0
1398  endif
1399  endfor
1400 
1401  // update titles
1402  n = DimSize(attach_list, 0)
1403  for (i = n-1; i >= 0; i -= 1)
1404  s = attach_list[i][kAttachColName]
1405  getwindow /z $s, wtitle
1406  if (v_flag == 0)
1407  attach_list[i][kAttachColTitle] = s_value
1408  else
1409  attach_list[i][kAttachColTitle] = s
1410  endif
1411  endfor
1412 
1413  setdatafolder savedf
1414  return 0
1415 };
1416 
1418 static variable move_attach_item(string logbook, variable item, variable distance){
1419  string logbook
1420  variable item
1421  variable distance
1422 
1423  dfref savedf = getdatafolderdfr()
1424  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1425  wave /t /sdfr=df_volatile attach_list
1426  wave /sdfr=df_volatile attach_sel
1427  variable n = DimSize(attach_list, 0)
1428  variable dest = item + distance
1429 
1430  if ((item >= 0) && (item < n) && (dest >= 0) && (dest < n))
1431  string name = attach_list[item][kAttachColName]
1432  variable sel = attach_sel[item][kAttachColSel]
1433  DeletePoints /M=0 item, 1, attach_list, attach_sel
1434  InsertPoints /M=0 dest, 1, attach_list, attach_sel
1435  attach_list[dest][kAttachColName] = name
1436  update_attach_items(logbook)
1437  attach_sel[dest][kAttachColSel] = sel
1438  endif
1439 };
1440 
1442 static variable bp_attach_updown(WMButtonAction* ba){
1443  STRUCT WMButtonAction &ba
1444 
1445  switch( ba.eventCode )
1446  case 2:// mouse up
1447  string logbook = GetUserData(ba.win, "", "logbook")
1448  ControlInfo /w=$ba.win lb_attach
1449  variable row = v_value
1450  dfref df = $s_datafolder
1451  wave /t /sdfr=df attach_list = $s_value
1452  if (cmpstr(ba.ctrlName, "b_attach_up") == 0)
1453  // up button
1454  if (row >= 1)
1455  move_attach_item(logbook, row, -1)
1456  ListBox lb_attach, win=$ba.win, selRow=(row-1)
1457  endif
1458  else
1459  // down button
1460  if (row < DimSize(attach_list, 0) - 1)
1461  move_attach_item(logbook, row, +1)
1462  ListBox lb_attach, win=$ba.win, selRow=(row+1)
1463  endif
1464  endif
1465  break
1466  case -1:// control being killed
1467  break
1468  endswitch
1469 
1470  return 0
1471 };
1472 
1474 static variable bp_submit(WMButtonAction* ba){
1475  STRUCT WMButtonAction &ba
1476 
1477  switch( ba.eventCode )
1478  case 2:// mouse up
1479  string logbook = GetUserData(ba.win, "", "logbook")
1480  string attributes
1481  string message
1482  string graphs
1483  attributes = get_panel_attributes(ba.win)
1484  message = get_panel_message(ba.win)
1485  graphs = get_panel_graphs(ba.win)
1486 
1487  variable id
1488  if (cmpstr(ba.ctrlName, "b_reply") == 0)
1489  // Reply button
1490  ControlInfo /w=$ba.win sv_id
1491  id = v_value
1492  else
1493  // Submit button
1494  id = 0
1495  endif
1496 
1497  if ((elog_validate_attributes(logbook, attributes) == 0) && (strlen(message) > 0))
1498  variable result
1499  result = elog_create_entry(logbook, attributes, message, graphs=graphs, replyto=id)
1500  if (result == 0)
1501  dfref df = get_elog_df(logbook, kdfPersistent)
1502  svar /sdfr=df recent
1503  recent = attributes
1504  svar /sdfr=df recent_message
1505  recent_message = message
1506  else
1507  abort "Submission failed. Error code " + num2str(result) + "."
1508  endif
1509  else
1510  abort "Submission failed due to missing/invalid attribute."
1511  endif
1512  break
1513  case -1:// control being killed
1514  break
1515  endswitch
1516 
1517  return 0
1518 };
1519 
1521 static variable bp_attach_top(WMButtonAction* ba){
1522  STRUCT WMButtonAction &ba
1523 
1524  switch( ba.eventCode )
1525  case 2:// mouse up
1526  string graphs = WinName(0, 1, 1)
1527  set_panel_graphs(ba.win, graphs)
1528  break
1529  case -1:// control being killed
1530  break
1531  endswitch
1532 
1533  return 0
1534 };
1535 
1537 static variable bp_attach_allnone(WMButtonAction* ba){
1538  STRUCT WMButtonAction &ba
1539 
1540  switch( ba.eventCode )
1541  case 2:// mouse up
1542  string logbook = GetUserData(ba.win, "", "logbook")
1543  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1544  wave /sdfr=df_volatile attach_sel
1545  if (cmpstr(ba.ctrlName, "b_attach_all") == 0)
1546  attach_sel[][kAttachColSel] = attach_sel[p][kAttachColSel] | 16
1547  else
1548  attach_sel[][kAttachColSel] = attach_sel[p][kAttachColSel] & ~16
1549  endif
1550  break
1551  case -1:// control being killed
1552  break
1553  endswitch
1554 
1555  return 0
1556 };
1557 
1558 static variable bp_attach(WMButtonAction* ba){
1559  STRUCT WMButtonAction &ba
1560 
1561  switch( ba.eventCode )
1562  case 2:// mouse up
1563  string logbook = GetUserData(ba.win, "", "logbook")
1564  string graphs
1565  graphs = get_panel_graphs(ba.win)
1566 
1567  variable id
1568  ControlInfo /w=$ba.win sv_id
1569  id = v_value
1570 
1571  // TODO : is there a way around this restriction?
1572  DoAlert /T="ELOG" 1, "This operation will replace all existing attachments. Do you want to continue?"
1573 
1574  if ((id > 0) && (v_flag == 1))
1575  variable result
1576  result = elog_add_attachment(logbook, id, graphs)
1577  if (result != 0)
1578  abort "Submission failed. Error code " + num2str(result) + "."
1579  endif
1580  else
1581  abort "Submission failed due to missing/invalid attribute."
1582  endif
1583  break
1584  case -1:// control being killed
1585  break
1586  endswitch
1587 
1588  return 0
1589 };
1590 
1591 static variable bp_save_graphs(WMButtonAction* ba){
1592  STRUCT WMButtonAction &ba
1593 
1594  switch( ba.eventCode )
1595  case 2:// mouse up
1596  string logbook = GetUserData(ba.win, "", "logbook")
1597  string graphs = get_panel_graphs(ba.win)
1598  variable ngraphs = ItemsInList(graphs, ";")
1599 
1600  variable igraph
1601  string sgraph
1602  string graph_path
1603  for (igraph = 0; igraph < ngraphs; igraph += 1)
1604  sgraph = StringFromList(igraph, graphs, ";")
1605  graph_path = create_graph_file(sgraph, igraph)
1606  if (strlen(graph_path) > 0)
1607  print graph_path
1608  endif
1609  endfor
1610 
1611  break
1612  case -1:// control being killed
1613  break
1614  endswitch
1615 
1616  return 0
1617 };
1618 
1619 static variable bp_clear(WMButtonAction* ba){
1620  STRUCT WMButtonAction &ba
1621 
1622  switch( ba.eventCode )
1623  case 2:// mouse up
1624  set_panel_attributes(ba.win, "", clear=1)
1625  set_panel_message(ba.win, "")
1626  set_panel_graphs(ba.win, "")
1627  break
1628  case -1:// control being killed
1629  break
1630  endswitch
1631 
1632  return 0
1633 };
1634 
1635 static variable bp_login(WMButtonAction* ba){
1636  STRUCT WMButtonAction &ba
1637 
1638  switch( ba.eventCode )
1639  case 2:// mouse up
1640  string logbook = GetUserData(ba.win, "", "logbook")
1641  if (elog_prompt_login(logbook) == 0)
1642  Button b_login, win=$ba.win, disable=3
1643  Button b_logout, win=$ba.win, disable=0
1644  endif
1645  break
1646  case -1:// control being killed
1647  break
1648  endswitch
1649 
1650  return 0
1651 };
1652 
1653 static variable bp_logout(WMButtonAction* ba){
1654  STRUCT WMButtonAction &ba
1655 
1656  switch( ba.eventCode )
1657  case 2:// mouse up
1658  string logbook = GetUserData(ba.win, "", "logbook")
1659  elog_logout(logbook)
1660  Button b_login, win=$ba.win, disable=0
1661  Button b_logout, win=$ba.win, disable=3
1662  break
1663  case -1:// control being killed
1664  break
1665  endswitch
1666 
1667  return 0
1668 };
1669 
1670 static string get_default_panel_name(){
1671  string windowname
1672  windowname = StringFromList(0, WinList("*ElogPanel*", ";", "WIN:64"), ";")
1673  return windowname
1674 };
1675 
1683 static string get_panel_attributes(string windowname){
1684  string windowname
1685 
1686  if (strlen(windowname) == 0)
1687  windowname = get_default_panel_name()
1688  endif
1689  if (strlen(windowname) == 0)
1690  return ""
1691  endif
1692 
1693  string controls = ControlNameList(windowname, ";")
1694  string attributes = ""
1695  string control
1696  string attribute
1697  variable ico
1698  variable nco = ItemsInList(controls, ";")
1699  for (ico = 0; ico < nco; ico += 1)
1700  control = StringFromList(ico, controls, ";")
1701  attribute = GetUserData(windowname, control, "attribute")
1702  if (strlen(attribute) > 0)
1703  ControlInfo /w=$windowname $control
1704  switch(v_flag)
1705  case 2:// checkbox
1706  attributes = ReplaceNumberByKey(attribute, attributes, v_value, "=", ";")
1707  break
1708  case 3:// popupmenu
1709  case 5:// setvariable
1710  attributes = ReplaceStringByKey(attribute, attributes, s_value, "=", ";")
1711  break
1712  endswitch
1713  endif
1714  endfor
1715 
1716  return attributes
1717 };
1718 
1730 static string set_panel_attributes(string windowname, string attributes, variable clear = defaultValue){
1731  string windowname
1732  string attributes
1733  variable clear
1734 
1735  if (strlen(windowname) == 0)
1736  windowname = get_default_panel_name()
1737  endif
1738  if (strlen(windowname) == 0)
1739  return ""
1740  endif
1741  if (ParamIsDefault(clear))
1742  clear = 0
1743  endif
1744 
1745  string path
1746 
1747  string controls = ControlNameList(windowname, ";")
1748  string control
1749  string attribute
1750  string value
1751  variable numval
1752  variable ico
1753  variable nco = ItemsInList(controls, ";")
1754  for (ico = 0; ico < nco; ico += 1)
1755  control = StringFromList(ico, controls, ";")
1756  attribute = GetUserData(windowname, control, "attribute")
1757  if (strlen(attribute))
1758  value = StringByKey(attribute, attributes, "=", ";")
1759  if (strlen(value) || clear)
1760  ControlInfo /w=$windowname $control
1761  switch(v_flag)
1762  case 2:// checkbox
1763  numval = NumberByKey(attribute, attributes, "=", ";")
1764  if ((numtype(numval) != 0) && clear)
1765  numval = 0
1766  endif
1767  if (numtype(numval) == 0)
1768  CheckBox $control, value=numval, win=$windowname
1769  endif
1770  break
1771  case 3:// popupmenu
1772  PopupMenu $control, popvalue=value, win=$windowname
1773  break
1774  case 5:// setvariable
1775  SetVariable /z $control, value= _STR:value, win=$windowname
1776  break
1777  endswitch
1778  endif
1779  endif
1780  endfor
1781 
1782  return attributes
1783 };
1784 
1792 static string get_panel_message(string windowname){
1793  string windowname
1794 
1795  if (strlen(windowname) == 0)
1796  windowname = get_default_panel_name()
1797  endif
1798  if (strlen(windowname) == 0)
1799  return ""
1800  endif
1801 
1802  string nb = windowname + "#Message"
1803  notebook $nb selection={startOfFile, endOfFile}
1804  getselection notebook, $nb, 2
1805 
1806  return s_selection
1807 };
1808 
1818 static string set_panel_message(string windowname, string message){
1819  string windowname
1820  string message
1821 
1822  if (strlen(windowname) == 0)
1823  windowname = get_default_panel_name()
1824  endif
1825 
1826  string nb = windowname + "#Message"
1827  notebook $nb selection={startOfFile, endOfFile},text=message
1828 
1829  return message
1830 };
1831 
1838 static string get_panel_graphs(string windowname){
1839  string windowname// panel window name
1840 
1841  dfref savedf = getdatafolderdfr()
1842  if (strlen(windowname) == 0)
1843  windowname = get_default_panel_name()
1844  endif
1845  if (strlen(windowname) == 0)
1846  return ""
1847  endif
1848 
1849  string logbook = GetUserData(windowname, "", "logbook")
1850  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1851  wave /t /sdfr=df_volatile attach_list
1852  wave /sdfr=df_volatile attach_sel
1853  string graphs = ""
1854  string windows = ""
1855  string graphname
1856 
1857  variable n = DimSize(attach_sel, 0)
1858  variable i
1859  for (i = 0; i < n; i += 1)
1860  if (attach_sel[i][kAttachColSel] & 16)
1861  graphname = attach_list[i][kAttachColName]
1862  windows = WinList(graphname, ";", "WIN:1")
1863  if (ItemsInList(windows) == 1)
1864  graphs = AddListItem(graphname, graphs, ";", inf)
1865  endif
1866  endif
1867  endfor
1868 
1869  return graphs
1870 };
1871 
1878 static string set_panel_graphs(string windowname, string graphs){
1879  string windowname
1880  string graphs
1881 
1882  if (strlen(windowname) == 0)
1883  windowname = get_default_panel_name()
1884  endif
1885  if (strlen(windowname) == 0)
1886  return ""
1887  endif
1888 
1889  string logbook = GetUserData(windowname, "", "logbook")
1890  update_attach_items(logbook)
1891  dfref df_volatile = get_elog_df(logbook, kdfVolatile)
1892  wave /t /sdfr=df_volatile attach_list
1893  wave /sdfr=df_volatile attach_sel
1894 
1895  variable n = DimSize(attach_sel, 0)
1896  variable i
1897  string graphname
1898  for (i = 0; i < n; i += 1)
1899  graphname = attach_list[i][kAttachColName]
1900  if (WhichListItem(graphname, graphs)>= 0)
1901  attach_sel[i][kAttachColSel] = 48
1902  else
1903  attach_sel[i][kAttachColSel] = 32
1904  endif
1905  endfor
1906 };
1907 
variable elog_create_entry(string logbook, string attributes, string message, variable encoding=defaultValue, string graphs=defaultValue, variable replyto=defaultValue)
create a new entry in ELOG
Definition: pearl-elog.ipf:685
+
static variable AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind)
initialize the package and reload preferences after an experiment is loaded.
Definition: pearl-elog.ipf:143
+
variable elog_add_attachment(string logbook, variable id, string graphs)
add one or more graphs to an existing ELOG entry
Definition: pearl-elog.ipf:788
+
static const string package_path
Definition: pearl-elog.ipf:86
+
static string get_panel_graphs(string windowname)
get the names of the graphs selected for attachment
+
static variable bp_attach_updown(WMButtonAction *ba)
button procedure for the attachment up and down buttons
+
static string create_message_file(string message)
Definition: pearl-elog.ipf:957
+
static variable parse_result()
parse the result file from an elog invokation.
+
variable elog_create_logbook(string name, string template=defaultValue)
create a new logbook.
Definition: pearl-elog.ipf:414
+
static string set_panel_attributes(string windowname, string attributes, variable clear=defaultValue)
set the fields of the ELOG panel
+
static variable bp_logout(WMButtonAction *ba)
+
static string get_default_panel_name()
+
static variable elog_panel_hook(WMWinHookStruct *s)
+
variable elog_config(string elog_path=defaultValue, string hostname=defaultValue, variable port=defaultValue, string subdir=defaultValue)
set global module configuration parameters
Definition: pearl-elog.ipf:473
+
interface for writing ELOG entries with Igor graphs as attachment.
+
static variable IgorBeforeNewHook(string igorApplicationNameStr)
save preferences and recent values before Igor opens a new experiment.
Definition: pearl-elog.ipf:127
+
static string set_panel_graphs(string windowname, string graphs)
update selection of graphs for attachment
+
variable elog_init_pearl_templates()
setup PEARL template logbooks.
Definition: pearl-elog.ipf:262
+
static string create_graph_file(string graphname, variable fileindex)
Definition: pearl-elog.ipf:976
+
static const variable kAttachColName
+
static variable bp_clear(WMButtonAction *ba)
+
variable elog_login(string logbook, string username, string password)
set username and password for login to a logbook
Definition: pearl-elog.ipf:513
+
static variable bp_attach_top(WMButtonAction *ba)
select top graph window for attachment
+
static const variable kAttachColSel
+
string PearlElogPanel(string logbook)
open a new panel for submitting data to ELOG.
+
variable elog_validate_attributes(string logbook, string attributes)
validate attributes
Definition: pearl-elog.ipf:653
+
static string prepare_graph_attachments(string graphs)
prepare screenshots of graph windows for attachments
Definition: pearl-elog.ipf:930
+
static string list_logbooks(variable templates=defaultValue)
get a list of configured logbooks or templates.
Definition: pearl-elog.ipf:618
+
static variable bp_attach(WMButtonAction *ba)
+
static variable move_attach_item(string logbook, variable item, variable distance)
move an attachment item in the list of attachments
+
static dfr get_elog_df(string name, variable category)
get the package, logbook, or template datafolder.
Definition: pearl-elog.ipf:170
+
string elog_prompt_logbook()
prompt to open or create a logbook
+
static variable bp_save_graphs(WMButtonAction *ba)
+
static variable update_attach_items(string logbook)
update the list of attachments
+
static variable bp_login(WMButtonAction *ba)
+
static const variable kdfVolatile
Definition: pearl-elog.ipf:154
+
static const variable kdfTemplates
Definition: pearl-elog.ipf:156
+
static string prepare_command_line(string logbook)
format the ELOG command and essential address arguments.
Definition: pearl-elog.ipf:845
+
static variable cleanup_temp_files()
delete temporary files created by the ELOG module.
+
static string get_log_path()
+
static const variable kAttachColTitle
+
static const string elog_parse_id
+
static string get_panel_message(string windowname)
get the message field of the ELOG panel
+
static string create_cmd_file(string cmd)
+
static variable init_volatile_vars()
initialize volatile variables.
Definition: pearl-elog.ipf:340
+
static variable load_prefs()
load persistent package data from the preferences file.
Definition: pearl-elog.ipf:584
+
static const variable kdfPersistent
Definition: pearl-elog.ipf:155
+
static variable init_package(variable clean=defaultValue)
initialize the package data folder.
Definition: pearl-elog.ipf:217
+
static variable save_prefs()
save persistent package data to the preferences file.
Definition: pearl-elog.ipf:564
+
static const variable kdfRoot
Definition: pearl-elog.ipf:153
+
variable elog_prompt_login(string logbook)
prompt the user for login to a logbook
+
static string set_panel_message(string windowname, string message)
set the message field of the ELOG panel
+
static variable IgorQuitHook(string igorApplicationNameStr)
save preferences and recent values before Igor quits.
Definition: pearl-elog.ipf:135
+
static variable bp_submit(WMButtonAction *ba)
button procedure for the Submit and Reply buttons
+
static variable bp_attach_allnone(WMButtonAction *ba)
select/deselect all graph windows for attachment
+
static string get_panel_attributes(string windowname)
get a list of attributes from the fields of the ELOG panel.
+
static const string elog_success_msg
+
static string get_timestamp(string sep)
Definition: pearl-elog.ipf:949
+
variable elog_logout(string logbook)
clear username and password of a logbook or all logbooks.
Definition: pearl-elog.ipf:533
+
variable pearl_elog(string logbook)
main function to initialize ELOG and to open an ELOG panel.
Definition: pearl-elog.ipf:97
+
static string format_url(string logbook)
format the URL for display to the user
Definition: pearl-elog.ipf:894
+
static const string package_name
Definition: pearl-elog.ipf:85
+
+
+ + + + diff --git a/doc/html/pearl-fitfuncs_8ipf.html b/doc/html/pearl-fitfuncs_8ipf.html new file mode 100644 index 0000000..6bda554 --- /dev/null +++ b/doc/html/pearl-fitfuncs_8ipf.html @@ -0,0 +1,607 @@ + + + + + + +PEARL Procedures: pearl-fitfuncs.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-fitfuncs.ipf File Reference
+
+
+
#include "mm-physconst"
+
+

Go to the source code of this file.

+ + + + +

+Data Structures

struct  DoniachSunjicStruct
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

threadsafe variable ds1_bg (wave w, variable x)
 
threadsafe variable ds2_bg (wave w, variable x)
 
variable ds4_bg (wave w, variable x)
 
variable ds6_bg (wave w, variable x)
 
threadsafe variable DoniachSunjicBroadS (DoniachSunjicStruct *s)
 
variable DoniachSunjicBroad (wave pw, wave yw, wave xw)
 
variable Calc_DoniachSunjicBroad (wave pw, wave yw)
 
variable Fit_DoniachSunjicBroad (wave pw, wave yw, wave xw, wave ww)
 
variable Au4f (wave w, variable x)
 
variable Au4f_2p2 (wave w, variable x)
 
variable ShowComponents_Au4f_2p2 (wave coef_wave, wave fit_wave)
 
variable Au4f_2p3 (wave w, variable x)
 
variable ShowComponents_Au4f_2p3 (wave coef_wave, wave fit_wave)
 
variable FermiGaussConv (wave pw, wave yw, wave xw)
 convolution of Fermi-Dirac distribution and a Gaussian. More...
 
+ + + +

+Variables

 version
 
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
variable Au4f (wave w,
variable x 
)
+
+ +

Definition at line 419 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable Au4f_2p2 (wave w,
variable x 
)
+
+ +

Definition at line 464 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable Au4f_2p3 (wave w,
variable x 
)
+
+ +

Definition at line 549 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable Calc_DoniachSunjicBroad (wave pw,
wave yw 
)
+
+ +

Definition at line 362 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable DoniachSunjicBroad (wave pw,
wave yw,
wave xw 
)
+
+ +

Definition at line 301 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + +
threadsafe variable DoniachSunjicBroadS (DoniachSunjicStructs)
+
+ +

Definition at line 212 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
threadsafe variable ds1_bg (wave w,
variable x 
)
+
+ +

Definition at line 38 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
threadsafe variable ds2_bg (wave w,
variable x 
)
+
+ +

Definition at line 61 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ds4_bg (wave w,
variable x 
)
+
+ +

Definition at line 89 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ds6_bg (wave w,
variable x 
)
+
+ +

Definition at line 130 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable FermiGaussConv (wave pw,
wave yw,
wave xw 
)
+
+ +

convolution of Fermi-Dirac distribution and a Gaussian.

+
    +
  • pw[0] = constant background
  • +
  • pw[1] = linear background
  • +
  • pw[2] = amplitude
  • +
  • pw[3] = Fermi level in eV
  • +
  • pw[4] = temperature in K
  • +
  • pw[5] = gaussian width = FWHM / 1.66511
  • +
+ +

Definition at line 672 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable Fit_DoniachSunjicBroad (wave pw,
wave yw,
wave xw,
wave ww 
)
+
+ +

Definition at line 383 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ShowComponents_Au4f_2p2 (wave coef_wave,
wave fit_wave 
)
+
+ +

Definition at line 518 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ShowComponents_Au4f_2p3 (wave coef_wave,
wave fit_wave 
)
+
+ +

Definition at line 617 of file pearl-fitfuncs.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
version
+
+ +

Definition at line 5 of file pearl-fitfuncs.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-fitfuncs_8ipf.js b/doc/html/pearl-fitfuncs_8ipf.js new file mode 100644 index 0000000..34450e3 --- /dev/null +++ b/doc/html/pearl-fitfuncs_8ipf.js @@ -0,0 +1,19 @@ +var pearl_fitfuncs_8ipf = +[ + [ "DoniachSunjicStruct", "struct_doniach_sunjic_struct.html", "struct_doniach_sunjic_struct" ], + [ "Au4f", "pearl-fitfuncs_8ipf.html#a13a5ee22049d9a3379cd6e55654e70a3", null ], + [ "Au4f_2p2", "pearl-fitfuncs_8ipf.html#a24cd6a0c96ef8c720e371bb31ac0a479", null ], + [ "Au4f_2p3", "pearl-fitfuncs_8ipf.html#a709f7c4585b1d850ea8aae1885ac18cb", null ], + [ "Calc_DoniachSunjicBroad", "pearl-fitfuncs_8ipf.html#aff8e8b103c32c8e723b57ce7ad5ef0f5", null ], + [ "DoniachSunjicBroad", "pearl-fitfuncs_8ipf.html#ae2d138beb7cb39e8042487893095b461", null ], + [ "DoniachSunjicBroadS", "pearl-fitfuncs_8ipf.html#a9d110819fa3cd2173f3103724e394fdf", null ], + [ "ds1_bg", "pearl-fitfuncs_8ipf.html#af62cb65b7444ff60e956a45bd5d0ec27", null ], + [ "ds2_bg", "pearl-fitfuncs_8ipf.html#a1e729418252bf0d05ea6ec5cbd65b834", null ], + [ "ds4_bg", "pearl-fitfuncs_8ipf.html#ab32134566b2573672ac674565deebd36", null ], + [ "ds6_bg", "pearl-fitfuncs_8ipf.html#a5a2a03026b88f3dd99214ab1b26e6f80", null ], + [ "FermiGaussConv", "pearl-fitfuncs_8ipf.html#a4d20215153c0e0cee3870dfceded8bc9", null ], + [ "Fit_DoniachSunjicBroad", "pearl-fitfuncs_8ipf.html#a819902ab9f541b75a0fd33a7b52465d0", null ], + [ "ShowComponents_Au4f_2p2", "pearl-fitfuncs_8ipf.html#a84a0278284332631682ce032018d1716", null ], + [ "ShowComponents_Au4f_2p3", "pearl-fitfuncs_8ipf.html#a02368cc4adfbd746cd2f1e7d73884a61", null ], + [ "version", "pearl-fitfuncs_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-fitfuncs_8ipf_source.html b/doc/html/pearl-fitfuncs_8ipf_source.html new file mode 100644 index 0000000..f7d79af --- /dev/null +++ b/doc/html/pearl-fitfuncs_8ipf_source.html @@ -0,0 +1,150 @@ + + + + + + +PEARL Procedures: pearl-fitfuncs.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-fitfuncs.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.2
3 #pragma ModuleName = PearlFitFuncs
4 #pragma version = 1.01
5 #include "mm-physconst", version >= 1.05
6 
7 // various fit functions for photoelectron spectroscopy
8 
9 // $Id$
10 // author: matthias.muntwiler@psi.ch
11 // Copyright (c) 2013-14 Paul Scherrer Institut
12 
13 // Licensed under the Apache License, Version 2.0 (the "License");
14 // you may not use this file except in compliance with the License.
15 // You may obtain a copy of the License at
16 // http://www.apache.org/licenses/LICENSE-2.0
17 
18 //------------------------------------------------------------------------------
19 // Doniach-Sunjic fit functions
20 //------------------------------------------------------------------------------
21 
22 threadsafe variable DoniachSunjic(variable x, variable amp, variable pos, variable sing, variable fwhm){
23  // Doniach-Sunjic line shape
24  // [S. Doniach, M. Sunjic, J. Phys. C 3 (1970) 285]
25  variable x// independent variable
26  variable amp// amplitude
27  variable pos// position
28  variable sing// singularity index (0 <= sing < 1)
29  variable fwhm// width
30 
31  variable nom, denom
32  nom = cos(pi * sing / 2 + (1 - sing) * atan((x - pos) / fwhm * 2))
33  denom = ((x - pos)^2 + fwhm^2 / 4)^((1 - sing) / 2)
34 
35  return amp * nom / denom * fwhm / 2
36 };
37 
38 threadsafe variable ds1_bg(wave w, variable x){
39  // Doniach-Sunjic fit function
40  // 0 <= sing < 1
41  wave w// coefficients - see below
42  variable x// independent variable
43 
44  //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
45  //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
46  //CurveFitDialog/ Equation:
47  //CurveFitDialog/ f(x) = DoniachSunjic(x, amp, pos, sing, fwhm) + bg
48  //CurveFitDialog/ End of Equation
49  //CurveFitDialog/ Independent Variables 1
50  //CurveFitDialog/ x
51  //CurveFitDialog/ Coefficients 5
52  //CurveFitDialog/ w[0] = bg
53  //CurveFitDialog/ w[1] = amp
54  //CurveFitDialog/ w[2] = pos
55  //CurveFitDialog/ w[3] = sing
56  //CurveFitDialog/ w[4] = FWHM
57 
58  return DoniachSunjic(x, w[1], w[2], w[3], w[4]) + w[0]
59 };
60 
61 threadsafe variable ds2_bg(wave w, variable x){
62  Wave w
63  Variable x
64 
65  //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
66  //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
67  //CurveFitDialog/ Equation:
68  //CurveFitDialog/ f(x) = w_0+( w_1*cos(pi*w_3/2+(1-w_3)*atan((x-w_2)/w_4)))/(((x-w_2)^2+w_4^2)^((1-w_3)/2)) +(w_5*cos(pi*w_7/2+(1-w_7)*atan((x-(w_6))/w_8)))/(((x-w_6)^2+w_8^2)^((1-w_7)/2))
69  //CurveFitDialog/ End of Equation
70  //CurveFitDialog/ Independent Variables 1
71  //CurveFitDialog/ x
72  //CurveFitDialog/ Coefficients 9
73  //CurveFitDialog/ w[0] = bg
74  //CurveFitDialog/ w[1] = amp1
75  //CurveFitDialog/ w[2] = pos1
76  //CurveFitDialog/ w[3] = sing1
77  //CurveFitDialog/ w[4] = wid1
78  //CurveFitDialog/ w[5] = amp2
79  //CurveFitDialog/ w[6] = pos2
80  //CurveFitDialog/ w[7] = sing2
81  //CurveFitDialog/ w[8] = wid2
82 
83  variable ds1 = DoniachSunjic(x, w[1], w[2], w[3], w[4])
84  variable ds2 = DoniachSunjic(x, w[5], w[6], w[7], w[8])
85 
86  return w[0] + ds1 + ds2
87 };
88 
89 variable ds4_bg(wave w, variable x){
90  Wave w
91  Variable x
92 
93  //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
94  //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
95  //CurveFitDialog/ Equation:
96  //CurveFitDialog/ f(x) = w_0+( w_1*cos(pi*w_3/2+(1-w_3)*atan((x-w_2)/w_4)))/(((x-w_2)^2+w_4^2)^((1-w_3)/2)) +(w_5*cos(pi*w_7/2+(1-w_7)*atan((x-(w_6))/w_8)))/(((x-w_6)^2+w_8^2)^((1-w_7)/2)) +( w_9*cos(pi*w_11/2+(1-w_11)*atan((x-w_10)/w_12)))/(((x-w_10)^2+w_12^2)^((1-w_11)/2)) +( w_13*cos(pi*w_15/2+(1-w_15)*atan((x-w_14)/w_16)))/(((x-w_14)^2+w_16^2)^((1-w_15)/2))
97  //CurveFitDialog/ End of Equation
98  //CurveFitDialog/ Independent Variables 1
99  //CurveFitDialog/ x
100  //CurveFitDialog/ Coefficients 17
101  //CurveFitDialog/ w[0] = w_0
102  //CurveFitDialog/ w[1] = w_11
103  //CurveFitDialog/ w[2] = w_12
104  //CurveFitDialog/ w[3] = w_13
105  //CurveFitDialog/ w[4] = w_14
106  //CurveFitDialog/ w[5] = w_21
107  //CurveFitDialog/ w[6] = w_22
108  //CurveFitDialog/ w[7] = w_23
109  //CurveFitDialog/ w[8] = w_24
110  //CurveFitDialog/ w[9] = w_31
111  //CurveFitDialog/ w[10] = w_32
112  //CurveFitDialog/ w[11] = w_33
113  //CurveFitDialog/ w[12] = w_34
114  //CurveFitDialog/ w[13] = w_41
115  //CurveFitDialog/ w[14] = w_42
116  //CurveFitDialog/ w[15] = w_43
117  //CurveFitDialog/ w[16] = w_44
118  Variable ds1, ds2, ds3, ds4
119  ds1=( w[1]*cos(pi*w[3]/2+(1-w[3])*atan((x-w[2])/w[4])))/(((x-w[2])^2+w[4]^2)^((1-w[3])/2))
120  ds2=( w[5]*cos(pi*w[7]/2+(1-w[7])*atan((x-w[6])/w[8])))/(((x-w[6])^2+w[8]^2)^((1-w[7])/2))
121  ds3=( w[9]*cos(pi*w[11]/2+(1-w[11])*atan((x-w[10])/w[12])))/(((x-w[10])^2+w[12]^2)^((1-w[11])/2))
122  ds4=( w[13]*cos(pi*w[15]/2+(1-w[15])*atan((x-w[14])/w[16])))/(((x-w[14])^2+w[16]^2)^((1-w[15])/2))
123 
124 
125  return w[0]+ds1+ds2+ds3+ds4
126 
127 
128 };
129 
130 variable ds6_bg(wave w, variable x){
131  Wave w
132  Variable x
133 
134  //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
135  //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
136  //CurveFitDialog/ Equation:
137  //CurveFitDialog/
138  //CurveFitDialog/ Variable g, ds1, ds2, ds3, ds4, ds5, ds6
139  //CurveFitDialog/ ds1=( w_11*cos(pi*w_13/2+(1-w_13)*atan((x-w_12)/w_14)))/(((x-w_12)^2+w_14^2)^((1-w_13)/2))
140  //CurveFitDialog/ ds2=( w_21*cos(pi*w_23/2+(1-w_23)*atan((x-w_22)/w_24)))/(((x-w_22)^2+w_24^2)^((1-w_23)/2))
141  //CurveFitDialog/ ds3=( w_31*cos(pi*w_33/2+(1-w_33)*atan((x-w_32)/w_34)))/(((x-w_32)^2+w_34^2)^((1-w_33)/2))
142  //CurveFitDialog/ ds4=( w_41*cos(pi*w_43/2+(1-w_43)*atan((x-w_42)/w_44)))/(((x-w_42)^2+w_44^2)^((1-w_43)/2))
143  //CurveFitDialog/ ds5=( w_51*cos(pi*w_53/2+(1-w_53)*atan((x-w_52)/w_54)))/(((x-w_52)^2+w_54^2)^((1-w_53)/2))
144  //CurveFitDialog/ ds6=( w_61*cos(pi*w_63/2+(1-w_63)*atan((x-w_62)/w_64)))/(((x-w_62)^2+w_64^2)^((1-w_63)/2))
145  //CurveFitDialog/
146  //CurveFitDialog/ f(x) =w_0+ds1+ds2+ds3+ds4+ds5+ds6
147  //CurveFitDialog/
148  //CurveFitDialog/ End of Equation
149  //CurveFitDialog/ Independent Variables 1
150  //CurveFitDialog/ x
151  //CurveFitDialog/ Coefficients 25
152  //CurveFitDialog/ w[0] = w_0
153  //CurveFitDialog/ w[1] = w_11
154  //CurveFitDialog/ w[2] = w_12
155  //CurveFitDialog/ w[3] = w_13
156  //CurveFitDialog/ w[4] = w_14
157  //CurveFitDialog/ w[5] = w_21
158  //CurveFitDialog/ w[6] = w_22
159  //CurveFitDialog/ w[7] = w_23
160  //CurveFitDialog/ w[8] = w_24
161  //CurveFitDialog/ w[9] = w_31
162  //CurveFitDialog/ w[10] = w_32
163  //CurveFitDialog/ w[11] = w_33
164  //CurveFitDialog/ w[12] = w_34
165  //CurveFitDialog/ w[13] = w_41
166  //CurveFitDialog/ w[14] = w_42
167  //CurveFitDialog/ w[15] = w_43
168  //CurveFitDialog/ w[16] = w_44
169  //CurveFitDialog/ w[17] = w_51
170  //CurveFitDialog/ w[18] = w_52
171  //CurveFitDialog/ w[19] = w_53
172  //CurveFitDialog/ w[20] = w_54
173  //CurveFitDialog/ w[21] = w_61
174  //CurveFitDialog/ w[22] = w_62
175  //CurveFitDialog/ w[23] = w_63
176  //CurveFitDialog/ w[24] = w_64
177 
178 
179  Variable ds1, ds2, ds3, ds4, ds5, ds6
180  ds1=( w[1]*cos(pi*w[3]/2+(1-w[3])*atan((x-w[2])/w[4])))/(((x-w[2])^2+w[4]^2)^((1-w[3])/2))
181  ds2=( w[5]*cos(pi*w[7]/2+(1-w[7])*atan((x-w[6])/w[8])))/(((x-w[6])^2+w[8]^2)^((1-w[7])/2))
182  ds3=( w[9]*cos(pi*w[11]/2+(1-w[11])*atan((x-w[10])/w[12])))/(((x-w[10])^2+w[12]^2)^((1-w[11])/2))
183  ds4=( w[13]*cos(pi*w[15]/2+(1-w[15])*atan((x-w[14])/w[16])))/(((x-w[14])^2+w[16]^2)^((1-w[15])/2))
184  ds5=( w[17]*cos(pi*w[19]/2+(1-w[19])*atan((x-w[18])/w[20])))/(((x-w[18])^2+w[20]^2)^((1-w[19])/2))
185  ds6=( w[21]*cos(pi*w[23]/2+(1-w[23])*atan((x-w[22])/w[24])))/(((x-w[22])^2+w[24]^2)^((1-w[23])/2))
186 
187  return w[0]+ds1+ds2+ds3+ds4+ds5+ds6
188 
189 };
190 
192  // data structure for DoniachSunjicBroadS structural function fit
193 
194  // waves populated by the FuncFit operation
195  wave pw;
196  wave yw;
197  wave xw;
198 
199  // convolution parameters to be set upon creation of the structure
200  variable precision;
201  variable oversampling;
202 
203  // auxiliary fields used internally by DoniachSunjicBroadS
204  // do not touch these
205  wave xdw;
206  wave model;
209 };
210 
211 //------------------------------------------------------------------------------
212 threadsafe variable DoniachSunjicBroadS(DoniachSunjicStruct* s){
213 //------------------------------------------------------------------------------
214  // Two-peak (bulk + surface) Doniach-Sunjic line shape with Gaussian broadening (convolution).
215  // Hold parameter 5 at 0 to fit just one peak.
216 
217  // Structural fit function for efficient fitting in procedures.
218  // Calculating the convolution requires auxiliary waves and additional, non-fitting parameters.
219  // To eliminate the time-consuming overhead of creating and killing the auxiliary waves,
220  // these waves are held in the fitting structure.
221 
222  // Caution: The function on its own is thread-safe.
223  // However, since FuncFit uses the same structure in all threads, the fitting cannot run in parallel.
224  // Set /NTHR=1.
225 
226  // See also Fit_DoniachSunjicBroad (example), DoniachSunjicBroad (conventional fit function)
227  Struct DoniachSunjicStruct &s
228 
229  // pw[0] = bulk amplitude
230  // pw[1] = bulk position
231  // pw[2] = Lorentzian FWHM
232  // pw[3] = Donjach-Sunjic singularity index (0..1)
233  // pw[4] = surface shift
234  // pw[5] = surface/bulk ratio
235  // pw[6] = Gaussian FWHM
236  // pw[7] = constant background
237  // pw[8] = linear background
238 
239  wave xw = s.xw
240  wave yw = s.yw
241  wave pw = s.pw
242 
243  variable precision = s.precision
244  variable oversampling = s.oversampling
245 
246  if (WaveExists(s.xdw))
247  wave xdw = s.xdw
248  wave model = s.model
249  wave broadening = s.broadening
250  wave convolution = s.convolution
251  else
252  make /n=0 /free xdw, model, broadening, convolution
253  redimension /d xdw, model, broadening, convolution
254  wave fs.xdw = xdw
255  wave fs.model = model
256  wave fs.broadening = broadening
257  wave fs.convolution = convolution
258  endif
259 
260  // calculate wave spacing based on minimum spacing of desired x points
261  differentiate /p xw /d=xdw
262  xdw = abs(xdw)
263  variable xd = wavemin(xdw) / oversampling
264 
265  // calculate broadening wave size based on width and precision variable
266  variable x0b = pw[6] * precision
267  variable nb = 2 * floor(x0b / xd) + 1
268 
269  // calculate model size based on desired range for yw
270  variable x0m = max(abs(wavemax(xw) - pw[1]), abs(wavemin(xw) - pw[1])) + x0b
271  variable nm = 2 * floor(x0m / xd) + 1
272  nb = min(nb, nm * 10)// limit wave size to avoid runtime errors for unphysically large parameter
273 
274  // create and calculate initial waves, normalize exponential
275  redimension /n=(nb) broadening
276  redimension /n=(nm) model
277  setscale/i x -x0b, x0b, "", broadening
278  setscale/i x -x0m, x0m, "", model
279 
280  broadening = exp( - (x / pw[6])^2 * 4 * ln(2))
281  variable nrm = area(broadening)
282  broadening /= nrm
283  model = DoniachSunjic(x, 1, 0, pw[3], pw[2])// bulk
284  model += DoniachSunjic(x, pw[5], pw[4], pw[3], pw[2])// surface
285 
286  // calculate the convolution
287  Convolve /a broadening, model
288  variable scale = pw[0] / wavemax(model)
289  model *= scale
290 
291  // prepare output
292  nm = numpnts(model)
293  x0m = xd * (nm - 1) / 2
294  setscale/i x -x0m, x0m, "", model
295 
296  yw = model(xw[p] - pw[1]) + pw[7] + pw[8] * xw[p]
297  yw = numtype(yw) ? 0 : yw
298 };
299 
300 //------------------------------------------------------------------------------
301 variable DoniachSunjicBroad(wave pw, wave yw, wave xw){
302 //------------------------------------------------------------------------------
303  // Two-peak (bulk + surface) Doniach-Sunjic line shape with Gaussian broadening (convolution).
304  // Hold parameter 5 at 0 to fit just one peak.
305  // Conventional fit function for use with the curve-fitting dialog.
306  // Compared to DoniachSunjicBroadS this function incurs extra overhead
307  // because auxiliary waves are created and killed between function calls.
308  // See also DoniachSunjicBroadS (optimized structural fit function)
309  Wave pw
310  Wave yw
311  Wave xw
312 
313  // pw[0] = bulk amplitude
314  // pw[1] = bulk position
315  // pw[2] = Lorentzian FWHM
316  // pw[3] = Donjach-Sunjic singularity index (0..1)
317  // pw[4] = surface shift
318  // pw[5] = surface/bulk ratio
319  // pw[6] = Gaussian FWHM
320  // pw[7] = constant background
321  // pw[8] = linear background
322 
323  // set up data structure
324  struct DoniachSunjicStruct fs
325  fs.precision = 5
326  fs.oversampling = 4
327 
328  wave fs.pw = pw
329  wave fs.xw = xw
330  wave fs.yw = yw
331 
332  // create temporary calculation waves in a global folder
333  dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
334  if (DataFolderRefStatus(df) == 0)
335  newdatafolder root:packages:pearl_fitfuncs:doniach_sunjic
336  dfref df = root:packages:pearl_fitfuncs:doniach_sunjic
337  endif
338 
339  wave /z /sdfr=df fs.xdw = xdw
340  wave /z /sdfr=df fs.model = model
341  wave /z /sdfr=df fs.broadening = broadening
342  wave /z /sdfr=df fs.convolution = convolution
343 
344  if (WaveExists(fs.xdw) == 0)
345  dfref savedf = GetDataFolderDFR()
346  setdatafolder df
347  make /n=0 /d xdw, model, broadening, convolution
348  wave fs.xdw = xdw
349  wave fs.model = model
350  wave fs.broadening = broadening
351  wave fs.convolution = convolution
352  setdatafolder savedf
353  endif
354 
355  // calculate
357 
358  yw = fs.yw
359 };
360 
361 //------------------------------------------------------------------------------
362 variable Calc_DoniachSunjicBroad(wave pw, wave yw){
363 //------------------------------------------------------------------------------
364  // Calculate the DoniachSunjicBroadS line shape
365  Wave pw// coefficient wave
366  Wave yw// output wave, correct x-scaling required on input
367 
368  struct DoniachSunjicStruct fs
369  fs.precision = 5
370  fs.oversampling = 4
371 
372  duplicate /free pw, fs.pw
373  duplicate /free yw, fs.xw
374  fs.xw = x
375  duplicate /free yw, fs.yw
376 
378 
379  yw = fs.yw
380 };
381 
382 //------------------------------------------------------------------------------
383 variable Fit_DoniachSunjicBroad(wave pw, wave yw, wave xw, wave ww){
384 //------------------------------------------------------------------------------
385  // Fit the DoniachSunjicBroadS line shape.
386  // The function applies constraints which assume that the energy scale is in eV.
387  // Returns chi^2.
388  wave pw// coefficient wave- pre-load it with initial guess
389  wave yw
390  wave /z xw
391  wave /z ww// weights (standard deviation)
392 
393  struct DoniachSunjicStruct fs
394  fs.precision = 5
395  fs.oversampling = 4
396 
397  duplicate /free pw, fs.pw
398  if (WaveExists(xw))
399  duplicate /free xw, fs.xw
400  else
401  duplicate /free yw, fs.xw
402  fs.xw = x
403  endif
404  duplicate /free yw, fs.yw
405 
406  variable v_chisq = nan
407  variable V_FitMaxIters = 100
408  make /n=1 /t /free constraints = {"K0 >= 0", "K2 > 0", "K2 < 10", "K3 >= 0", "K3 < 1", "K4 >= -10", "K4 <= 10", "K5 >= 0", "K5 <= 1", "K6 >= 0", "K6 < 10"}
409  // note: only single thread allowed
410  FuncFit /NTHR=1 DoniachSunjicBroadS, pw, yw /X=xw /D /STRC=fs /C=constraints /NWOK /I=1 /W=ww
411 
412  return v_chisq
413 };
414 
415 //------------------------------------------------------------------------------
416 // peak-specific fit functions
417 //------------------------------------------------------------------------------
418 
419 variable Au4f(wave w, variable x){
420  // fit function for a nitrogen 1s-pi* absorption spectrum
421  // modelled as multiple Voigt shapes on a constant background
422  // similar to the Igor VoigtFit function
423  // but with a constant gaussian width (instrumental broadening) for all peaks
424  // gaussian and lorentzian widths are specified as FWHM
425  wave w// parameters
426  // w[0] constant background
427  // w[1] linear background
428  // w[2] global gaussian FWHM
429  // w[3 + 0 + (n-1) * 3] peak n area
430  // w[3 + 1 + (n-1) * 3] peak n position
431  // w[3 + 2 + (n-1) * 3] peak n lorentzian FWHM
432  // length of wave defines number of peaks
433 
434  // for compatibility with older code the linear background term can be omitted.
435  // if the number of parameters divides by 3, the linear background term is added,
436  // otherwise only the constant background.
437  variable x
438 
439  variable np = 15
440  variable ip, ip0
441 
442  variable bg = w[0]
443  variable v = bg
444  if (mod(np, 3) == 0)
445  v += w[1] * x
446  ip0 = 3
447  else
448  ip0 = 2
449  endif
450 
451  variable vc1, vc2, vc3, vc4
452  vc2 = 2 * sqrt(ln(2)) / w[ip0-1]
453  for (ip = ip0; ip < np; ip += 3)
454  vc1 = w[ip] / sqrt(pi) * vc2
455  vc3 = w[ip+1]
456  vc4 = vc2 * w[ip+2] / 2
457  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
458  endfor
459 
460  return v
461 
462 };
463 
464 variable Au4f_2p2(wave w, variable x){
465  // Au 4f 5/2 and 7/2 2-component Voigt fit with a common gaussian width
466  // gaussian and lorentzian widths are specified as FWHM
467  wave w// parameters
468  // w[0] constant background
469  // w[1] linear background
470  // w[2] global gaussian FWHM
471  // w[3] 5/2 bulk area
472  // w[4] 5/2 bulk position
473  // w[5] 5/2 lorentzian FWHM
474  // w[6] 7/2 bulk area
475  // w[7] 7/2 bulk position
476  // w[8] 7/2 lorentzian FWHM
477  // w[9] surface/bulk area ratio
478  // w[10] surface core level shift
479  variable x
480 
481  variable bg = w[0] + w[1] * x
482  variable v = bg
483 
484  variable vc1// amplitude
485  variable vc2// width
486  variable vc3// position
487  variable vc4// shape
488  vc2 = 2 * sqrt(ln(2)) / w[2]
489 
490  // 5/2 bulk
491  vc1 = w[3] / sqrt(pi) * vc2
492  vc3 = w[4]
493  vc4 = vc2 * w[5] / 2
494  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
495 
496  // 5/2 surface
497  vc1 = w[3] / sqrt(pi) * vc2 * w[9]
498  vc3 = w[4] + w[10]
499  vc4 = vc2 * w[5] / 2
500  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
501 
502  // 7/2 bulk
503  vc1 = w[6] / sqrt(pi) * vc2
504  vc3 = w[7]
505  vc4 = vc2 * w[8] / 2
506  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
507 
508  // 7/2 surface
509  vc1 = w[6] / sqrt(pi) * vc2 * w[9]
510  vc3 = w[7] + w[10]
511  vc4 = vc2 * w[8] / 2
512  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
513 
514  return v
515 
516 };
517 
518 variable ShowComponents_Au4f_2p2(wave coef_wave, wave fit_wave){
519  wave coef_wave
520  wave fit_wave
521 
522  duplicate /free coef_wave, coef1, coef2
523  coef1[9] = 0
524  coef2[3] *= coef_wave[9]
525  coef2[4] += coef_wave[10]
526  coef2[6] *= coef_wave[9]
527  coef2[7] += coef_wave[10]
528  coef2[9] = 0
529 
530  string s_fit_wave = NameOfWave(fit_wave)
531  string s_fit_p1 = s_fit_wave + "_p1"
532  string s_fit_p2 = s_fit_wave + "_p2"
533  duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
534  duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
535 
536  fit_p1 = Au4f_2p2(coef1, x)
537  fit_p2 = Au4f_2p2(coef2, x)
538 
539  string traces = TraceNameList("", ";", 1)
540  if ((WhichListItem(s_fit_wave, traces, ";") >= 0) && (WhichListItem(s_fit_p1, traces, ";") < 0))
541  appendtograph fit_p1, fit_p2
542  ModifyGraph lstyle($s_fit_p1)=2
543  ModifyGraph lstyle($s_fit_p2)=2
544  ModifyGraph rgb($s_fit_p1)=(0,0,65280)
545  ModifyGraph rgb($s_fit_p2)=(0,0,65280)
546  endif
547 };
548 
549 variable Au4f_2p3(wave w, variable x){
550  // Au 4f 5/2 and 7/2 3-component Voigt fit with a common gaussian width
551  // gaussian and lorentzian widths are specified as FWHM
552  wave w// parameters
553  // w[0] constant background
554  // w[1] linear background
555  // w[2] global gaussian FWHM
556  // w[3] 5/2 bulk area
557  // w[4] 5/2 bulk position
558  // w[5] 5/2 lorentzian FWHM
559  // w[6] 7/2 bulk area
560  // w[7] 7/2 bulk position
561  // w[8] 7/2 lorentzian FWHM
562  // w[9] surface/bulk area ratio
563  // w[10] surface core level shift
564  // w[11] 2nd layer/bulk area ratio
565  // w[12] 2nd layer core level shift
566  variable x
567 
568  variable bg = w[0] + w[1] * x
569  variable v = bg
570 
571  variable vc1// amplitude
572  variable vc2// width
573  variable vc3// position
574  variable vc4// shape
575  vc2 = 2 * sqrt(ln(2)) / w[2]
576 
577  // 5/2 bulk
578  vc1 = w[3] / sqrt(pi) * vc2
579  vc3 = w[4]
580  vc4 = vc2 * w[5] / 2
581  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
582 
583  // 5/2 surface
584  vc1 = w[3] / sqrt(pi) * vc2 * w[9]
585  vc3 = w[4] + w[10]
586  vc4 = vc2 * w[5] / 2
587  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
588 
589  // 5/2 2nd layer
590  vc1 = w[3] / sqrt(pi) * vc2 * w[11]
591  vc3 = w[4] + w[12]
592  vc4 = vc2 * w[5] / 2
593  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
594 
595  // 7/2 bulk
596  vc1 = w[6] / sqrt(pi) * vc2
597  vc3 = w[7]
598  vc4 = vc2 * w[8] / 2
599  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
600 
601  // 7/2 surface
602  vc1 = w[6] / sqrt(pi) * vc2 * w[9]
603  vc3 = w[7] + w[10]
604  vc4 = vc2 * w[8] / 2
605  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
606 
607  // 7/2 2nd layer
608  vc1 = w[6] / sqrt(pi) * vc2 * w[11]
609  vc3 = w[7] + w[12]
610  vc4 = vc2 * w[8] / 2
611  v += vc1 * VoigtFunc(vc2 * (x - vc3), vc4)
612 
613  return v
614 
615 };
616 
617 variable ShowComponents_Au4f_2p3(wave coef_wave, wave fit_wave){
618  wave coef_wave
619  wave fit_wave
620 
621  duplicate /free coef_wave, coef1, coef2, coef3
622  coef1[9] = 0
623  coef1[11] = 0
624 
625  coef2[3] *= coef_wave[9]
626  coef2[4] += coef_wave[10]
627  coef2[6] *= coef_wave[9]
628  coef2[7] += coef_wave[10]
629  coef2[9] = 0
630  coef2[11] = 0
631 
632  coef3[3] *= coef_wave[11]
633  coef3[4] += coef_wave[12]
634  coef3[6] *= coef_wave[11]
635  coef3[7] += coef_wave[12]
636  coef3[9] = 0
637  coef3[11] = 0
638 
639  string s_fit_wave = NameOfWave(fit_wave)
640  string s_fit_p1 = s_fit_wave + "_p1"
641  string s_fit_p2 = s_fit_wave + "_p2"
642  string s_fit_p3 = s_fit_wave + "_p3"
643  duplicate /o fit_wave, $(s_fit_p1) /wave=fit_p1
644  duplicate /o fit_wave, $(s_fit_p2) /wave=fit_p2
645  duplicate /o fit_wave, $(s_fit_p3) /wave=fit_p3
646 
647  fit_p1 = Au4f_2p2(coef1, x)
648  fit_p2 = Au4f_2p2(coef2, x)
649  fit_p3 = Au4f_2p2(coef3, x)
650 
651  string traces = TraceNameList("", ";", 1)
652  if ((WhichListItem(s_fit_wave, traces, ";") >= 0) && (WhichListItem(s_fit_p1, traces, ";") < 0))
653  appendtograph fit_p1, fit_p2, fit_p3
654  ModifyGraph lstyle($s_fit_p1)=2
655  ModifyGraph lstyle($s_fit_p2)=2
656  ModifyGraph lstyle($s_fit_p3)=2
657  ModifyGraph rgb($s_fit_p1)=(0,0,65280)
658  ModifyGraph rgb($s_fit_p2)=(0,0,65280)
659  ModifyGraph rgb($s_fit_p3)=(0,0,65280)
660  endif
661 };
662 
672 variable FermiGaussConv(wave pw, wave yw, wave xw){
673  WAVE pw, yw, xw
674 
675  // half width of temporary gaussian wave is pw[5] multiplied by this factor (may be fractional)
676  variable precision_g = 5
677  variable oversampling = 4
678 
679  // calculate wave spacing based on minimum spacing of desired x points
680  duplicate /free xw, xdw
681  differentiate /p xw /d=xdw
682  xdw = abs(xdw)
683  variable xd = wavemin(xdw) / oversampling
684 
685  // calculate gausswave size based on pw[5] and precision variable
686  variable x0g = abs(pw[5]) * precision_g
687  variable ng = 2 * floor(x0g / xd) + 1
688 
689  // calculate fermiwave size based on desired range for yw
690  variable emax = wavemax(xw)
691  variable emin = wavemin(xw)
692  variable x0f = max(abs(emax - pw[3]), abs(emin - pw[3])) + x0g
693  variable ne = 2 * floor(x0f / xd) + 1
694 
695  // create and calculate initial waves, normalize exponential
696  make /d /n=(ng) /free gausswave
697  make /d /n=(ne) /free fermiwave
698  setscale/i x -x0g, x0g, "", gausswave
699  setscale/i x -x0f, x0f, "", fermiwave
700 
701  gausswave = exp( - (x / pw[5] )^2 )
702  fermiwave = 1 / (exp( x / (kBoltzmann * pw[4])) + 1.0 )
703 
704  // calculate the convolution
705  duplicate /free fermiwave, resultwave
706  Convolve /a gausswave, resultwave
707  variable rmax = wavemax(resultwave)
708  resultwave /= rmax
709 
710  // prepare output
711  ng = numpnts(resultwave)
712  x0g = xd * (ng - 1) / 2
713  setscale/i x -x0g, x0g, "", resultwave
714 
715  yw = pw[2] * resultwave(xw[p] - pw[3]) + pw[0] + pw[1] * xw[p]
716 };
717 
variable DoniachSunjicBroad(wave pw, wave yw, wave xw)
+ +
variable ds4_bg(wave w, variable x)
+ +
variable FermiGaussConv(wave pw, wave yw, wave xw)
convolution of Fermi-Dirac distribution and a Gaussian.
+
threadsafe variable DoniachSunjicBroadS(DoniachSunjicStruct *s)
+ +
variable Au4f(wave w, variable x)
+
variable Au4f_2p3(wave w, variable x)
+
variable Au4f_2p2(wave w, variable x)
+
variable ShowComponents_Au4f_2p2(wave coef_wave, wave fit_wave)
+
variable Calc_DoniachSunjicBroad(wave pw, wave yw)
+
variable ShowComponents_Au4f_2p3(wave coef_wave, wave fit_wave)
+
variable Fit_DoniachSunjicBroad(wave pw, wave yw, wave xw, wave ww)
+ + + +
threadsafe variable ds2_bg(wave w, variable x)
+ +
version
+ +
variable ds6_bg(wave w, variable x)
+ +
threadsafe variable ds1_bg(wave w, variable x)
+ +
+
+ + + + diff --git a/doc/html/pearl-gui-tools_8ipf.html b/doc/html/pearl-gui-tools_8ipf.html new file mode 100644 index 0000000..0de0341 --- /dev/null +++ b/doc/html/pearl-gui-tools_8ipf.html @@ -0,0 +1,225 @@ + + + + + + +PEARL Procedures: pearl-gui-tools.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-gui-tools.ipf File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + +

+Functions

variable display_progress_panel (string title, string message, variable progress_max)
 
variable update_progress_panel (variable progress, string message=defaultValue, variable progress_max=defaultValue)
 
variable kill_progress_panel ()
 
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable display_progress_panel (string title,
string message,
variable progress_max 
)
+
+ +

Definition at line 18 of file pearl-gui-tools.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable kill_progress_panel ()
+
+ +

Definition at line 50 of file pearl-gui-tools.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable update_progress_panel (variable progress,
string message = defaultValue,
variable progress_max = defaultValue 
)
+
+ +

Definition at line 32 of file pearl-gui-tools.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-gui-tools_8ipf.js b/doc/html/pearl-gui-tools_8ipf.js new file mode 100644 index 0000000..ba1dbeb --- /dev/null +++ b/doc/html/pearl-gui-tools_8ipf.js @@ -0,0 +1,6 @@ +var pearl_gui_tools_8ipf = +[ + [ "display_progress_panel", "pearl-gui-tools_8ipf.html#aaf29d090c81e00cf44af295193b24c5a", null ], + [ "kill_progress_panel", "pearl-gui-tools_8ipf.html#aca0a41a0f28a35ac7535df30ddbd79fe", null ], + [ "update_progress_panel", "pearl-gui-tools_8ipf.html#a97ad19d83cf0007c4bcf97a32164610f", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-gui-tools_8ipf_source.html b/doc/html/pearl-gui-tools_8ipf_source.html new file mode 100644 index 0000000..009bbbb --- /dev/null +++ b/doc/html/pearl-gui-tools_8ipf_source.html @@ -0,0 +1,128 @@ + + + + + + +PEARL Procedures: pearl-gui-tools.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-gui-tools.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 = PearlGuiTools
4 #pragma version = 1.01
5 
6 // Miscellaneous GUI tools
7 // * progress bar
8 
9 // created: matthias.muntwiler@psi.ch, 2013-11-14
10 // Copyright (c) 2013 Paul Scherrer Institut
11 // $Id$
12 
13 // Licensed under the Apache License, Version 2.0 (the "License");
14 // you may not use this file except in compliance with the License.
15 // You may obtain a copy of the License at
16 // http://www.apache.org/licenses/LICENSE-2.0
17 
18 variable display_progress_panel(string title, string message, variable progress_max){
19  string title
20  string message
21  variable progress_max
22 
23  NewPanel /K=1 /N=ProgressPanel /W=(200,200,402,260) as title
24  TitleBox t_message,pos={2,2},size={189,13},title=message
25  TitleBox t_message,frame=0
26  ValDisplay vd_progress,pos={2,20},size={198,13}
27  ValDisplay vd_progress,limits={0,progress_max,0},barmisc={0,0},mode= 3,value= _NUM:0
28  Button b_abort,pos={74,38},size={50,20},title="Abort"
29  DoUpdate /W=ProgressPanel /E=1
30 };
31 
32 variable update_progress_panel(variable progress, string message = defaultValue, variable progress_max = defaultValue){
33  // returns true if the user clicked the Abort button
34  variable progress
35  string message
36  variable progress_max
37 
38  if (!ParamIsDefault(message))
39  TitleBox t_message,title=message,win=ProgressPanel
40  endif
41  if (ParamIsDefault(progress_max))
42  ValDisplay vd_progress,value=_NUM:progress,win=ProgressPanel
43  else
44  ValDisplay vd_progress,limits={0,progress_max,0},value=_NUM:progress,win=ProgressPanel
45  endif
46  DoUpdate /W=ProgressPanel
47  return (v_flag == 2)
48 };
49 
51  KillWindow ProgressPanel
52 };
53 
variable kill_progress_panel()
+
variable display_progress_panel(string title, string message, variable progress_max)
+
variable update_progress_panel(variable progress, string message=defaultValue, variable progress_max=defaultValue)
+
+
+ + + + diff --git a/doc/html/pearl-matrix-import_8ipf.html b/doc/html/pearl-matrix-import_8ipf.html new file mode 100644 index 0000000..57aa9b5 --- /dev/null +++ b/doc/html/pearl-matrix-import_8ipf.html @@ -0,0 +1,1093 @@ + + + + + + +PEARL Procedures: pearl-matrix-import.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-matrix-import.ipf File Reference
+
+
+ +

data file import for omicron matrix (STM) files +More...

+ +

Go to the source code of this file.

+ + + + + +

+Data Structures

struct  errorCode
 from matrixfilereader help More...
 
+ + + + +

+Namespaces

 PearlMatrixImport
 data file import for omicron matrix (STM) files
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

static variable init_package ()
 initialize the package data folder. More...
 
static variable check_package_folder ()
 check that the package data folder exists More...
 
static variable AfterFileOpenHook (variable refNum, string file, string pathName, string type, string creator, variable kind)
 initialize the package and reload preferences after an experiment is loaded. More...
 
static variable BeforeFileOpenHook (variable refNum, string fileName, string path, string type, string creator, variable kind)
 open a matrix file that was dropped into Igor. More...
 
string matrix_format_elog_message (wave metadata)
 generate elog message from bricklet metadata More...
 
variable matrix_preview_2d (wave data, wave metadata)
 
static wave preview_matrix_file (string filename)
 load the preview of a Matrix data file More...
 
static variable initStruct (errorCode *errorCode)
 from matrixfilereader help More...
 
variable mtrx_load_all ()
 load all data from a Matrix data file. More...
 
variable mtrx_parse_filename (string fileName, string *resultFile, variable *runCycle, variable *scanCycle, string *channel)
 parse matrix file names More...
 
string mtrx_split_filename (string fileName, string *prefix, string *datepart, string *timepart)
 split a matrix filename and return the first three parts More...
 
dfr mtrx_create_folder (string fileName, dfref df_base=defaultValue)
 create or look up a data folder based on a matrix file name. More...
 
dfr mtrx_get_cycle_folder (dfref df_base=defaultValue, variable runCycle=defaultValue, variable scanCycle=defaultValue)
 create a data folder for bricklet data. More...
 
variable mtrx_file_brickletID (string resultFile, variable runCycle, variable scanCycle, string channel)
 find out bricklet ID of a file More...
 
variable mtrx_open_file (string pathName, string fileNameOrPath)
 open a matrix result or data file More...
 
string mtrx_load_preview (string destName, string pathName, string fileName, string traces=defaultValue)
 load a preview image from a Matrix data file. More...
 
string mtrx_load_file (string pathName, string fileName, string traces=defaultValue)
 load all data from a Matrix data file. More...
 
variable mtrx_scale_dataset (wave data)
 
string mtrx_load_info (string APathName, string AFileName)
 load descriptive info from a Matrix data file. More...
 
variable subtract_line_bg (wave img)
 remove linear background line-by-line More...
 
+ + + + + + + +

+Variables

static const string package_name = "pearl_matrix_import"
 
static const string package_path = "root:packages:pearl_matrix_import:"
 
static const string ks_filematch_mtrx = "*_mtrx"
 
+

Detailed Description

+

data file import for omicron matrix (STM) files

+

the matrix file import requires the matrix file reader XOP by thomas braun (http://www.igorexchange.com/project/matrixFileReader) which in turn requires an installation of vernissage by omicron nanotechnology.

+
Warning
EXPERIMENTAL the matrix import module and its interface may change radically in future revisions!
+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-matrix-import.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable AfterFileOpenHook (variable refNum,
string file,
string pathName,
string type,
string creator,
variable kind 
)
+
+static
+
+ +

initialize the package and reload preferences after an experiment is loaded.

+ +

Definition at line 85 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static variable BeforeFileOpenHook (variable refNum,
string fileName,
string path,
string type,
string creator,
variable kind 
)
+
+static
+
+ +

open a matrix file that was dropped into Igor.

+

preliminary implementation. this should rather load the entire file and display a preview. graph windows should be reused by subsequent loads. also decide on a data saving location.

+ +

Definition at line 102 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable check_package_folder ()
+
+static
+
+ +

check that the package data folder exists

+

initialize the package if the folder does not exist.

+ +

Definition at line 72 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static variable init_package ()
+
+static
+
+ +

initialize the package data folder.

+ +

Definition at line 45 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static variable initStruct (errorCodeerrorCode)
+
+static
+
+ +

from matrixfilereader help

+ +

Definition at line 212 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string matrix_format_elog_message (wave metadata)
+
+ +

generate elog message from bricklet metadata

+
Parameters
+ + +
metadatatwo-column text wave
+
+
+ +

Definition at line 120 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable matrix_preview_2d (wave data,
wave metadata 
)
+
+ +

Definition at line 145 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
dfr mtrx_create_folder (string fileName,
dfref df_base = defaultValue 
)
+
+ +

create or look up a data folder based on a matrix file name.

+

the name of the folder is mtrx_date_time, where date and time are parsed from the file name. for this to work, the file name must consist of at least three parts that are separated by dash or underscore. the second (third) part contains the date (time). date and time are copied as strings.

+

if the data folder exists, a reference to the existing folder is returned.

+
Parameters
+ + + +
fileNamename of the result or data file.
df_base(optional) base data folder. default: current folder.
+
+
+
Returns
reference of the newly created or existing data folder.
+ +

Definition at line 360 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable mtrx_file_brickletID (string resultFile,
variable runCycle,
variable scanCycle,
string channel 
)
+
+ +

find out bricklet ID of a file

+
Warning
EXPERIMENTAL the code of this function is inefficient. the function may be removed in a later version.
+
Parameters
+ + + + + +
resultFilebase name of result file without chain link number and extension. as returned by mtrx_parse_filename.
runCyclerequested run cycle. 0 = first available.
scanCyclerequested scan cycle. 0 = first available.
channelchannel name. for example: "I", "Z", "Aux(V)", etc. empty string: first available.
+
+
+
Returns
bricklet ID, or -1 if an error occurred.
+ +

Definition at line 461 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
dfr mtrx_get_cycle_folder (dfref df_base = defaultValue,
variable runCycle = defaultValue,
variable scanCycle = defaultValue 
)
+
+ +

create a data folder for bricklet data.

+

the name of the folder is, for example "r23s2" where the first (second) number is the run (scan) cycle. run cycle and scan cycle numbers are taken from the open matrix file unless overridden by optional arguments.

+

if the data folder exists, a reference to the existing folder is returned. if one of the run or scan cycle numbers is lower than 1, the base folder is returned.

+
Parameters
+ + + + +
df_base(optional) base data folder. default: current folder.
runCycle(optional) run cycle number. must be >= 1. default: from last mtrx_open_file call.
scanCycle(optional) scan cycle number. must be >= 1. default: from last mtrx_open_file call.
+
+
+
Returns
reference of the newly created or existing data folder.
+ +

Definition at line 405 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable mtrx_load_all ()
+
+ +

load all data from a Matrix data file.

+ +

Definition at line 231 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
string mtrx_load_file (string pathName,
string fileName,
string traces = defaultValue 
)
+
+ +

load all data from a Matrix data file.

+

the data wave is loaded into a sub-subfolder the current data folder. the relative path has the format ":mtrx_{date}_{time}:r{run_cycle}s{scan_cycle}", where the parameters {date}, {time}, {run_cycle} and {scan_cycle} are copied from the file name. the file name must be formatted according to the specifications set out below.

+
Parameters
+ + + + +
pathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
fileNameif empty a dialog box shows up the file name must adhere to the format "{prefix}-{date}-{time}-{anything}--{run_cycle}_{scan_cycle}.{extension}". the first three seperators can alternatively be underscores. it may be necessary to change the configuration of the Matrix application.
traces(currently not used) semicolon-separated list of preferred traces. the items of the list are match strings for the Igor StringMatch function. only matching traces are loaded from the file. default: "*Up;*Down;*ReUp;*ReDown;"
+
+
+
Returns
semicolon-separated list of loaded waves including partial path from current data folder.
+ +

Definition at line 767 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string mtrx_load_info (string APathName,
string AFileName 
)
+
+ +

load descriptive info from a Matrix data file.

+

the info string lists the following information for each scan contained in the file:

    +
  • path of the scan group inside the file.
  • +
  • number of scan positions.
  • +
  • dataset names of scan positioners.
  • +
  • dataset names of detectors.
  • +
+
Parameters
+ + + +
APathNameigor symbolic path name. can be empty if the path is specified in AFileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
+
+
+
Returns
newline terminated string.
+ +

Definition at line 863 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string mtrx_load_preview (string destName,
string pathName,
string fileName,
string traces = defaultValue 
)
+
+ +

load a preview image from a Matrix data file.

+

the data wave is loaded into the current data folder.

+
Parameters
+ + + + + +
destNamedestination wave name. the wave is created in the current data folder.
pathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
fileNameif empty a dialog box shows up the file name must adhere to the format "{prefix}-{date}-{time}-{anything}--{run_cycle}_{scan_cycle}.{extension}". the first three seperators can alternatively be underscores. it may be necessary to change the configuration of the Matrix application.
traces(currently not used) semicolon-separated list of preferred traces. the items of the list are match strings for the Igor StringMatch function. only the first matching trace is loaded from the file. default: "*Up;*Down;*ReUp;*ReDown;"
+
+
+
Returns
semicolon-separated list of loaded waves including partial path from current data folder.
+ +

Definition at line 682 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable mtrx_open_file (string pathName,
string fileNameOrPath 
)
+
+ +

open a matrix result or data file

+

this function opens a matrix result file (.mtrx) or data file (.*_mtrx).

+

if a data file is selected, the function locates the corresponding result file, opens it, and looks up the bricklet ID of the data file. if a result file is selected, the function opens it but does not look up bricklet IDs.

+

the result file remains open and can be accessed using the mtrx_ functions or MFR_ operations. once a result file is open, you can easily access any bricklets linked to it, i.e., any run cycle, scan cycle, and channel.

+

the function stores information about the opened file in a global package data folder. if the same result file is opened again later, the information is reused and the file not read again. this may cause problems if the file has been modified in the meantime, or if the cached data become corrupt for some reason. the function detects if a data file is not linked in the open result file, and updates the cache. in other situations it may be necessary to force a reload.

+
Todo:
fix possible cache issues, add an option to override the cache.
+
Parameters
+ + + +
pathNameigor path name or empty string.
fileNamefile name, with or without path, or empty string.
+
+
+
Returns
file type
    +
  • 0 result file (logbook)
  • +
  • 1 result data file (bricklet)
  • +
  • -1 error, no data loaded
  • +
  • -2 matrixfilereader.xop not installed
  • +
+
+ +

Definition at line 545 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable mtrx_parse_filename (string fileName,
string * resultFile,
variable * runCycle,
variable * scanCycle,
string * channel 
)
+
+ +

parse matrix file names

+

parse matrix file names for result name, run cycle, scan cycle, and channel.

+
Parameters
+ + + + + + +
fileNamematrix result or data file name (without path).
resultFile(out) base name of the result file. append "_%04u.mtrx" to get the actual result file. we do not know the chain link number at this stage.
runCycle(out) run cycle number. necessary to look up the bricklet ID.
scanCycle(out) scan cycle number. necessary to look up the bricklet ID.
channel(out) channel name.
+
+
+
Returns
file type
    +
  • 0 result file (logbook)
  • +
  • 1 result data file (bricklet)
  • +
+result file names look like: default_2015Apr20-124353_STM-STM_AtomManipulation_0001.mtrx, default_2015Apr20-124353_STM-STM_AtomManipulation_0002.mtrx, etc. the function returns the first part up to the experiment name ("AtomManipulation" in the examples). all other return values set to defaults and must not be regarded.
+

result data files look like: default_2015Apr20-124353_STM-STM_AtomManipulation–136_1.Aux1(V)_mtrx, default_2015Apr20-124353_STM-STM_AtomManipulation–136_1.I(V)_mtrx, default_2015Apr20-124353_STM-STM_AtomManipulation–14_1.I_mtrx, default_2015Apr20-124353_STM-STM_AtomManipulation–14_1.Z_mtrx, etc. the function returns all results as described in the parameter list.

+ +

Definition at line 294 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable mtrx_scale_dataset (wave data)
+
+ +

Definition at line 829 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string mtrx_split_filename (string fileName,
string * prefix,
string * datepart,
string * timepart 
)
+
+ +

split a matrix filename and return the first three parts

+

we assume that the second (third) part contains the date (time). the parts are separated by dash or underscore.

+ +

Definition at line 332 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static wave preview_matrix_file (string filename)
+
+static
+
+ +

load the preview of a Matrix data file

+

the preview is loaded to the preview_image wave in the pearl_explorer data folder.

+

the s_file_info string is updated with information about the scan dimensions.

+
Parameters
+ + +
filenamename of a file in the directory specified by the pearl_explorer_filepath path object.
+
+
+
Returns
wave reference of the preview image
+ +

Definition at line 170 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable subtract_line_bg (wave img)
+
+ +

remove linear background line-by-line

+ +

Definition at line 886 of file pearl-matrix-import.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + + +
+ + + + +
const string ks_filematch_mtrx = "*_mtrx"
+
+static
+
+ +

Definition at line 40 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_name = "pearl_matrix_import"
+
+static
+
+ +

Definition at line 37 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const string package_path = "root:packages:pearl_matrix_import:"
+
+static
+
+ +

Definition at line 38 of file pearl-matrix-import.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-matrix-import_8ipf.js b/doc/html/pearl-matrix-import_8ipf.js new file mode 100644 index 0000000..9296999 --- /dev/null +++ b/doc/html/pearl-matrix-import_8ipf.js @@ -0,0 +1,27 @@ +var pearl_matrix_import_8ipf = +[ + [ "errorCode", "structerror_code.html", "structerror_code" ], + [ "AfterFileOpenHook", "pearl-matrix-import_8ipf.html#a3f524f5190341d2accc8cb8c3ed2ceb5", null ], + [ "BeforeFileOpenHook", "pearl-matrix-import_8ipf.html#ae2cfa1ac6651cfc3fb0dfce03494995b", null ], + [ "check_package_folder", "pearl-matrix-import_8ipf.html#ac7790f06151821678a65ab0065a5323e", null ], + [ "init_package", "pearl-matrix-import_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725", null ], + [ "initStruct", "pearl-matrix-import_8ipf.html#af0eaec901e06ce59250eb434539a0f6c", null ], + [ "matrix_format_elog_message", "pearl-matrix-import_8ipf.html#a81b1d81261a32d0ed4cf79b81487f1b4", null ], + [ "matrix_preview_2d", "pearl-matrix-import_8ipf.html#a856478705a78e8105ea5d91a2228975b", null ], + [ "mtrx_create_folder", "pearl-matrix-import_8ipf.html#a893405a122fdf70429f4f75b8877ed7d", null ], + [ "mtrx_file_brickletID", "pearl-matrix-import_8ipf.html#ad74d5afa71179728a9237d1ec5884482", null ], + [ "mtrx_get_cycle_folder", "pearl-matrix-import_8ipf.html#a1a46b042e41daffee61706ab2cf54351", null ], + [ "mtrx_load_all", "pearl-matrix-import_8ipf.html#a6ac0c685976b0e0c1944fb616a4f3a3c", null ], + [ "mtrx_load_file", "pearl-matrix-import_8ipf.html#a6aeef317fd468c88c99a274338c70ae3", null ], + [ "mtrx_load_info", "pearl-matrix-import_8ipf.html#a3a0ba4a7ad64739303b705d92be53267", null ], + [ "mtrx_load_preview", "pearl-matrix-import_8ipf.html#abd09594d22038853e1e8021e0f36363d", null ], + [ "mtrx_open_file", "pearl-matrix-import_8ipf.html#a59e72c849f4314aaa8339fd899665d85", null ], + [ "mtrx_parse_filename", "pearl-matrix-import_8ipf.html#a4bfeaf81ac483df0a38b26b6a8cf74a6", null ], + [ "mtrx_scale_dataset", "pearl-matrix-import_8ipf.html#ad8532f1473f92539fe88217d5d6e3368", null ], + [ "mtrx_split_filename", "pearl-matrix-import_8ipf.html#a0dc1efa23739e10b7558543b166e95b9", null ], + [ "preview_matrix_file", "pearl-matrix-import_8ipf.html#a8acd2b03343ef9bdfecaa75e831392d1", null ], + [ "subtract_line_bg", "pearl-matrix-import_8ipf.html#ab80101bc780dcbe94200e2446bce51d9", null ], + [ "ks_filematch_mtrx", "pearl-matrix-import_8ipf.html#ad720655ff881ddecae2e1b8afed58fa0", null ], + [ "package_name", "pearl-matrix-import_8ipf.html#aca457d1f4414d20a911254b1de13ebbb", null ], + [ "package_path", "pearl-matrix-import_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-matrix-import_8ipf_source.html b/doc/html/pearl-matrix-import_8ipf_source.html new file mode 100644 index 0000000..af0f5ee --- /dev/null +++ b/doc/html/pearl-matrix-import_8ipf_source.html @@ -0,0 +1,156 @@ + + + + + + +PEARL Procedures: pearl-matrix-import.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-matrix-import.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3
2 #pragma version = 1.00
3 #pragma IgorVersion = 6.36
4 #pragma ModuleName = PearlMatrixImport
5 
6 // author: matthias.muntwiler@psi.ch
7 // Copyright (c) 2016 Paul Scherrer Institut
8 
9 // Licensed under the Apache License, Version 2.0 (the "License");
10 // you may not use this file except in compliance with the License.
11 // You may obtain a copy of the License at
12 // http://www.apache.org/licenses/LICENSE-2.0
13 
31 
36 
37 static const string package_name = "pearl_matrix_import";
38 static const string package_path = "root:packages:pearl_matrix_import:";
39 
40 static const string ks_filematch_mtrx = "*_mtrx";
41 
45 static variable init_package(){
46 
47  dfref savedf = getdatafolderdfr()
48 
49  setdatafolder root:
50  newdatafolder /o/s packages
51  newdatafolder /o/s $package_name
52 
53  variable /g loglevel = 3
54  string /g dataFilePath = ""
55  string /g resultFilePath = ""
56  variable /g runCycle = 0
57  variable /g scanCycle = 0
58  string /g channelName = ""
59  variable /g brickletID = 0
60  variable /g V_MatrixFileReaderOverwrite = 1
61  variable /g V_MatrixFileReaderFolder = 0
62  variable /g V_MatrixFileReaderDouble = 0
63 
64  setdatafolder savedf
65  return 0
66 };
67 
72 static variable check_package_folder(){
73  dfref df_pack = $(package_path)
74  if (DataFolderRefStatus(df_pack))
75  svar /sdfr=df_pack /z resultFilePath
76  if (!svar_exists(resultFilePath))
77  init_package()
78  endif
79  else
80  init_package()
81  endif
82 };
83 
85 static variable AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind){
86  Variable refNum,kind
87  String file,pathName,type,creator
88  if( (kind >= 1) && (kind <= 2))
89  init_package()
90  //load_prefs()
91  endif
92  return 0
93 };
94 
102 static variable BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind){
103  Variable refNum,kind
104  String fileName,path,type,creator
105 
106  Variable handledOpen = 0
107  if (StringMatch(fileName, ks_filematch_mtrx))
108  setdatafolder root:
109  newdatafolder /o /s matrix
110  mtrx_load_preview("matrix", path, fileName)
111  handledOpen = 1
112  endif
113  return handledOpen
114 };
115 
120 string matrix_format_elog_message(wave metadata){
121  wave /t metadata
122 
123  string key
124  string value
125  variable nkeys = dimsize(metadata, 0)
126  variable ikey
127  string message_keys
128  message_keys = "resultFileName;sampleName;channelName;"
129  message_keys += "XYScanner.Points.value;XYScanner.Raster_Time.value;XYScanner.Raster_Time.unit;XYScanner.Width.value;XYScanner.Width.unit;XYScanner.Height.value;XYScanner.Height.unit;"
130  message_keys += "GapVoltageControl.Voltage.value;GapVoltageControl.Voltage.unit;"
131  message_keys += "Regulator.Loop_Gain_1_I.value;Regulator.Loop_Gain_1_I.unit;Regulator.Setpoint_1.value;Regulator.Setpoint_1.unit;"
132  message_keys += "Spectroscopy.Device_1_Start.value;Spectroscopy.Device_1_Start.unit;Spectroscopy.Spectroscopy_Mode.value;"
133  string message
134 
135  message_keys = ""
136  for (ikey = 0; ikey < nkeys; ikey += 1)
137  key = metadata[ikey][0]
138  value = metadata[ikey][1]
139  if (WhichListItem(key, message_keys) >= 0)
140  message += key + " = " + value + "\r"
141  endif
142  endfor
143 };
144 
145 variable matrix_preview_2d(wave data, wave metadata){
146  wave data
147  wave /t metadata
148 
149  Display
150  AppendImage data
151  ModifyImage data ctab= {*,*,Mud,0}
152  ModifyGraph margin(left)=30,margin(bottom)=30,margin(top)=5,margin(right)=5,height={Plan,1,left,bottom}
153  ModifyGraph mirror=2
154  ModifyGraph nticks=3
155  ModifyGraph axThick=0.5
156  ModifyGraph btLen=4
157 
158 };
159 
170 static wave preview_matrix_file(string filename){
171  string filename
172 
173  dfref saveDF = GetDataFolderDFR()
174  setdatafolder $package_path
175  svar s_preview_file
176  svar s_preview_source
177  mtrx_load_preview("preview_image", "pearl_explorer_filepath", filename)
178  s_preview_file = filename
179  s_preview_source = ""
180  wave /z preview_image
181 
182  svar /z s_file_info
183  if (! svar_exists(s_file_info))
184  string /g s_file_info
185  endif
186  if (strlen(s_preview_file) > 0)
187  s_file_info = mtrx_load_info("pearl_explorer_filepath", filename)
188  else
189  s_file_info = ""
190  endif
191 
192  setdatafolder saveDF
193  return preview_image
194 };
195 
197 struct errorCode{;
198  int32 SUCCESS;
208  int32 WAVE_EXIST;
209 };
210 
212 static variable initStruct(errorCode* errorCode){
213  Struct errorCode &errorCode
214 
215  errorCode.SUCCESS =0
216  errorCode.UNKNOWN_ERROR=10001
217  errorCode.ALREADY_FILE_OPEN=10002
218  errorCode.EMPTY_RESULTFILE=10004
219  errorCode.FILE_NOT_READABLE=10008
220  errorCode.NO_NEW_BRICKLETS=10016
221  errorCode.WRONG_PARAMETER=10032
222  errorCode.INTERNAL_ERROR_CONVERTING_DATA=10064
223  errorCode.NO_FILE_OPEN=10128
224  errorCode.INVALID_RANGE=10256
225  errorCode.WAVE_EXIST=10512
226 
227 };
228 
231 variable mtrx_load_all(){
232 
233  struct errorCode errorCode
234  initStruct(errorCode)
235 
236 #if exists("MFR_OpenResultFile")
237  MFR_OpenResultFile
238  if(V_flag != errorCode.SUCCESS)
239  MFR_GetXOPErrorMessage
240  return -1
241  endif
242 
243  MFR_GetBrickletData
244  if(V_flag != errorCode.SUCCESS)
245  MFR_GetXOPErrorMessage
246  return -1
247  endif
248 
249  MFR_GetBrickletMetaData
250  if(V_flag != errorCode.SUCCESS)
251  MFR_GetXOPErrorMessage
252  return -1
253  endif
254 
255  return 0
256 #else
257  return -1
258 #endif
259 };
260 
294 variable mtrx_parse_filename(string fileName, string* resultFile, variable* runCycle, variable* scanCycle, string* channel){
295  string fileName
296  string &resultFile
297  variable &runCycle
298  variable &scanCycle
299  string &channel
300 
301  variable fileType = 0
302  resultFile = ""
303  channel = ""
304  runCycle = 0
305  scanCycle = 0
306 
307  string regexp = ""
308  string index1 = ""
309  string index2 = ""
310  string extension = ""
311 
312  if (StringMatch(fileName, "*.mtrx"))
313  regexp = "(.+)_([[:digit:]]+)\.(.+)"
314  SplitString /E=regexp fileName, resultFile, index1, extension
315  fileType = 0
316  else
317  regexp = "(.+)--([[:digit:]]+)_([[:digit:]]+)\.((.+)_mtrx)"
318  SplitString /E=regexp fileName, resultFile, index1, index2, extension, channel
319  fileType = 1
320  runCycle = str2num(index1)
321  scanCycle = str2num(index2)
322  endif
323 
324  return fileType
325 };
326 
332 string mtrx_split_filename(string fileName, string* prefix, string* datepart, string* timepart){
333  string fileName
334  string &prefix
335  string &datepart
336  string &timepart
337 
338  string regexp
339  regexp = "([[:alpha:][:digit:]]+)[-_]([[:alpha:][:digit:]]+)[-_]([[:alpha:][:digit:]]+)[-_].+"
340  SplitString /E=regexp fileName, prefix, datepart, timepart
341  return datepart
342 };
343 
360 dfr mtrx_create_folder(string fileName, dfref df_base = defaultValue){
361  string fileName
362  dfref df_base
363 
364  if (ParamIsDefault(df_base))
365  df_base = GetDataFolderDFR()
366  endif
367 
368  string prefix
369  string datepart
370  string timepart
371  string folderName
372 
373  mtrx_split_filename(fileName, prefix, datepart, timepart)
374  folderName = "mtrx_" + datepart + "_" + timepart
375  folderName = CleanupName(folderName, 0)
376 
377  dfref df_save = GetDataFolderDFR()
378  setdatafolder root:
379  newdatafolder /o /s $foldername
380  dfref df = GetDataFolderDFR()
381 
382  setdatafolder df_save
383  return df
384 };
385 
405 dfr mtrx_get_cycle_folder(dfref df_base = defaultValue, variable runCycle = defaultValue, variable scanCycle = defaultValue){
406  dfref df_base
407  variable runCycle
408  variable scanCycle
409 
410  dfref df_save = GetDataFolderDFR()
411  dfref df_pack = $(package_path)
412  if (ParamIsDefault(df_base))
413  df_base = GetDataFolderDFR()
414  endif
415  if (ParamIsDefault(runCycle))
416  nvar /sdfr=df_pack defRunCycle = runCycle
417  runCycle = defRunCycle
418  endif
419  if (ParamIsDefault(scanCycle))
420  nvar /sdfr=df_pack defScanCycle = scanCycle
421  scanCycle = defScanCycle
422  endif
423 
424  string dfname
425  if ((runCycle >= 1) && (scanCycle >= 1))
426  sprintf dfname, "r%us%u", runCycle, scanCycle
427  setdatafolder df_base
428  dfref df = $dfname
429  if (DataFolderRefStatus(df) == 0)
430  newdatafolder $dfname
431  dfref df = $dfname
432  endif
433  else
434  dfref df = df_base
435  endif
436 
437  setdatafolder df_save
438  return df
439 };
440 
461 variable mtrx_file_brickletID(string resultFile, variable runCycle, variable scanCycle, string channel){
462  string resultFile
463  variable runCycle
464  variable scanCycle
465  string channel
466 
467  dfref df_overview = NewFreeDataFolder()
468  variable link = 1
469  variable id = -1
470  variable idx = 0
471 
472  string resultFileName
473 #if exists("MFR_OpenResultFile")
474  struct errorCode errorCode
475  initStruct(errorCode)
476  do
477  sprintf resultFileName, "%s_%04u.mtrx", resultFile, link
478  MFR_OpenResultFile /K resultFileName
479  if(V_flag != errorCode.SUCCESS)
480  return -1
481  endif
482  MFR_CreateOverviewTable /DEST=df_overview
483  // dimension labels are: brickletID, scanCycleCount, runCycleCount, sequenceID, dimension, channelName
484  wave /t /sdfr=df_overview overviewTable
485  make /n=(dimsize(overviewTable, 0)) /i /u /free runcycles, scancycles, ids, match
486  make /n=(dimsize(overviewTable, 0)) /t /free channels
487  ids = str2num(overviewtable[p][%brickletID])
488  if (runcycle > 0)
489  runcycles = str2num(overviewtable[p][%runCycleCount])
490  else
491  runcycles = runcycle
492  endif
493  if (scancycle > 0)
494  scancycles = str2num(overviewtable[p][%scanCycleCount])
495  else
496  scancycles = scancycle
497  endif
498  if (strlen(channel) > 0)
499  channels = overviewTable[p][%channelName]
500  else
501  channels = channel
502  endif
503  Extract /FREE ids, match_ids, (scancycles == scanCycle) && (runcycles == runCycle) && (cmpstr(channels, channel) == 0)
504  if (numpnts(match_ids) > 0)
505  id = match_ids[0]
506  else
507  link += 1
508  endif
509  while (id < 0)
510 #endif
511  return id
512 };
513 
545 variable mtrx_open_file(string pathName, string fileNameOrPath){
546  string pathName
547  string fileNameOrPath
548 
549  check_package_folder()
550  dfref df_save = GetDataFolderDFR()
551  dfref df_pack = $(package_path)
552  svar /sdfr=df_pack dataFilePath
553  svar /sdfr=df_pack resultFilePath
554  nvar /sdfr=df_pack runCycle
555  nvar /sdfr=df_pack scanCycle
556  svar /sdfr=df_pack channelName
557  nvar /sdfr=df_pack brickletID
558 
559  string loc_resultFileName
560  string loc_resultFilePath
561  variable loc_runCycle
562  variable loc_scanCycle
563  string loc_channelName
564 
565  // make sure we have a valid and complete file path
566  GetFileFolderInfo /P=$pathName /Q /Z=2 fileNameOrPath
567  string filePath
568  if ((v_flag == 0) && (v_isFile))
569  filePath = s_path
570  else
571  return -1
572  endif
573 
574  // get base file name
575  string fileName
576  string fileDir
577  string baseFileName
578  variable fileType
579  fileName = ParseFilePath(0, filePath, ":", 1, 0)
580  fileDir = ParseFilePath(1, filePath, ":", 1, 0)
581  fileType = mtrx_parse_filename(fileName, baseFileName, loc_runCycle, loc_scanCycle, loc_channelName)
582 
583  variable link = 1
584  variable id = -1
585  variable result = -1
586  variable using_cache = 0
587 
588  struct errorCode errorCode
589  initStruct(errorCode)
590  do
591  sprintf loc_resultFileName, "%s_%04u.mtrx", baseFileName, link
592  loc_resultFilePath = fileDir + loc_resultFileName
593 #if exists("MFR_OpenResultFile")
594  if ((strlen(resultFilePath) == 0) || (cmpstr(loc_resultFilePath, resultFilePath) != 0))
595  MFR_OpenResultFile /K loc_resultFilePath
596  if(V_flag != errorCode.SUCCESS)
597  MFR_GetXOPErrorMessage
598  result = -1
599  break
600  endif
601  resultFilePath = loc_resultFilePath
602  if (fileType == 1)
603  dataFilePath = filePath
604  else
605  dataFilePath = ""
606  endif
607  runCycle = 0
608  scanCycle = 0
609  channelName = ""
610  brickletID = 0
611  MFR_CreateOverviewTable /DEST=df_pack
612  if(V_flag != errorCode.SUCCESS)
613  MFR_GetXOPErrorMessage
614  result = -1
615  break
616  endif
617  using_cache = 0
618  else
619  using_cache = 1
620  endif
621 #else
622  print "matrixfilereader.xop not installed"
623  result = -2
624  break
625 #endif
626  // dimension labels are: brickletID, scanCycleCount, runCycleCount, sequenceID, dimension, channelName
627  wave /t /sdfr=df_pack overviewTable
628  make /n=(dimsize(overviewTable, 0)) /i /u /o df_pack:runCycles, df_pack:scanCycles, df_pack:ids
629  make /n=(dimsize(overviewTable, 0)) /t /o df_pack:channels
630  wave /sdfr=df_pack ids, runCycles, scanCycles
631  wave /t /sdfr=df_pack channels
632  ids = str2num(overviewtable[p][%brickletID])
633  runCycles = str2num(overviewtable[p][%runCycleCount])
634  scanCycles = str2num(overviewtable[p][%scanCycleCount])
635  channels = overviewTable[p][%channelName]
636  result = fileType
637 
638  // if a data file is opened, make sure we found the right result file
639  if ((loc_runCycle > 0) && (loc_scanCycle > 0))
640  Extract /FREE ids, match_ids, (runCycles == loc_runCycle) && (scanCycles == loc_scanCycle) && (cmpstr(channels, loc_channelName) == 0)
641  if (numpnts(match_ids) > 0)
642  id = match_ids[0]
643  runCycle = loc_runCycle
644  scanCycle = loc_scanCycle
645  channelName = loc_channelName
646  brickletID = id
647  break
648  else if (using_cache)
649  resultFilePath = ""
650  else
651  link += 1
652  endif
653  else
654  break
655  endif
656  while (id < 0)
657 
658  return result
659 };
660 
682 string mtrx_load_preview(string destName, string pathName, string fileName, string traces = defaultValue){
683  string destName
684  string pathName
685  string fileName
686  string traces
687 
688  if (ParamIsDefault(traces))
689  traces = "*Up;*Down;*ReUp;*ReDown;"
690  endif
691 
692  dfref df_save = GetDataFolderDFR()
693 
694  string datanames = ""
695  string datapaths = ""
696  variable filestatus = mtrx_open_file(pathName, fileName)
697  if (filestatus != 1)
698  return ""
699  endif
700 
701  dfref df_pack = $(package_path)
702  svar /sdfr=df_pack dataFilePath
703  svar /sdfr=df_pack resultFilePath
704  nvar /sdfr=df_pack runCycle
705  nvar /sdfr=df_pack scanCycle
706  svar /sdfr=df_pack channelName
707  nvar /sdfr=df_pack brickletID
708 
709 #if exists("MFR_OpenResultFile")
710  dfref df_data = df_save
711  variable /g df_data:V_MatrixFileReaderOverwrite = 1
712  variable /g df_data:V_MatrixFileReaderFolder = 0
713  variable /g df_data:V_MatrixFileReaderDouble = 0
714  struct errorCode errorCode
715  initStruct(errorCode)
716  MFR_GetBrickletData /N=destName /R=(brickletID) /S=2 /DEST=df_data
717  if(V_flag == errorCode.SUCCESS)
718  datanames = S_waveNames
719  variable i
720  variable n = ItemsInList(datanames)
721  string s
722  s = StringFromList(0, datanames)
723  wave data = $s
724  mtrx_scale_dataset(data)
725  if (WaveDims(data) == 2)
726  subtract_line_bg(data)
727  endif
728  datapaths = AddListItem(GetWavesDataFolder(data, 4), datapaths, ";", inf)
729  for (i = 1; i < n; i += 1)
730  s = StringFromList(i, datanames)
731  killwaves /z $s
732  endfor
733  else
734  MFR_GetXOPErrorMessage
735  endif
736  //MFR_GetBrickletMetaData /N=ANickName /R=(brickletID) // /DEST=dfref
737 #else
738  print "matrixfilereader.xop not installed"
739 #endif
740 
741  setdatafolder df_save
742  return datapaths
743 };
744 
767 string mtrx_load_file(string pathName, string fileName, string traces = defaultValue){
768  string pathName
769  string fileName
770  string traces
771 
772  if (ParamIsDefault(traces))
773  traces = "*Up;*Down;*ReUp;*ReDown;"
774  endif
775 
776  dfref df_save = GetDataFolderDFR()
777 
778  string datanames = ""
779  string datapaths = ""
780  variable filestatus = mtrx_open_file(pathName, fileName)
781  if (filestatus != 1)
782  return ""
783  endif
784 
785  dfref df_pack = $(package_path)
786  svar /sdfr=df_pack dataFilePath
787  svar /sdfr=df_pack resultFilePath
788  nvar /sdfr=df_pack runCycle
789  nvar /sdfr=df_pack scanCycle
790  svar /sdfr=df_pack channelName
791  nvar /sdfr=df_pack brickletID
792 
793 #if exists("MFR_OpenResultFile")
794  string resultFileName = ParseFilePath(0, resultFilePath, ":", 1, 0)
795  dfref df_result = mtrx_create_folder(resultFileName, df_base=df_save)
796  dfref df_data = mtrx_get_cycle_folder(df_base = df_result)
797  variable /g df_data:V_MatrixFileReaderOverwrite = 1
798  variable /g df_data:V_MatrixFileReaderFolder = 0
799  variable /g df_data:V_MatrixFileReaderDouble = 0
800 
801  struct errorCode errorCode
802  initStruct(errorCode)
803  string name
804  name = CleanupName(channelName, 0)
805  MFR_GetBrickletData /N=name /R=(brickletID) /DEST=df_data
806  if(V_flag == errorCode.SUCCESS)
807  datanames = S_waveNames
808  variable i
809  variable n = ItemsInList(datanames)
810  string s
811  for (i = 0; i < n; i += 1)
812  s = StringFromList(i, datanames)
813  wave /sdfr=df_data data = $s
814  mtrx_scale_dataset(data)
815  datapaths = AddListItem(GetWavesDataFolder(data, 4), datapaths, ";", inf)
816  endfor
817  else
818  MFR_GetXOPErrorMessage
819  endif
820  //MFR_GetBrickletMetaData /N=ANickName /R=(brickletID) // /DEST=dfref
821 #else
822  print "matrixfilereader.xop not installed"
823 #endif
824 
825  setdatafolder df_save
826  return datapaths
827 };
828 
829 variable mtrx_scale_dataset(wave data){
830  wave data
831 
832  dfref df_pack = $(package_path)
833  nvar /sdfr=df_pack runCycle
834  nvar /sdfr=df_pack scanCycle
835  svar /sdfr=df_pack channelName
836  nvar /sdfr=df_pack brickletID
837 
838  string scanDir = StringFromList(2, NameOfWave(data), "_")
839  if (WaveDims(data) == 2)
840  Note data, "AxisLabelX=X"
841  Note data, "AxisLabelY=Y"
842  endif
843  Note data, "AxisLabelD=" + channelName
844  string title
845  sprintf title, "%u-%u %s %s", runCycle, scanCycle, channelName, scanDir
846  Note data, "Dataset=" + title
847 };
848 
863 string mtrx_load_info(string APathName, string AFileName){
864  string APathName
865  string AFileName
866 
867  dfref saveDF = GetDataFolderDFR()
868  dfref fileDF = NewFreeDataFolder()
869  setdatafolder fileDF
870 
871  variable fileID
872  string filepath
873  string scanpaths
874  variable nscans
875  variable iscan
876  string scanpath
877  string info = ""
878 
879 
880  setdatafolder saveDF
881  return info
882 };
883 
886 variable subtract_line_bg(wave img){
887  wave img
888 
889  variable nx = dimsize(img, 0)
890  variable ny = dimsize(img, 1)
891  variable iy
892  make /n=(nx) /free line, fit
893  for (iy = 0; iy < ny; iy += 1)
894  line = img[p][iy]
895  if (numtype(sum(line)) == 0)
896  CurveFit /N /Q /NTHR=0 line line /D=fit
897  img[][iy] = line[p] - fit[p]
898  endif
899  endfor
900 };
901 
static const string package_path
+
dfr mtrx_create_folder(string fileName, dfref df_base=defaultValue)
create or look up a data folder based on a matrix file name.
+
variable mtrx_file_brickletID(string resultFile, variable runCycle, variable scanCycle, string channel)
find out bricklet ID of a file
+
static variable initStruct(errorCode *errorCode)
from matrixfilereader help
+ +
string mtrx_split_filename(string fileName, string *prefix, string *datepart, string *timepart)
split a matrix filename and return the first three parts
+ +
variable matrix_preview_2d(wave data, wave metadata)
+
static wave preview_matrix_file(string filename)
load the preview of a Matrix data file
+
int32 INTERNAL_ERROR_CONVERTING_DATA
+
string mtrx_load_info(string APathName, string AFileName)
load descriptive info from a Matrix data file.
+
string matrix_format_elog_message(wave metadata)
generate elog message from bricklet metadata
+
from matrixfilereader help
+
variable mtrx_load_all()
load all data from a Matrix data file.
+ +
static const string ks_filematch_mtrx
+ + + +
static variable AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind)
initialize the package and reload preferences after an experiment is loaded.
+ +
dfr mtrx_get_cycle_folder(dfref df_base=defaultValue, variable runCycle=defaultValue, variable scanCycle=defaultValue)
create a data folder for bricklet data.
+ +
static variable init_package()
initialize the package data folder.
+
variable mtrx_parse_filename(string fileName, string *resultFile, variable *runCycle, variable *scanCycle, string *channel)
parse matrix file names
+
string mtrx_load_preview(string destName, string pathName, string fileName, string traces=defaultValue)
load a preview image from a Matrix data file.
+
static variable BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind)
open a matrix file that was dropped into Igor.
+
static const string package_name
+ + +
static variable check_package_folder()
check that the package data folder exists
+
+
+ + + + diff --git a/doc/html/pearl-menu_8ipf.html b/doc/html/pearl-menu_8ipf.html new file mode 100644 index 0000000..b8a2a43 --- /dev/null +++ b/doc/html/pearl-menu_8ipf.html @@ -0,0 +1,334 @@ + + + + + + +PEARL Procedures: pearl-menu.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-menu.ipf File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + +

+Functions

string PearlMenuEnableFunc (string funcname)
 
variable LoadPearlOptics ()
 
variable LoadPearlArpes ()
 
variable LoadPearlPreparation ()
 
variable Display2dProfiles ()
 
variable Display3dSlicer ()
 
variable DisplayGizmoSlicer ()
 
variable PearlLiveDisplay (string epicsname, string nickname, string wbRGB)
 
variable PearlAnglescanTracker (string epicsname, string wbRGB)
 
+

Function Documentation

+ +
+
+ + + + + + + +
variable Display2dProfiles ()
+
+ +

Definition at line 108 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable Display3dSlicer ()
+
+ +

Definition at line 125 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable DisplayGizmoSlicer ()
+
+ +

Definition at line 144 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable LoadPearlArpes ()
+
+ +

Definition at line 96 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable LoadPearlOptics ()
+
+ +

Definition at line 89 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable LoadPearlPreparation ()
+
+ +

Definition at line 102 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable PearlAnglescanTracker (string epicsname,
string wbRGB 
)
+
+ +

Definition at line 182 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable PearlLiveDisplay (string epicsname,
string nickname,
string wbRGB 
)
+
+ +

Definition at line 163 of file pearl-menu.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string PearlMenuEnableFunc (string funcname)
+
+ +

Definition at line 77 of file pearl-menu.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-menu_8ipf.js b/doc/html/pearl-menu_8ipf.js new file mode 100644 index 0000000..cea017f --- /dev/null +++ b/doc/html/pearl-menu_8ipf.js @@ -0,0 +1,12 @@ +var pearl_menu_8ipf = +[ + [ "Display2dProfiles", "pearl-menu_8ipf.html#aad7d768680c6d8a9b8a7025c7e1ec75d", null ], + [ "Display3dSlicer", "pearl-menu_8ipf.html#ac73a94f760455f19294a9f917b43f145", null ], + [ "DisplayGizmoSlicer", "pearl-menu_8ipf.html#aab34952c2f3b36f9ee8619eb901ff581", null ], + [ "LoadPearlArpes", "pearl-menu_8ipf.html#aa70ef420d6fe0f6a433cd2371fc4a03d", null ], + [ "LoadPearlOptics", "pearl-menu_8ipf.html#af6c9740540c6242eb7bf57fc49de82ab", null ], + [ "LoadPearlPreparation", "pearl-menu_8ipf.html#a3658ae687e12987fa1d70636849a060f", null ], + [ "PearlAnglescanTracker", "pearl-menu_8ipf.html#a74bc5da7843ee6c25f2d9c93d22a6ffa", null ], + [ "PearlLiveDisplay", "pearl-menu_8ipf.html#a61ded60be72959b00f22842afa37c56f", null ], + [ "PearlMenuEnableFunc", "pearl-menu_8ipf.html#a3404a53bf13a01c1e811d1af6c35b726", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-menu_8ipf_source.html b/doc/html/pearl-menu_8ipf_source.html new file mode 100644 index 0000000..af544c9 --- /dev/null +++ b/doc/html/pearl-menu_8ipf_source.html @@ -0,0 +1,134 @@ + + + + + + +PEARL Procedures: pearl-menu.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-menu.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=1// Use modern global access method.
2 #pragma ModuleName = PearlMenu
3 #pragma version = 1.01
4 
5 // main menu for PEARL data acquisition and analysis packages
6 
7 // $Id$
8 // author: matthias.muntwiler@psi.ch
9 // Copyright (c) 2013-14 Paul Scherrer Institut
10 
11 // Licensed under the Apache License, Version 2.0 (the "License");
12 // you may not use this file except in compliance with the License.
13 // You may obtain a copy of the License at
14 // http://www.apache.org/licenses/LICENSE-2.0
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 string PearlMenuEnableFunc(string funcname){
78  // checks whether a function name exists
79  // and conditionally returns a prefix which disables the menu item
80  // if the function does not exist
81  string funcname
82  if (exists(funcname) >= 3)
83  return ""
84  else
85  return "("
86  endif
87 };
88 
89 variable LoadPearlOptics(){
90  execute /p/q/z "INSERTINCLUDE \"pearl-optics\""
91  execute /p/q/z "COMPILEPROCEDURES "
92  execute /p/q/z "PearlOpticsPanel#po_InitPanel()"
93  execute /p/q/z "BuildMenu \"PEARL\""
94 };
95 
96 variable LoadPearlArpes(){
97  execute /p/q/z "INSERTINCLUDE \"pearl-arpes\""
98  execute /p/q/z "COMPILEPROCEDURES "
99  execute /p/q/z "BuildMenu \"PEARL\""
100 };
101 
103  execute /p/q/z "INSERTINCLUDE \"pearl-preparation\""
104  execute /p/q/z "COMPILEPROCEDURES "
105  execute /p/q/z "BuildMenu \"PEARL\""
106 };
107 
108 variable Display2dProfiles(){
109  dfref dfBefore = GetDataFolderDFR()
110  Execute /q/z "CreateBrowser prompt=\"Select 2D wave\", showWaves=1, showVars=0, showStrs=0"
111  dfref dfAfter = GetDataFolderDFR()
112  SetDataFolder dfBefore
113 
114  SVAR list = S_BrowserList
115  NVAR flag = V_Flag
116 
117  if ((flag != 0) && (ItemsInList(list) >= 1))
118  string brickname = StringFromList(0, list)
119  string cmd
120  sprintf cmd, "ad_display_profiles(%s)", brickname
121  execute /q/z cmd
122  endif
123 };
124 
125 variable Display3dSlicer(){
126  dfref dfBefore = GetDataFolderDFR()
127  Execute /q/z "CreateBrowser prompt=\"Select 3D wave\", showWaves=1, showVars=0, showStrs=0"
128  dfref dfAfter = GetDataFolderDFR()
129  SetDataFolder dfBefore
130 
131  SVAR list = S_BrowserList
132  NVAR flag = V_Flag
133 
134  if ((flag != 0) && (ItemsInList(list) >= 1))
135  string brickname = StringFromList(0, list)
136  string cmd
137  sprintf cmd, "ad_display_slice(%s)", brickname
138  execute /q/z cmd
139  sprintf cmd, "ad_brick_slicer(%s)", brickname
140  execute /q/z cmd
141  endif
142 };
143 
145  dfref dfBefore = GetDataFolderDFR()
146  Execute /q/z "CreateBrowser prompt=\"Select 3D wave\", showWaves=1, showVars=0, showStrs=0"
147  dfref dfAfter = GetDataFolderDFR()
148  SetDataFolder dfBefore
149 
150  SVAR list = S_BrowserList
151  NVAR flag = V_Flag
152 
153  if ((flag != 0) && (ItemsInList(list) >= 1))
154  string brickname = StringFromList(0, list)
155  string cmd
156  sprintf cmd, "ad_display_brick(%s)", brickname
157  execute /q/z cmd
158  sprintf cmd, "ad_brick_slicer(%s)", brickname
159  execute /q/z cmd
160  endif
161 };
162 
163 variable PearlLiveDisplay(string epicsname, string nickname, string wbRGB){
164  string epicsname// base name of the detector, e.g. X03DA-SCIENTA:
165  // image1: and cam1: are appended by the function
166  // see ad_connect
167  string nickname// nick name under which this detector is referred to in Igor
168  // must be a valid data folder name
169  // see ad_connect
170  string wbRGB// window background color, e.g. "(32768,49152,55296)"
171  string cmd
172  sprintf cmd, "ad_connect(\"%s\", \"%s\")", epicsname, nickname
173  execute /q/z cmd
174  sprintf cmd, "ad_display_profiles(root:pearl_epics:%s:image)", nickname
175  execute /q/z cmd
176  sprintf cmd, "ModifyGraph wbRGB=%s", wbRGB
177  execute /q/z cmd
178  sprintf cmd, "add_roi_controls()"
179  execute /q/z cmd
180 };
181 
182 variable PearlAnglescanTracker(string epicsname, string wbRGB){
183  string epicsname// base name of the detector, e.g. X03DA-SCIENTA:
184  // image1: and cam1: are appended by the function
185  // see ast_setup
186  string wbRGB// window background color, e.g. "(32768,49152,55296)"
187  string cmd
188  sprintf cmd, "ast_setup()"
189  execute /q/z cmd
190  sprintf cmd, "ModifyGraph wbRGB=%s", wbRGB
191  execute /q/z cmd
192 };
193 
variable PearlLiveDisplay(string epicsname, string nickname, string wbRGB)
Definition: pearl-menu.ipf:163
+
variable DisplayGizmoSlicer()
Definition: pearl-menu.ipf:144
+
variable LoadPearlPreparation()
Definition: pearl-menu.ipf:102
+
variable PearlAnglescanTracker(string epicsname, string wbRGB)
Definition: pearl-menu.ipf:182
+
variable LoadPearlArpes()
Definition: pearl-menu.ipf:96
+
variable LoadPearlOptics()
Definition: pearl-menu.ipf:89
+
variable Display3dSlicer()
Definition: pearl-menu.ipf:125
+
string PearlMenuEnableFunc(string funcname)
Definition: pearl-menu.ipf:77
+
variable Display2dProfiles()
Definition: pearl-menu.ipf:108
+
+
+ + + + diff --git a/doc/html/pearl-otf-import_8ipf.html b/doc/html/pearl-otf-import_8ipf.html new file mode 100644 index 0000000..0bd786e --- /dev/null +++ b/doc/html/pearl-otf-import_8ipf.html @@ -0,0 +1,478 @@ + + + + + + +PEARL Procedures: pearl-otf-import.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-otf-import.ipf File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

variable otf_load_itx_all (string pathname)
 
variable otf_load_itx_match (string pathname, string matchstr)
 
variable otf_load_itx (string pathname, string filename)
 
variable otf_gather_iterator (dfref df, string *sdata)
 
variable otf_gather_batch (string ywavematch, string xwavematch, string destfolder)
 
variable gather_batch (string foldermatch, string ywavematch, string xwavematch, string destfolder)
 
variable otf_rename_folders_iterator (dfref df, string *sdata)
 
variable otf_rename_folders (string pattern, variable unique_index=defaultValue, string new_suffix=defaultValue, string match_str=defaultValue)
 
variable otf_interp (variable e1, variable e2, variable npts, variable smo)
 
variable otf_smo_int (wave win, wave wout, wave wpe, variable smo)
 
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable gather_batch (string foldermatch,
string ywavematch,
string xwavematch,
string destfolder 
)
+
+ +

Definition at line 162 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable otf_gather_batch (string ywavematch,
string xwavematch,
string destfolder 
)
+
+ +

Definition at line 152 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable otf_gather_iterator (dfref df,
string * sdata 
)
+
+ +

Definition at line 106 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable otf_interp (variable e1,
variable e2,
variable npts,
variable smo 
)
+
+ +

Definition at line 271 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable otf_load_itx (string pathname,
string filename 
)
+
+ +

Definition at line 76 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable otf_load_itx_all (string pathname)
+
+ +

Definition at line 31 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable otf_load_itx_match (string pathname,
string matchstr 
)
+
+ +

Definition at line 53 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable otf_rename_folders (string pattern,
variable unique_index = defaultValue,
string new_suffix = defaultValue,
string match_str = defaultValue 
)
+
+ +

Definition at line 231 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable otf_rename_folders_iterator (dfref df,
string * sdata 
)
+
+ +

Definition at line 185 of file pearl-otf-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable otf_smo_int (wave win,
wave wout,
wave wpe,
variable smo 
)
+
+ +

Definition at line 304 of file pearl-otf-import.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-otf-import_8ipf.js b/doc/html/pearl-otf-import_8ipf.js new file mode 100644 index 0000000..e7c3038 --- /dev/null +++ b/doc/html/pearl-otf-import_8ipf.js @@ -0,0 +1,13 @@ +var pearl_otf_import_8ipf = +[ + [ "gather_batch", "pearl-otf-import_8ipf.html#ae2640256d7d07c11b41621430279cef6", null ], + [ "otf_gather_batch", "pearl-otf-import_8ipf.html#ad2a83b85030a7d7769d434d6e2e9e557", null ], + [ "otf_gather_iterator", "pearl-otf-import_8ipf.html#a44078e1d8f26e515539acb96973fc630", null ], + [ "otf_interp", "pearl-otf-import_8ipf.html#abd8897317366046dfb97c6ca53813d18", null ], + [ "otf_load_itx", "pearl-otf-import_8ipf.html#a3632f8a5c0ee32a14a3e589b74a0c496", null ], + [ "otf_load_itx_all", "pearl-otf-import_8ipf.html#a603b71176ed838713ec555c440082e22", null ], + [ "otf_load_itx_match", "pearl-otf-import_8ipf.html#aa47fc4b956ee84a993b6d285b628fe20", null ], + [ "otf_rename_folders", "pearl-otf-import_8ipf.html#a715f9cf2d2b1ffb04f2f9a0e344a80ee", null ], + [ "otf_rename_folders_iterator", "pearl-otf-import_8ipf.html#a882da254075e8d89f0117e491af90df0", null ], + [ "otf_smo_int", "pearl-otf-import_8ipf.html#aba965b854836658aa00e3ec2b361d7c9", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-otf-import_8ipf_source.html b/doc/html/pearl-otf-import_8ipf_source.html new file mode 100644 index 0000000..765d3ac --- /dev/null +++ b/doc/html/pearl-otf-import_8ipf_source.html @@ -0,0 +1,136 @@ + + + + + + +PEARL Procedures: pearl-otf-import.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-otf-import.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=1// Use modern global access method.
2 #pragma IgorVersion = 6.1
3 #pragma ModuleName = PearlOtfImport
4 #pragma version = 1.01
5 
6 // procedures for importing on-the-fly (OTF) scans
7 // OTF scans are saved as ITX files
8 // matthias muntwiler, 2013-02-22
9 // $Id$
10 
11 // introduction
12 // the latest version of the PEARL OTF server saves data in igor text (ITX)
13 // the files contain code which saves all data from one file into one data folder with a unique name
14 // multiple files can be selected in the explorer and loaded by a double click
15 
16 // description
17 // OTF data folder names have the format otf_date_time_suffix, where only suffix is user-defined
18 // thus, raw data folder names are unique
19 // data folder names can be converted to a shorter format
20 // an OTF data folder contains a wave for each measured quantity (detector)
21 // and the IN, ID, IV, and IU waves for additional beamline parameters
22 // detector waves must have a wave note containing the following key=value pairs:
23 // PV=name of EPICS process variable
24 // PhysicalType=physical type of the quantity in the same way as used by pearl-optics-import
25 // Axis1=wave name of principal X axis
26 
27 // convergence
28 // while the file formats may be different, data files generated by the OTF and EPICS scan tools
29 // shall ultimately produce the same data structures in an Igor experiment
30 
31 variable otf_load_itx_all(string pathname){
32  // loads all OTF files from a given path
33  // this function is for older files (before 2013-03-01) which do not specify a destination data folder
34  // newer files can be loaded by double click from the explorer
35  // without the danger of overwriting data from other files
36  string pathname
37  string filename
38 
39  if (strlen(pathname) <= 0)
40  newpath /o/q otf_load_itx
41  pathname = "otf_load_itx"
42  endif
43  string filelist = IndexedFile($pathname, -1, ".itx")
44  filelist = ListMatch(filelist, "otf*.itx", ";")
45  variable nfile = ItemsInList(filelist, ";")
46  variable ifile
47  for (ifile = 0; ifile < nfile; ifile += 1)
48  filename = StringFromList(ifile, filelist, ";")
49  otf_load_itx(pathname, filename)
50  endfor
51 };
52 
53 variable otf_load_itx_match(string pathname, string matchstr){
54  // loads all OTF files from a given path whose names match a given string
55  // this function is for older files (before 2013-03-01) which do not specify a destination data folder
56  // newer files can be loaded by double click from the explorer
57  // without the danger of overwriting data from other files
58  string pathname
59  string matchstr
60  string filename
61 
62  if (strlen(pathname) <= 0)
63  newpath /o/q otf_load_itx
64  pathname = "otf_load_itx"
65  endif
66  string filelist = IndexedFile($pathname, -1, ".itx")
67  filelist = ListMatch(filelist, matchstr, ";")
68  variable nfile = ItemsInList(filelist, ";")
69  variable ifile
70  for (ifile = 0; ifile < nfile; ifile += 1)
71  filename = StringFromList(ifile, filelist, ";")
72  otf_load_itx(pathname, filename)
73  endfor
74 };
75 
76 variable otf_load_itx(string pathname, string filename){
77  // loads a specific OTF file
78  // this function is for older files (before 2013-03-01) which do not specify a destination data folder
79  // newer files can be loaded by double click from the explorer
80  // without the danger of overwriting data from other files
81  string pathname
82  string filename
83 
84  dfref savedf = GetDataFolderDFR()
85  setdatafolder root:
86 
87  newdatafolder /s/o otf_load_itx_temp
88  if (strlen(pathname) > 0)
89  LoadWave /O/P=$pathname/Q/T filename
90  else
91  LoadWave /O/Q/T filename
92  endif
93  if (v_flag)
94  string foldername
95  foldername = ParseFilePath(3, s_filename, "/", 0, 0)
96  foldername = foldername[0,16]
97  foldername = CleanupName(foldername, 0)
98  //foldername = UniqueName(foldername, 11, 0)
99  renamedatafolder root:otf_load_itx_temp, $foldername
100  printf "loaded otf data from file %s into folder %s\r", s_filename, foldername
101  endif
102 
103  setdatafolder savedf
104 };
105 
106 variable otf_gather_iterator(dfref df, string* sdata){
107  // data folder iterator used by otf_gather_batch
108  dfref df
109  string &sdata// key=value list of parameters
110  // xwavematch
111  // ywavematch
112  // destfolder
113 
114  string src_name
115  string dst_name
116  string src_folder
117  string dst_folder
118  string df_id
119  string prefix, sdate, stime
120 
121  setdatafolder df
122  src_folder = GetDataFolder(0, df)
123  sscanf src_folder, "%[^_]_%[0-9]_%[0-9]", prefix, sdate, stime
124  df_id = ""
125  if (strlen(sdate) > 0)
126  df_id += "_" + sdate
127  endif
128  if (strlen(stime) > 0)
129  df_id += "_" + stime
130  endif
131  dst_folder = StringByKey("destfolder", sdata)
132 
133  src_name = StringByKey("xwavematch", sdata)
134  src_name = WaveList(src_name, "", "")
135  if (ItemsInList(src_name) >= 1)
136  src_name = StringFromList(0, src_name)
137  dst_name = dst_folder + src_name + df_id
138  //print src_name, dst_name
139  duplicate $src_name, $dst_name
140  endif
141 
142  src_name = StringByKey("ywavematch", sdata)
143  src_name = WaveList(src_name, "", "")
144  if (ItemsInList(src_name) >= 1)
145  src_name = StringFromList(0, src_name)
146  dst_name = dst_folder + src_name + df_id
147  //print src_name, dst_name
148  duplicate $src_name, $dst_name
149  endif
150 };
151 
152 variable otf_gather_batch(string ywavematch, string xwavematch, string destfolder){
153  // gathers (copies) OTF datasets in one data folder
154  // can be used for example for the Igor batch curve fitting tool
155  string ywavematch// match string identifies the y wave to be copied
156  string xwavematch// match string identifies the x wave to be copied
157  string destfolder// name of the destination data folder. folder does not have to exist.
158 
159  return gather_batch("otf*", ywavematch, xwavematch, destfolder)
160 };
161 
162 variable gather_batch(string foldermatch, string ywavematch, string xwavematch, string destfolder){
163  // gathers (copies) OTF datasets in one data folder
164  // can be used for example for the Igor batch curve fitting tool
165  string foldermatch// match string to select data folders, e.g. "otf*"
166  string ywavematch// match string identifies the y wave to be copied
167  string xwavematch// match string identifies the x wave to be copied
168  string destfolder// name of the destination data folder. folder does not have to exist.
169 
170  dfref savedf = GetDataFolderDFR()
171  newdatafolder /o/s $destfolder
172  destfolder = GetDataFolder(1)
173 
174  string iteratordata = ""
175  iteratordata = ReplaceStringByKey("xwavematch", iteratordata, xwavematch)
176  iteratordata = ReplaceStringByKey("ywavematch", iteratordata, ywavematch)
177  iteratordata = ReplaceStringByKey("destfolder", iteratordata, destfolder)
178 
179  setdatafolder savedf
180  iteratordata = IterateDataFolders(foldermatch, otf_gather_iterator, iteratordata)
181 
182  setdatafolder savedf
183 };
184 
185 variable otf_rename_folders_iterator(dfref df, string* sdata){
186  // data folder iterator used by otf_rename_folders
187  dfref df
188  string &sdata// key=value list of parameters
189 
190  string pattern = StringByKey("pattern", sdata)
191  variable unique_index = NumberByKey("unique_index", sdata)
192  string new_suffix = StringByKey("new_suffix", sdata)
193 
194  string src_folder
195  string dst_folder
196  string sprefix, sdate, stime, ssuffix
197 
198  setdatafolder df
199  src_folder = GetDataFolder(0, df)
200  sprefix = "otf"
201  sscanf src_folder, "otf_%[0-9]_%[0-9]%s", sdate, stime, ssuffix
202  // return early if folder name does not match the expected pattern
203  if ((strlen(sdate) == 0) || (strlen(stime) == 0))
204  return 1
205  endif
206 
207  dst_folder = sprefix
208  if (cmpstr(pattern[0], "0") != 0)
209  dst_folder += "_" + sdate
210  endif
211  if (cmpstr(pattern[1], "0") != 0)
212  dst_folder += "_" + stime
213  endif
214  if (cmpstr(pattern[2], "0") != 0)
215  if (strlen(new_suffix) > 0)
216  ssuffix = "_" + new_suffix
217  endif
218  dst_folder += ssuffix
219  endif
220 
221  if ((unique_index > 0) || (CheckName(dst_folder, 11) != 0))
222  dst_folder = UniqueName(dst_folder + "_", 11, unique_index)
223  endif
224 
225  setdatafolder ::
226  print src_folder + " -> " + dst_folder
227  RenameDataFolder $src_folder, $dst_folder
228  return 0
229 };
230 
231 variable otf_rename_folders(string pattern, variable unique_index = defaultValue, string new_suffix = defaultValue, string match_str = defaultValue){
232  // renames OTF data folders by omitting parts of the file name
233  string pattern// string of zeros and ones indicates which name parts to keep
234  // pos 1: date
235  // pos 2: time
236  // pos 3: custom suffix
237  variable unique_index// if you remove date and time,
238  // this start index will be used to make names unique
239  // if non-zero, new names will be forced to include a unique index
240  // if zero (default), new names will get a unique index only in case of a conflict
241  // optional, defaults to 0
242  string new_suffix
243  // replace old suffix by this one
244  // if empty (default), the old suffix will be kept
245  // optional, defaults to empty string
246  string match_str// match folder name to rename
247  // optional, defaults to "otf*" (matches all OTF folders)
248 
249  dfref savedf = GetDataFolderDFR()
250 
251  if (ParamIsDefault(unique_index))
252  unique_index = 0
253  endif
254  if (ParamIsDefault(new_suffix))
255  new_suffix = ""
256  endif
257  if (ParamIsDefault(match_str))
258  match_str = "otf*"
259  endif
260 
261  string iteratordata = ""
262  iteratordata = ReplaceStringByKey("pattern", iteratordata, pattern)
263  iteratordata = ReplaceNumberByKey("unique_index", iteratordata, unique_index)
264  iteratordata = ReplaceStringByKey("new_suffix", iteratordata, new_suffix)
265 
266  iteratordata = IterateDataFolders(match_str, otf_rename_folders_iterator, iteratordata)
267 
268  setdatafolder savedf
269 };
270 
271 variable otf_interp(variable e1, variable e2, variable npts, variable smo){
272  variable e1
273  variable e2
274  variable npts
275  variable smo
276 
277  wave ch1 = current_ch1
278  wave ch2 = current_ch2
279  wave pe = photonenergy
280  wave cff
281  wave rc = ringcurrent
282 
283  duplicate /o ch1, current_ch1_int
284  wave ch1i = current_ch1_int
285  duplicate /o ch2, current_ch2_int
286  wave ch2i = current_ch2_int
287  duplicate /o pe, photonenergy_int
288  wave pei = photonenergy_int
289  duplicate /o cff, cff_int
290  wave cffi = cff_int
291  duplicate /o rc, ringcurrent_int
292  wave rci = ringcurrent_int
293 
294  redimension /n=(npts) ch1i, ch2i, pei, cffi, rci
295  setscale /i x e1, e2, "eV", ch1i, ch2i, pei, cffi, rci
296 
297  otf_smo_int(ch1, ch1i, pe, smo)
298  otf_smo_int(ch2, ch2i, pe, smo)
299  otf_smo_int(pe, pei, pe, smo)
300  otf_smo_int(cff, cffi, pe, smo)
301  otf_smo_int(rc, rci, pe, smo)
302 };
303 
304 variable otf_smo_int(wave win, wave wout, wave wpe, variable smo){
305  wave win
306  wave wout
307  wave wpe
308  variable smo
309 
310  //duplicate /o win, wtmp
311  duplicate /free win, wtmp
312  smooth /b /e=3 smo, wtmp
313  wout = interp(x, wpe, wtmp)
314 };
315 
variable otf_gather_iterator(dfref df, string *sdata)
+
string IterateDataFolders(string matchStr, funcref iterator, string sdata, string progress_title=defaultValue)
Definition: pearl-tools.ipf:79
+
variable otf_load_itx(string pathname, string filename)
+
variable otf_interp(variable e1, variable e2, variable npts, variable smo)
+
variable gather_batch(string foldermatch, string ywavematch, string xwavematch, string destfolder)
+
variable otf_load_itx_match(string pathname, string matchstr)
+
variable otf_gather_batch(string ywavematch, string xwavematch, string destfolder)
+
variable otf_rename_folders(string pattern, variable unique_index=defaultValue, string new_suffix=defaultValue, string match_str=defaultValue)
+
variable otf_rename_folders_iterator(dfref df, string *sdata)
+
variable otf_load_itx_all(string pathname)
+
variable otf_smo_int(wave win, wave wout, wave wpe, variable smo)
+
+
+ + + + diff --git a/doc/html/pearl-polar-coordinates_8ipf.html b/doc/html/pearl-polar-coordinates_8ipf.html new file mode 100644 index 0000000..a8ca2c4 --- /dev/null +++ b/doc/html/pearl-polar-coordinates_8ipf.html @@ -0,0 +1,344 @@ + + + + + + +PEARL Procedures: pearl-polar-coordinates.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-polar-coordinates.ipf File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + + +

+Functions

variable cart2polar (variable xx, variable yy, variable zz, variable *radius, variable *theta, variable *phi)
 
variable cart2polar_wave (wave in, wave out)
 
variable polar2cart (variable radius, variable theta, variable phi, variable *xx, variable *yy, variable *zz)
 
variable polar2cart_wave (wave in, wave out)
 
variable polar_distance (variable polar1, variable azim1, variable polar2, variable azim2)
 
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable cart2polar (variable xx,
variable yy,
variable zz,
variable * radius,
variable * theta,
variable * phi 
)
+
+ +

Definition at line 10 of file pearl-polar-coordinates.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable cart2polar_wave (wave in,
wave out 
)
+
+ +

Definition at line 36 of file pearl-polar-coordinates.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable polar2cart (variable radius,
variable theta,
variable phi,
variable * xx,
variable * yy,
variable * zz 
)
+
+ +

Definition at line 48 of file pearl-polar-coordinates.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable polar2cart_wave (wave in,
wave out 
)
+
+ +

Definition at line 58 of file pearl-polar-coordinates.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable polar_distance (variable polar1,
variable azim1,
variable polar2,
variable azim2 
)
+
+ +

Definition at line 69 of file pearl-polar-coordinates.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-polar-coordinates_8ipf.js b/doc/html/pearl-polar-coordinates_8ipf.js new file mode 100644 index 0000000..9e22fec --- /dev/null +++ b/doc/html/pearl-polar-coordinates_8ipf.js @@ -0,0 +1,8 @@ +var pearl_polar_coordinates_8ipf = +[ + [ "cart2polar", "pearl-polar-coordinates_8ipf.html#aca0a5aaa4854d83ef667c53007312fb8", null ], + [ "cart2polar_wave", "pearl-polar-coordinates_8ipf.html#adfc1f0b3cddf672b0ccdb6a22b97ba9e", null ], + [ "polar2cart", "pearl-polar-coordinates_8ipf.html#a94ccfa9cf52c55eb1f66c2704478c396", null ], + [ "polar2cart_wave", "pearl-polar-coordinates_8ipf.html#a6a0ffb6b9160413d9694b1fd8e10c858", null ], + [ "polar_distance", "pearl-polar-coordinates_8ipf.html#a58139e6ebfba242b6b2ba3533b865a9a", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-polar-coordinates_8ipf_source.html b/doc/html/pearl-polar-coordinates_8ipf_source.html new file mode 100644 index 0000000..155dde4 --- /dev/null +++ b/doc/html/pearl-polar-coordinates_8ipf_source.html @@ -0,0 +1,130 @@ + + + + + + +PEARL Procedures: pearl-polar-coordinates.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-polar-coordinates.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3
2 #pragma version = 1.1
3 #pragma IgorVersion = 6.1
4 #pragma ModuleName = PearlPolarCoordinates
5 
6 // author: matthias.muntwiler@psi.ch
7 // Copyright (c) 2011-13 Paul Scherrer Institut
8 // $Id$
9 
10 variable cart2polar(variable xx, variable yy, variable zz, variable* radius, variable* theta, variable* phi){
11  // converts a 3-vector from Cartesian to polar coordinates
12  variable xx, yy, zz
13  variable &radius, &theta, &phi// angles in degrees
14 
15  radius = sqrt(xx^2 + yy^2 + zz^2)
16 
17  if (radius > 0)
18  theta = acos(zz / radius) * 180 / pi
19  else
20  theta = 0
21  endif
22 
23  if (xx > 0)
24  phi = atan(yy / xx) * 180 / pi
25  else if (xx < 0)
26  phi = atan(yy / xx) * 180 / pi + 180
27  else
28  if (yy > 0)
29  phi = 90
30  else
31  phi = 270
32  endif
33  endif
34 };
35 
36 variable cart2polar_wave(wave in, wave out){
37  // converts a wave of 3-vectors from Cartesian to polar coordinates
38  wave in// wave with dimensions (3, N), N >= 1, (x, y, z)
39  wave out// wave same dimensions as in, (radius, theta, phi)
40  // angles in degrees
41 
42  out[0][] = sqrt(in[0][q]^2 + in[1][q]^2 + in[2][q]^2)
43  out[1][] = acos(in[2][q] / out[0][q]) * 180 / pi
44  out[2][] = atan(in[1][q] / in[0][q]) * 180 / pi + 180 * (in[0][q] < 0)
45  out[2][] = numtype(out[2][q]) == 0 ? out[2][q] : 90 + 180 * (in[1][q] < 0)
46 };
47 
48 variable polar2cart(variable radius, variable theta, variable phi, variable* xx, variable* yy, variable* zz){
49  // converts a 3-vector from Cartesian to polar coordinates
50  variable radius, theta, phi// angles in degrees
51  variable &xx, &yy, &zz
52 
53  xx = radius * sin(theta * pi / 180) * cos(phi * pi / 180)
54  yy = radius * sin(theta * pi / 180) * sin(phi * pi / 180)
55  zz = radius * cos(theta * pi / 180)
56 };
57 
58 variable polar2cart_wave(wave in, wave out){
59  // converts a wave of 3-vectors from polar to Cartesian coordinates
60  wave in// wave with dimensions (3, N), N >= 1, (radius, theta, phi)
61  // angles in degrees
62  wave out// wave same dimensions as in, (x, y, z)
63 
64  out[0][] = in[0][q] * sin(in[1][q] * pi / 180) * cos(in[2][q] * pi / 180)
65  out[1][] = in[0][q] * sin(in[1][q] * pi / 180) * sin(in[2][q] * pi / 180)
66  out[2][] = in[0][q] * cos(in[1][q] * pi / 180)
67 };
68 
69 variable polar_distance(variable polar1, variable azim1, variable polar2, variable azim2){
70  // returns the angle between two spherical coordinates
71  variable polar1, azim1
72  // angles in degrees
73  variable polar2, azim2
74  // angles in degrees
75 
76  variable xx1, yy1, zz1
77  variable xx2, yy2, zz2
78 
79  polar2cart(1, polar1, azim1, xx1, yy1, zz1)
80  polar2cart(1, polar2, azim2, xx2, yy2, zz2)
81 
82  variable vv
83  vv = (xx1 * xx2 + yy1 * yy2 + zz1 * zz2) / sqrt(xx1^2 + yy1^2 + zz1^2) / sqrt(xx2^2 + yy2^2 + zz2^2)
84  return acos(vv) * 180 / pi
85 };
86 
variable polar2cart_wave(wave in, wave out)
+
variable cart2polar(variable xx, variable yy, variable zz, variable *radius, variable *theta, variable *phi)
+
variable cart2polar_wave(wave in, wave out)
+
variable polar_distance(variable polar1, variable azim1, variable polar2, variable azim2)
+
variable polar2cart(variable radius, variable theta, variable phi, variable *xx, variable *yy, variable *zz)
+
+
+ + + + diff --git a/doc/html/pearl-preparation_8ipf.html b/doc/html/pearl-preparation_8ipf.html new file mode 100644 index 0000000..6d650fa --- /dev/null +++ b/doc/html/pearl-preparation_8ipf.html @@ -0,0 +1,209 @@ + + + + + + +PEARL Procedures: pearl-preparation.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-preparation.ipf File Reference
+
+
+ +

PEARL sample preparation package. +More...

+
#include "pearl-area-display"
+#include "pearl-area-profiles"
+#include "pearl-elog"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlPreparation
 PEARL sample preparation package.
 
+ + + + + + +

+Functions

static variable AfterCompiledHook ()
 initializes package data once when the procedure is first loaded More...
 
variable UnloadPearlPreparationPackage ()
 
+

Detailed Description

+

PEARL sample preparation package.

+

this procedure defines the PEARL sample preparation package the main purpose of this file is to load the necessary dependent procedures (see the include statements at the top)

+
Precondition
    +
  • on-line process control functionality requires the EPICS XOP to be loaded
  • +
+
+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-preparation.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
static variable AfterCompiledHook ()
+
+static
+
+ +

initializes package data once when the procedure is first loaded

+ +

Definition at line 63 of file pearl-preparation.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable UnloadPearlPreparationPackage ()
+
+ +

Definition at line 70 of file pearl-preparation.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-preparation_8ipf.js b/doc/html/pearl-preparation_8ipf.js new file mode 100644 index 0000000..fad8aaa --- /dev/null +++ b/doc/html/pearl-preparation_8ipf.js @@ -0,0 +1,5 @@ +var pearl_preparation_8ipf = +[ + [ "AfterCompiledHook", "pearl-preparation_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed", null ], + [ "UnloadPearlPreparationPackage", "pearl-preparation_8ipf.html#aae0e7e9a648143f006d6701d178914cf", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-preparation_8ipf_source.html b/doc/html/pearl-preparation_8ipf_source.html new file mode 100644 index 0000000..4db0eed --- /dev/null +++ b/doc/html/pearl-preparation_8ipf_source.html @@ -0,0 +1,161 @@ + + + + + + +PEARL Procedures: pearl-preparation.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-preparation.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 = PearlPreparation
+
4 #pragma version = 1.04
+
5 #include "pearl-area-display"// 2D and 3D data visualization
+
6 #include "pearl-area-profiles"// data processing for multi-dimensional datasets
+
7 #include "pearl-elog"
+
8 #if exists("pvOpen")
+
9 #include "pearl-epics"// EPICS access under Igor
+
10 #include "pearl-anneal"// automated sample annealing
+
11 #endif
+
12 
+
13 // author: matthias.muntwiler@psi.ch
+
14 // Copyright (c) 2015 Paul Scherrer Institut
+
15 //
+
16 // Licensed under the Apache License, Version 2.0 (the "License");
+
17 // you may not use this file except in compliance with the License.
+
18 // You may obtain a copy of the License at
+
19 // http://www.apache.org/licenses/LICENSE-2.0
+
20 
+
38 
+
44 
+
61 
+
63 static variable AfterCompiledHook(){
+
64 
+
65  dfref savefolder = GetDataFolderDFR()
+
66 
+
67  return 0
+
68 };
+
69 
+ +
71  execute /p/q/z "DELETEINCLUDE \"pearl-preparation\""
+
72  execute /p/q/z "COMPILEPROCEDURES "
+
73 };
+
74 
+
variable UnloadPearlPreparationPackage()
+
static variable AfterCompiledHook()
initializes package data once when the procedure is first loaded
+
+
+ + + + diff --git a/doc/html/pearl-pshell-import_8ipf.html b/doc/html/pearl-pshell-import_8ipf.html new file mode 100644 index 0000000..5741a3c --- /dev/null +++ b/doc/html/pearl-pshell-import_8ipf.html @@ -0,0 +1,2156 @@ + + + + + + +PEARL Procedures: pearl-pshell-import.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-pshell-import.ipf File Reference
+
+
+ +

import data from PShell +More...

+
#include <HDF5 Browser>
+#include "pearl-gui-tools"
+#include "pearl-area-import"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlPShellImport
 import data from PShell
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

variable psh5_open_file (string ANickName, string APathName, string AFileName)
 open a HDF5 file created by the PShell data acquisition program and prepare the data folder. More...
 
variable psh5_close_file (variable fileID)
 close a HDF5 file opened by psh5_open_file. More...
 
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. More...
 
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. More...
 
string psh5_load_scan_complete (variable fileID, string scanpath, variable load_data=defaultValue, variable load_attr=defaultValue)
 load all data of a selected scan from a PShell data file. More...
 
string psh5_list_scans (variable fileID)
 list scan groups of a PShell data file. More...
 
string psh5_list_scan_datasets (variable fileID, string scanpath, variable include_regions=defaultValue)
 list datasets of a PShell scan group. More...
 
string psh5_list_scan_regions (variable fileID, string scanpath)
 list regions of a PShell scan group. More...
 
string psh5_load_scan_data (variable fileID, string scanpath)
 load all datasets of a PShell scan group. More...
 
string psh5_load_scan_attrs (variable fileID, string scanpath, variable attr_sets=defaultValue)
 load attributes of a PShell scan group. More...
 
string psh5_load_scan_meta (variable fileID, string scanpath)
 load metadata of a PShell scan group. More...
 
string psh5_load_dataset (variable fileID, string scanpath, string datasetname, variable set_scale=defaultValue)
 load a dataset from an open PShell HDF5 file. More...
 
static string select_dataset (string file_datasets, string pref_datasets)
 select the preferred dataset from a list of available datasets. More...
 
string psh5_load_scan_preview (variable fileID, string scanpath, variable set_scale=defaultValue, string pref_datasets=defaultValue)
 load a preview dataset from an open PShell HDF5 file. More...
 
string psh5_load_scan_section (variable fileID, string scanpath, variable dim, variable set_scale=defaultValue, string pref_datasets=defaultValue)
 load a longitudinal section of a scan from an open PShell HDF5 file. More...
 
variable psh5_load_dataset_meta (variable fileID, string datapath, string datasetname, wave datawave)
 load metadata of a PShell dataset. More...
 
string psh5_load_dataset_slabs (variable fileID, string datapath, string datasetname, variable progress=defaultValue)
 load a dataset slab-wise from the open PShell HDF5 file. More...
 
string psh5_load_dataset_slab (variable fileID, string datapath, string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count)
 load a single image from the open PShell data file. More...
 
variable ps_set_dimlabels (wave data)
 set dimension labels according to the axis type More...
 
variable ps_set_dimlabels2 (wave data, string name)
 set dimension labels according to the axis type More...
 
static dfr find_scan_folder (dfref dataDF)
 find the scan folder More...
 
static dfr find_attr_folder (dfref dataDF)
 find the attributes data folder More...
 
variable ps_scale_datasets ()
 set the dimension scales of loaded PShell Scienta datasets according to attributes. More...
 
variable ps_scale_dataset (wave data)
 set the dimension scales of a loaded PShell Scienta dataset according to attributes. More...
 
static wave find_scale_wave (string name, dfref dataDF, dfref scanDF, dfref attrDF)
 
variable ps_detect_scale (wave ax, wave lo, wave hi, wave un)
 detect the dimension scales from attributes. More...
 
variable ps_scale_dataset_2 (wave data, wave ax, wave lo, wave hi, wave un)
 set the dimension scales of a dataset. More...
 
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. More...
 
string psh5_load_dataset_reduced (variable fileID, string scanpath, string datasetname, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
 load a reduced dataset from the open PShell HDF5 file. More...
 
static threadsafe variable reduce_slab_worker (funcref reduction_func)
 
static threadsafe variable reduce_slab_image (wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param)
 
string psh5_load_info (string APathName, string AFileName)
 load descriptive info from a PShell data file. More...
 
string psh5_load_scan_info (variable fileID, string scanpath)
 load descriptive info from a PShell scan. More...
 
static string twave2list (wave wt, string sep)
 convert text wave to list. More...
 
static string wave2list (wave w, string format, string sep)
 convert numeric wave to list. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Variables

const string kEnergyDimLabel = "energy"
 Dimension label for the energy dispersive dimension of multi-dimensional datasets. More...
 
const string kAngleDimLabel = "angle"
 Dimension label for the angle dispersive dimension of multi-dimensional datasets. More...
 
const string kScanDimLabel = "scan"
 Dimension label for the scan dimension of multi-dimensional datasets. More...
 
const string kDataDimLabel = "data"
 Dimension label for the data dimension. More...
 
const string kPreviewDatasets = "ScientaImage;ScientaSpectrum;ImageAngleDistribution;ImageEnergyDistribution;Counts;SampleCurrent;"
 List of preferred datasets to load for preview. More...
 
const string kScientaScalingDatasets = "LensMode;ScientaChannelBegin;ScientaChannelEnd;ScientaSliceBegin;ScientaSliceEnd;"
 List of datasets that must be loaded to determine the axis scaling of a Scienta image. More...
 
const string kTransposedDatasets = "ScientaImage;"
 List of datasets that should be transposed upon loading. More...
 
+

Detailed Description

+

import data from PShell

+

HDF5 file import from the PShell data acquisition program. the main import functions are:

+ +

the following helper functions are also needed:

+ + +

Definition in file pearl-pshell-import.ipf.

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
static dfr find_attr_folder (dfref dataDF)
+
+static
+
+ +

find the attributes data folder

+

this is the :attr folder.

+ +

Definition at line 1468 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static wave find_scale_wave (string name,
dfref dataDF,
dfref scanDF,
dfref attrDF 
)
+
+static
+
+ +

Definition at line 1556 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static dfr find_scan_folder (dfref dataDF)
+
+static
+
+ +

find the scan folder

+

the scan folder is the one that contains the :attr folder the data and scan folders may refer to the same folder.

+ +

Definition at line 1451 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ps_detect_scale (wave ax,
wave lo,
wave hi,
wave un 
)
+
+ +

detect the dimension scales from attributes.

+

the function checks the data , scan and attributes folders for scan parameters. the results are written to the provided waves. the function is normally called by ps_scale_datasets() but can also be used independently.

+

the current datafolder must be the data or the scan folder. the data folder contains the waves that are to be scaled. the scan folder contains the scan positions and the :attr folder.

+

the provided waves are redimensioned by the function, and dimension labels are set. the scale parameters can then be extracted by keyword, e.g.,

    +
  • lo[%energy] analyser energy dimension.
  • +
  • lo[%angle] analyser angle dimension.
  • +
  • lo[%scan] scan dimension.
  • +
  • lo[%data] data dimension.
  • +
+

the function tries to read the following waves, in the data, scan, and attributes folders, where the first folder in the list takes precedence. it may fall back to more or less reasonable default values if no data is not found.

    +
  • LensMode
  • +
  • ScientaChannelBegin
  • +
  • ScientaChannelEnd
  • +
  • ScientaSliceBegin
  • +
  • ScientaSliceEnd
  • +
  • ScanWritables
  • +
  • wave referenced by ScanWritables[0]
  • +
+
Parameters
+ + + + + +
axtext wave to receive the axis labels.
lowave to receive the lower limits.
hiwave to receive the upper limits.
untext wave to receive the unit labels.
+
+
+
Returns
the function results are written to the lo, hi, un, and ax waves.
+
Version
this function supports regions from version 1.03. check that you're in the correct data folder!
+ +

Definition at line 1613 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ps_scale_dataset (wave data)
+
+ +

set the dimension scales of a loaded PShell Scienta dataset according to attributes.

+

the current datafolder must contain the :attr folder. the data wave can be in the current folder or a sub-folder.

+

the dimension labels of the dataset waves must have been set correctly, e.g. by ps_set_dimlabels(). this is implicitly done by the high-level load functions.

+

the function is useful if a single dataset is loaded and scaled. if multiple datasets are loaded, ps_scale_datasets() is slightly more efficient.

+
Parameters
+ + +
datadata wave to be scaled. dimension labels (index -1) must be set correctly, cf. ps_set_dimlabels().
+
+
+
Version
this function supports regions from version 1.03.
+ +

Definition at line 1542 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable ps_scale_dataset_2 (wave data,
wave ax,
wave lo,
wave hi,
wave un 
)
+
+ +

set the dimension scales of a dataset.

+

the function is normally called by ps_scale_datasets() but can also be used independently. the limits and units must be given as function arguments with proper dimension labels.

+

the provided limit and unit waves must have dimension labels matching the -1 index dimension labels of the data wave, such as set by the ps_detect_scale() function. the scale parameters are extracted by keyword, e.g.,

    +
  • lo[%energy] analyser energy dimension.
  • +
  • lo[%angle] analyser angle dimension.
  • +
  • lo[%scan] scan dimension.
  • +
  • lo[%data] data dimension.
  • +
+
Parameters
+ + + + + + +
datadata wave to be scaled. dimension labels (index -1) must be set to match the limit waves.
axaxis labels. the axis labels are written to the wave note in the format AxisLabel%s=%s where X, Y, Z, D is substituted for the first place holder and the label for the second one.
lolower limits. the lower limits are applied using the SetScale operation.
hiupper limits. the upper limits are applied using the SetScale operation.
ununit labels. the unit labels are applied using the SetScale operation.
+
+
+
Version
this function supports regions from version 1.03.
+ +

Definition at line 1767 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + +
variable ps_scale_datasets ()
+
+ +

set the dimension scales of loaded PShell Scienta datasets according to attributes.

+

datasets listed in the ScanReadables waves are scaled according to the attribute waves in the data, scan, and attributes folders, whichever is found first.

+

the current datafolder must contain the ScanReadables wave and the :attr folder. the ScanReadables text wave contains names of the waves to scale. wave names can include a relative path to a sub-folder. the path separator is "/".

+

the dimension labels of the dataset waves must have been set correctly, e.g. by ps_set_dimlabels(). this is implicitly done by the high-level load functions.

+
Version
this function supports regions from version 1.03. check that you're in the correct data folder!
+ +

Definition at line 1496 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable ps_set_dimlabels (wave data)
+
+ +

set dimension labels according to the axis type

+

this function asserts a particular ordering of dimensions types based on the name of the wave for ScientaImage, ScientaSpectrum, ImageAngleDistribution, ImageEnergyDistribution. all other waves must be one-dimensional, and the dimension must be the scan dimension.

+

dimension labels are required by scaling functions.

+
Parameters
+ + +
datadata wave as loaded from PShell file
+
+
+
Returns
    +
  • 0 all labels set successfully.
  • +
  • 1 unidentified data source.
  • +
  • 2 wave does not contain data.
  • +
+
+ +

Definition at line 1375 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable ps_set_dimlabels2 (wave data,
string name 
)
+
+ +

set dimension labels according to the axis type

+

same as ps_set_dimlabels() except that the dimension labels are set according to a separate name argument instead of the wave name.

+
Parameters
+ + + +
datadata wave as loaded from PShell file.
nameoriginal name of the dataset in the PShell file.
+
+
+
Returns
    +
  • 0 all labels set successfully.
  • +
  • 1 unidentified data source.
  • +
  • 2 wave does not contain data.
  • +
+
+ +

Definition at line 1394 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable psh5_close_file (variable fileID)
+
+ +

close a HDF5 file opened by psh5_open_file.

+

this function just closes the HDF5 file. no change is made to the loaded data.

+
Parameters
+ + +
fileIDID of open HDF5 file from psh5_open_file().
+
+
+ +

Definition at line 129 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_list_scan_datasets (variable fileID,
string scanpath,
variable include_regions = defaultValue 
)
+
+ +

list datasets of a PShell scan group.

+

the function returns a list of all datasets of the selected scan. this does not include datasets from the attributes sub-group.

+
Note
in a future version, an option may be introduced to filter datasets by function (Readable and/or Writable).
+
Parameters
+ + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
+
+
+
Returns
semicolon-separated list of dataset paths.
+
Version
since version 1.03 this function returns paths relative to scanpath.
+ +

Definition at line 448 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string psh5_list_scan_regions (variable fileID,
string scanpath 
)
+
+ +

list regions of a PShell scan group.

+

the function returns a list of all region groups of the selected scan.

+
Parameters
+ + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
+
+
+
Returns
semicolon-separated list of datagroup paths.
+ +

Definition at line 489 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string psh5_list_scans (variable fileID)
+
+ +

list scan groups of a PShell data file.

+

the function returns a list of all top-level groups whose name starts with "scan".

+
Parameters
+ + +
fileIDID of open HDF5 file from psh5_open_file().
+
+
+
Returns
semicolon-separated list of group paths.
+ +

Definition at line 413 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+
Parameters
+ + + + + + +
ANickNamedestination folder name (top level under root)
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
load_dataselect whether datasets (positioners and detectors) are loaded.
    +
  • 1 (default) load data.
  • +
  • 0 do not load data.
  • +
+
load_attrselect whether attributes (auxiliary device readbacks) are loaded. for proper wave scaling, the attributes must be loaded.
    +
  • 1 (default) load attributes.
  • +
  • 0 do not load attributes.
  • +
+
+
+
+
Returns
complete path of the loaded file if successful. empty string otherwise.
+
+global string s_filepath in new data folder contains the full file path on disk.
+
+global string s_scanpaths in new data folder contains a list of scan groups inside the file.
+ +

Definition at line 159 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_dataset (variable fileID,
string scanpath,
string datasetname,
variable set_scale = defaultValue 
)
+
+ +

load a dataset from an open PShell HDF5 file.

+

if the dataset has a maximum of two dimensions, the function loads it at once. if it has more than two dimension, the function calls psh5_load_dataset_slabs() to load the data slab by slab.

+ +

the dataset is loaded into the current data folder unless datasetname contains a region specifier. in the latter case, the dataset is loaded into sub-folder with the name of the region. the function returns from the original data folder.

+
Parameters
+ + + + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
datasetnamename of the dataset. the name of the loaded wave is a cleaned up version of the dataset name. the name can include the region name as a relative path, e.g. "region1/ScientaSpectrum". in this case, the dataset is loaded into a sub-folder named "region1".
set_scaleby default, the function tries to set the wave scaling if the attributes have been loaded. if multiple datasets are loaded from a file, it is more efficient to set the scaling of all loaded datasets at the end by calling ps_scale_datasets().
    +
  • 1 (default) set the wave scaling.
  • +
  • 0 do not set the wave scaling.
  • +
+
+
+
+
Returns
name of loaded wave if successful. empty string otherwise.
+
Version
this function supports regions as of version 1.03.
+ +

Definition at line 697 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
variable psh5_load_dataset_meta (variable fileID,
string datapath,
string datasetname,
wave datawave 
)
+
+ +

load metadata of a PShell dataset.

+

"metadata" are the HDF5 attributes attached to the scan dataset.

+

data is added to the wave note.

+
Parameters
+ + + + + +
fileIDID of open HDF5 file from psh5_open_file().
datapathpath to the containing group in the HDF5 file. path separator is the slash "/".
datasetnamename of the dataset. may include relative path.
datawavemetadata is added to the wave note of this wave.
+
+
+
Returns
0 if successful, non-zero if an error occurred.
+ +

Definition at line 1083 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_dataset_reduced (variable fileID,
string scanpath,
string datasetname,
funcref reduction_func,
string reduction_param,
variable progress = defaultValue,
variable nthreads = defaultValue 
)
+
+ +

load a reduced dataset from the open PShell HDF5 file.

+

the function loads the dataset image by image using the hyperslab option and applies a custom reduction function to each image. the results from the reduction function are written to the ReducedData1 and ReducedData2 waves. the raw data are discarded.

+

by default, the reduction function is called in separate threads to reduce the total loading time. (see the global variable psh5_perf_secs which reports the total run time of the function.) the effect varies depending on the balance between file loading (image size) and data processing (complexity of the reduction function). for debugging the reduction function, multi-threading can be disabled.

+

if the reduction function requires the image waves to be scaled properly, the attributes must have been loaded by psh5_load_scan_attrs() before. in this case, the scales of the result waves are also set by the function. otherwise, the results can also be scaled by ps_scale_dataset() later.

+
Parameters
+ + + + + + + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to scan group in the HDF5 file.
datasetnamename of the dataset. the name of the loaded wave is a cleaned up version of the dataset name. the name can include the region name as a relative path, e.g. "region1/ScientaSpectrum". in this case, the dataset is loaded into a sub-folder named "region1".
reduction_funccustom reduction function (any user-defined function which has the same parameters as adh5_default_reduction()).
reduction_paramparameter string for the reduction function.
progressprogress window.
    +
  • 1 (default) show progress window
  • +
  • 0 do not show progress window
  • +
+
nthreads
    +
  • -1 (default) use as many threads as there are processor cores (in addition to main thread).
  • +
  • 0 use main thread only (e.g. for debugging the reduction function).
  • +
  • >= 1 use a fixed number of (additional) threads.
  • +
+
+
+
+
Returns
semicolon-separated list of the loaded waves, ReducedData1 and ReducedData2 if successful. empty string if an error occurred. error messages are printed to the history.
+
Version
this function supports regions as of version 1.03.
+ +

Definition at line 1976 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_dataset_slab (variable fileID,
string datapath,
string datasetname,
variable dim2start,
variable dim2count,
variable dim3start,
variable dim3count 
)
+
+ +

load a single image from the open PShell data file.

+

the function can average over a region in the extra dimensions.

+
Parameters
+ + + + + + + + +
fileIDID of open HDF5 file from psh5_open_file().
datapathpath to the containing group in the HDF5 file. path separator is the slash "/".
datasetname of the dataset. also defines the name of the loaded wave.
dim2start2nd dimension coordinate of the first image set to 0 if dimension may not be present
dim2countnumber of subsequent images to average set to 1 if dimension may not be present
dim3start3rd dimension coordinate of the first image set to 0 if dimension may not be present
dim3countnumber of subsequent images to average set to 1 if dimension may not be present
+
+
+
Returns
name of loaded wave if successful. empty string otherwise.
+ +

Definition at line 1276 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_dataset_slabs (variable fileID,
string datapath,
string datasetname,
variable progress = defaultValue 
)
+
+ +

load a dataset slab-wise from the open PShell HDF5 file.

+

the function loads the dataset image by image using the hyperslab option.

+
Parameters
+ + + + + +
fileIDID of open HDF5 file from psh5_open_file().
datapathpath to the containing group in the HDF5 file. path separator is the slash "/".
datasetname of the dataset. also defines the name of the loaded wave.
progressselect whether a progress window is displayed during the process.
    +
  • 1 (default) show progress window.
  • +
  • 0 do not show progress window.
  • +
+
+
+
+
Returns
name of loaded wave if successful. empty string otherwise.
+ +

Definition at line 1140 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string psh5_load_info (string APathName,
string AFileName 
)
+
+ +

load descriptive info from a PShell data file.

+

the info string lists the following information for each scan contained in the file:

    +
  • path of the scan group inside the file.
  • +
  • number of scan positions.
  • +
  • dataset names of scan positioners.
  • +
  • dataset names of detectors.
  • +
+
Parameters
+ + + +
APathNameigor symbolic path name. can be empty if the path is specified in AFileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
+
+
+
Returns
newline terminated string.
+ +

Definition at line 2290 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

the data wave is loaded into the current data folder. attributes are loaded into the attr subfolder. existing waves in attr are deleted.

+
Warning
EXPERIMENTAL this function uses the root:pearl_area:preview data folder. existing data there may be deleted!
+
Parameters
+ + + + + + + + +
ANickNamedestination wave name. the wave is created in the current data folder.
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
load_data1 (default): load data; 0: do not load data
load_attr1 (default): load attributes; 0: do not load attributes note: for correct scaling of the image, the attributes need to be loaded
pref_scanssemicolon-separated list of preferred scans. the items of the list are match strings for the Igor StringMatch function. the first matching scan (i.e. top-level HDF5 group with a matching name) is loaded from the file. if no match is found, the first scan is loaded.
pref_datasetssemicolon-separated list of preferred datasets. the items of the list are match strings for the Igor StringMatch function. the first matching dataset is loaded from the file. if no match is found, the first dataset listed in the file is loaded.
+
+
+
Returns
name of loaded preview wave.
+ +

Definition at line 245 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.

+

the resulting dataset is reduced in one image dimension by a user-defined reduction function, e.g. by region-of-interest integration, curve fitting, etc.

+

the function loads the dataset image by image using the hyperslab option and applies a custom reduction function to each image. the results from the reduction function are composed into one result wave. the raw data are discarded.

+

if the data is from the electron analyser driver and some special attributes are included, the function will set the scales of the image dimensions.

+
Parameters
+ + + + + + + +
ANickNamedestination folder name (top level under root).
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed.
AFileNameif empty a dialog box shows up.
reduction_funccustom reduction function (any user-defined function which has the same parameters as adh5_default_reduction())
reduction_paramparameter string for the reduction function.
progressprogress window.
    +
  • 1 (default) show progress window
  • +
  • 0 do not show progress window
  • +
+
+
+
+
Returns
semicolon-separated list of the loaded waves, ReducedData1 and ReducedData2 if successful. empty string if an error occurred. error messages are printed to the history.
+
+global string s_filepath in new data folder contains the full file path on disk.
+
+global string s_scanpaths in new data folder contains a list of scan groups inside the file.
+
Todo:
load scan positions.
+ +

Definition at line 1853 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_scan_attrs (variable fileID,
string scanpath,
variable attr_sets = defaultValue 
)
+
+ +

load attributes of a PShell scan group.

+

"attributes" are the auxiliary data inside the attrs group. do not confuse with HDF5 attributes! HDF5 attributes are loaded by the psh5_load_scan_meta() function.

+

data is loaded into the current data folder. this should normally be the :attr folder inside the respective scan folder.

+
Parameters
+ + + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
attr_setsspecify the attribute sets to be loaded. this value can be an arithmetic OR of the following constants. by default, all attributes are loaded.
    +
  • 1 all datasets that are present in the file.
  • +
  • 2 datasets relevant for wave scaling of Scienta data.
  • +
+
+
+
+
Returns
semicolon-separated list of the loaded waves.
+ +

Definition at line 562 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_scan_complete (variable fileID,
string scanpath,
variable load_data = defaultValue,
variable load_attr = defaultValue 
)
+
+ +

load all data of a selected scan from a PShell data file.

+

data is loaded into the current data folder. attribute datasets are loaded into sub-folder attr. region datasets are loaded into region sub-folders. existing data, if present, is overwritten.

+
Parameters
+ + + + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
load_dataselect whether datasets (positioners and detectors) are loaded.
    +
  • 1 (default) load data.
  • +
  • 0 do not load data.
  • +
+
load_attrselect whether attributes (auxiliary device readbacks) are loaded. for proper wave scaling, the attributes must be loaded.
    +
  • 1 (default) load attributes.
  • +
  • 0 do not load attributes.
  • +
+
+
+
+
Returns
semicolon-separated list of the loaded data waves (excluding attributes).
+ +

Definition at line 369 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string psh5_load_scan_data (variable fileID,
string scanpath 
)
+
+ +

load all datasets of a PShell scan group.

+

data is loaded into the current data folder. region datasets are loaded into the respective region sub-folders.

+

this function does not scale the datasets. call ps_scale_datasets() separately.

+
Parameters
+ + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
+
+
+
Returns
semicolon-separated list of the loaded waves.
+ +

Definition at line 522 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string psh5_load_scan_info (variable fileID,
string scanpath 
)
+
+ +

load descriptive info from a PShell scan.

+

the info string contains up to three lines which are made up of the following information:

    +
  • number of scan positions.
  • +
  • dataset names of scan positioners.
  • +
  • dataset names of detectors.
  • +
+
Parameters
+ + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to scan group in the HDF5 file.
+
+
+
Returns
newline terminated string.
+ +

Definition at line 2336 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
string psh5_load_scan_meta (variable fileID,
string scanpath 
)
+
+ +

load metadata of a PShell scan group.

+

metadata are the HDF5 attributes attached to the scan group. the following attributes are loaded. the respective wave names under Igor are given in parentheses.

+
    +
  • Dimensions (ScanDimensions)
  • +
  • Writables (ScanWritables)
  • +
  • Readables (ScanReadables)
  • +
  • Steps (ScanSteps)
  • +
+

if they are missing in the file, ScanDimensions and ScanReadables are set to default values assuming the file contains a single spectrum.

+

data is loaded into the current data folder.

+
Parameters
+ + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
+
+
+
Returns
semicolon-separated list of the loaded waves.
+ +

Definition at line 630 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_scan_preview (variable fileID,
string scanpath,
variable set_scale = defaultValue,
string pref_datasets = defaultValue 
)
+
+ +

load a preview dataset from an open PShell HDF5 file.

+

if the dataset has a maximum of two dimensions, the function loads it at once. if it has more than two dimension, the function selects and loads one two-dimensional slab.

+
Parameters
+ + + + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
set_scaleby default, the function tries to set the wave scaling if the attributes have been loaded. if multiple datasets are loaded from a file, it is more efficient to set the scaling of all loaded datasets at the end by calling ps_scale_datasets().
    +
  • 1 (default) set the wave scaling.
  • +
  • 0 do not set the wave scaling.
  • +
+
pref_datasetssemicolon-separated list of preferred datasets. the items of the list are match strings for the Igor StringMatch function. the first matching dataset is loaded from the file. if no match is found, the first dataset listed in the file is loaded. if empty, a hard-coded default preference list is used.
+
+
+
Returns
name of loaded wave if successful. empty string otherwise.
+ +

Definition at line 831 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string psh5_load_scan_section (variable fileID,
string scanpath,
variable dim,
variable set_scale = defaultValue,
string pref_datasets = defaultValue 
)
+
+ +

load a longitudinal section of a scan from an open PShell HDF5 file.

+

the dataset must have three dimensions.

+
Parameters
+ + + + + + +
fileIDID of open HDF5 file from psh5_open_file().
scanpathpath to the scan group in the HDF5 file, e.g. "/scan 1".
dimreserved, must be 0.
set_scaleby default, the function tries to set the wave scaling if the attributes have been loaded. if multiple datasets are loaded from a file, it is more efficient to set the scaling of all loaded datasets at the end by calling ps_scale_datasets().
    +
  • 1 (default) set the wave scaling.
  • +
  • 0 do not set the wave scaling.
  • +
+
pref_datasetssemicolon-separated list of preferred datasets. the items of the list are match strings for the Igor StringMatch function. the first matching dataset is loaded from the file. if no match is found, the first dataset listed in the file is loaded. if empty, a hard-coded default preference list is used.
+
+
+
Returns
name of loaded wave if successful. empty string otherwise.
+
Warning
EXPERIMENTAL: this function is under development.
+ +

Definition at line 945 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable psh5_open_file (string ANickName,
string APathName,
string AFileName 
)
+
+ +

open a HDF5 file created by the PShell data acquisition program and prepare the data folder.

+

the function opens a specified or interactively selected HDF5 file, creates a data folder $ANickName under root, and changes to the new data folder.

+

the file must be closed by psh5_close_file() after use.

+
Parameters
+ + + + +
ANickNamedestination folder name (top level under root).
APathNameigor symbolic path name. can be empty if the path is specified in FileName or a dialog box should be displayed
AFileNameif empty a dialog box shows up
+
+
+
Returns
ID of open HDF5 file from HDF5OpenFile. zero if an error occurred.
+
+global string s_filepath in new data folder contains the full file path on disk.
+
+global string s_scanpaths in new data folder contains a list of scan groups inside the file.
+ +

Definition at line 99 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static threadsafe variable reduce_slab_image (wave slabdata,
wave image,
wave profile1,
wave profile2,
funcref reduction_func,
string reduction_param 
)
+
+static
+
+ +

Definition at line 2263 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static threadsafe variable reduce_slab_worker (funcref reduction_func)
+
+static
+
+ +

Definition at line 2224 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string select_dataset (string file_datasets,
string pref_datasets 
)
+
+static
+
+ +

select the preferred dataset from a list of available datasets.

+
Parameters
+ + + +
file_datasetssemicolon-separated list of datasets that are available in the file. the items may include a path separated by slashes "/". only the last component of the path is checked.
pref_datasetssemicolon-separated list of preferred datasets. the items of the list are match strings for the Igor StringMatch function. the first matching dataset is loaded from the file. if no match is found, the first file dataset is selected.
+
+
+
Returns
selected dataset.
+ +

Definition at line 769 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string twave2list (wave wt,
string sep 
)
+
+static
+
+ +

convert text wave to list.

+ +

Definition at line 2371 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static string wave2list (wave w,
string format,
string sep 
)
+
+static
+
+ +

convert numeric wave to list.

+ +

Definition at line 2388 of file pearl-pshell-import.ipf.

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
const string kAngleDimLabel = "angle"
+
+ +

Dimension label for the angle dispersive dimension of multi-dimensional datasets.

+ +

Definition at line 60 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + +
const string kDataDimLabel = "data"
+
+ +

Dimension label for the data dimension.

+

This label may be used to store the parameters for the setscale d operation.

+ +

Definition at line 67 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + +
const string kEnergyDimLabel = "energy"
+
+ +

Dimension label for the energy dispersive dimension of multi-dimensional datasets.

+ +

Definition at line 57 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + +
const string kPreviewDatasets = "ScientaImage;ScientaSpectrum;ImageAngleDistribution;ImageEnergyDistribution;Counts;SampleCurrent;"
+
+ +

List of preferred datasets to load for preview.

+ +

Definition at line 70 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + +
const string kScanDimLabel = "scan"
+
+ +

Dimension label for the scan dimension of multi-dimensional datasets.

+ +

Definition at line 63 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + +
const string kScientaScalingDatasets = "LensMode;ScientaChannelBegin;ScientaChannelEnd;ScientaSliceBegin;ScientaSliceEnd;"
+
+ +

List of datasets that must be loaded to determine the axis scaling of a Scienta image.

+ +

Definition at line 73 of file pearl-pshell-import.ipf.

+ +
+
+ +
+
+ + + + +
const string kTransposedDatasets = "ScientaImage;"
+
+ +

List of datasets that should be transposed upon loading.

+ +

Definition at line 76 of file pearl-pshell-import.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-pshell-import_8ipf.js b/doc/html/pearl-pshell-import_8ipf.js new file mode 100644 index 0000000..838f8d7 --- /dev/null +++ b/doc/html/pearl-pshell-import_8ipf.js @@ -0,0 +1,45 @@ +var pearl_pshell_import_8ipf = +[ + [ "find_attr_folder", "pearl-pshell-import_8ipf.html#a41bf534983b0662ec2609b136c395f14", null ], + [ "find_scale_wave", "pearl-pshell-import_8ipf.html#acfb01ee360b66f286225f6e9c7220ba2", null ], + [ "find_scan_folder", "pearl-pshell-import_8ipf.html#a79b968d7439dfbfbc38c05f933071489", null ], + [ "ps_detect_scale", "pearl-pshell-import_8ipf.html#acba7f4b98f67cc112c02dfeefe3e5acd", null ], + [ "ps_scale_dataset", "pearl-pshell-import_8ipf.html#adc11ea797562b3d99c247f4866618d39", null ], + [ "ps_scale_dataset_2", "pearl-pshell-import_8ipf.html#a2c456397c36d4116bfddca452eff5954", null ], + [ "ps_scale_datasets", "pearl-pshell-import_8ipf.html#af08a467036c64f70ca3dfe644fcc457c", null ], + [ "ps_set_dimlabels", "pearl-pshell-import_8ipf.html#aba25eb98e4c6cc9066c46ef6be1cde15", null ], + [ "ps_set_dimlabels2", "pearl-pshell-import_8ipf.html#a8704627410409bcd27a1adeda4082c47", null ], + [ "psh5_close_file", "pearl-pshell-import_8ipf.html#a2fc497747287d6fe40c6de997ed4a90d", null ], + [ "psh5_list_scan_datasets", "pearl-pshell-import_8ipf.html#a4508bd507c4c935bd8463d9b2b84c6fc", null ], + [ "psh5_list_scan_regions", "pearl-pshell-import_8ipf.html#acb317b57ef137d4d5da5938013dbe442", null ], + [ "psh5_list_scans", "pearl-pshell-import_8ipf.html#a2152f7c39a187b740cf9890767ffac3f", null ], + [ "psh5_load_complete", "pearl-pshell-import_8ipf.html#a8a5ce6c2767607de194b4c148ee98c27", null ], + [ "psh5_load_dataset", "pearl-pshell-import_8ipf.html#ac4dfb90b951d29b56501e904f5cc38aa", null ], + [ "psh5_load_dataset_meta", "pearl-pshell-import_8ipf.html#afde787a00a18dc8c63b100d8ac7d992f", null ], + [ "psh5_load_dataset_reduced", "pearl-pshell-import_8ipf.html#a13a45e8618c1ab7406e1aa5e608e21fe", null ], + [ "psh5_load_dataset_slab", "pearl-pshell-import_8ipf.html#a035a4df9f4508144149abdb0b46c87d1", null ], + [ "psh5_load_dataset_slabs", "pearl-pshell-import_8ipf.html#a2972587ec82cc2a261b8119a582b4215", null ], + [ "psh5_load_info", "pearl-pshell-import_8ipf.html#aa14b28120a07a8213e5a692930704a4b", null ], + [ "psh5_load_preview", "pearl-pshell-import_8ipf.html#a8ab28d3f4ef308e33b8701e44172dbf8", null ], + [ "psh5_load_reduced", "pearl-pshell-import_8ipf.html#a1444648f9a49e7d7aeef5b5fb55594aa", null ], + [ "psh5_load_scan_attrs", "pearl-pshell-import_8ipf.html#aec191d0167bbf606d24396f4658104b5", null ], + [ "psh5_load_scan_complete", "pearl-pshell-import_8ipf.html#a0a02f87e19e825964aa17c46ed51df8c", null ], + [ "psh5_load_scan_data", "pearl-pshell-import_8ipf.html#ad26b0b56d7ccd23547535091c9430569", null ], + [ "psh5_load_scan_info", "pearl-pshell-import_8ipf.html#a79ac37bb666b42c3332e9984196ccfe7", null ], + [ "psh5_load_scan_meta", "pearl-pshell-import_8ipf.html#aa56c25d64b3e59f74d6dd92a599cce4f", null ], + [ "psh5_load_scan_preview", "pearl-pshell-import_8ipf.html#ad3b9354b137ba4f1bc3ed2e74f24dc88", null ], + [ "psh5_load_scan_section", "pearl-pshell-import_8ipf.html#a83804ba9637debed6ef8b13e7b9b19e0", null ], + [ "psh5_open_file", "pearl-pshell-import_8ipf.html#accc20b0fc6bda95ba0cd0aea6633086f", null ], + [ "reduce_slab_image", "pearl-pshell-import_8ipf.html#acf0315ec8a3e927ef161a35cb05adb8b", null ], + [ "reduce_slab_worker", "pearl-pshell-import_8ipf.html#a33f8faf117450af1d6dae9ef48786cd6", null ], + [ "select_dataset", "pearl-pshell-import_8ipf.html#abb4afdef6ae4476c25a1ff77b17266c3", null ], + [ "twave2list", "pearl-pshell-import_8ipf.html#a92a18d6e81c3f521ba3bb240eaf578a9", null ], + [ "wave2list", "pearl-pshell-import_8ipf.html#aa6dc3e3f7dc1ca4346132635a90fc447", null ], + [ "kAngleDimLabel", "pearl-pshell-import_8ipf.html#a83930d4384b0238fc8416ba03dbc0386", null ], + [ "kDataDimLabel", "pearl-pshell-import_8ipf.html#a277cd450cca7832aa44f8097934e6acb", null ], + [ "kEnergyDimLabel", "pearl-pshell-import_8ipf.html#a5ad52cb10171572c454f9426d3a9be21", null ], + [ "kPreviewDatasets", "pearl-pshell-import_8ipf.html#a3c72087695969f42ea91c000de47b26e", null ], + [ "kScanDimLabel", "pearl-pshell-import_8ipf.html#a412b4753ceb753d705a113a26c018b22", null ], + [ "kScientaScalingDatasets", "pearl-pshell-import_8ipf.html#a03f00b3299bc3df671fcc239f7dd5418", null ], + [ "kTransposedDatasets", "pearl-pshell-import_8ipf.html#a0f2c168c04d075734edb995361aefb82", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-pshell-import_8ipf_source.html b/doc/html/pearl-pshell-import_8ipf_source.html new file mode 100644 index 0000000..9879df0 --- /dev/null +++ b/doc/html/pearl-pshell-import_8ipf_source.html @@ -0,0 +1,171 @@ + + + + + + +PEARL Procedures: pearl-pshell-import.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-pshell-import.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.36
3 #pragma ModuleName = PearlPShellImport
4 #pragma version = 1.03
5 #include <HDF5 Browser>
6 #include "pearl-gui-tools"
7 #include "pearl-area-import"
8 
9 // copyright (c) 2013-16 Paul Scherrer Institut
10 //
11 // Licensed under the Apache License, Version 2.0 (the "License");
12 // you may not use this file except in compliance with the License.
13 // You may obtain a copy of the License at
14 // http:///www.apache.org/licenses/LICENSE-2.0
15 
50 
55 
57 const string kEnergyDimLabel = "energy";
58 
60 const string kAngleDimLabel = "angle";
61 
63 const string kScanDimLabel = "scan";
64 
67 const string kDataDimLabel = "data";
68 
70 const string kPreviewDatasets = "ScientaImage;ScientaSpectrum;ImageAngleDistribution;ImageEnergyDistribution;Counts;SampleCurrent;";
71 
73 const string kScientaScalingDatasets = "LensMode;ScientaChannelBegin;ScientaChannelEnd;ScientaSliceBegin;ScientaSliceEnd;";
74 
76 const string kTransposedDatasets = "ScientaImage;";
77 
99 variable psh5_open_file(string ANickName, string APathName, string AFileName){
100  string ANickName
101  string APathName
102  string AFileName
103 
104  setdatafolder root:
105  newdatafolder /s /o $("root:" + ANickName)
106  dfref fileDF = GetDataFolderDFR()
107 
108  variable fileID
109  HDF5OpenFile /P=$APathName /R fileID as AFileName
110  if (v_flag == 0)
111  string /g s_filepath
112  string /g s_scanpaths
113  s_filepath = s_path + s_filename
114  s_scanpaths = psh5_list_scans(fileID)
115  else
116  fileID = 0
117  endif
118 
119  return fileID
120 };
121 
129 variable psh5_close_file(variable fileID){
130  variable fileID
131 
132  HDF5CloseFile fileID
133 };
134 
159 string psh5_load_complete(string ANickName, string APathName, string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
160  string ANickName
161  string APathName
162  string AFileName
163  variable load_data
164  variable load_attr
165 
166  if (ParamIsDefault(load_data))
167  load_data = 1
168  endif
169  if (ParamIsDefault(load_attr))
170  load_attr = 1
171  endif
172 
173  dfref saveDF = GetDataFolderDFR()
174 
175  // performance monitoring
176  variable timerRefNum
177  variable /g psh5_perf_secs
178  timerRefNum = startMSTimer
179 
180  variable fileID = psh5_open_file(ANickName, APathName, AFileName)
181  if (fileID)
182  dfref fileDF = GetDataFolderDFR()
183  svar s_filepath
184  svar s_scanpaths
185  AFileName = s_filepath
186  print "loading " + s_filepath + "\r"
187 
188  variable ig
189  variable ng = ItemsInList(s_scanpaths, ";")
190  string sg
191  string folder
192 
193  for (ig = 0; ig < ng; ig += 1)
194  sg = StringFromList(ig, s_scanpaths, ";")
195  folder = ReplaceString("/", sg, "")
196  folder = ReplaceString(" ", folder, "")
197  folder = CleanupName(folder, 0)
198  setdatafolder fileDF
199  newdatafolder /s /o $folder
200  psh5_load_scan_complete(fileID, sg, load_data=load_data, load_attr=load_attr)
201  endfor
202 
203  psh5_close_file(fileID)
204  else
205  AFileName = ""
206  endif
207 
208  psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
209 
210  setdatafolder saveDF
211  return AFileName
212 };
213 
245 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){
246  string ANickName
247  string APathName
248  string AFileName
249  variable load_data
250  variable load_attr
251  string pref_scans
252  string pref_datasets
253 
254  if (ParamIsDefault(load_data))
255  load_data = 1
256  endif
257  if (ParamIsDefault(load_attr))
258  load_attr = 1
259  endif
260  if (ParamIsDefault(pref_scans))
261  pref_scans = "*scan1*;"
262  endif
263  if (ParamIsDefault(pref_datasets))
264  pref_datasets = ""
265  endif
266 
267  dfref saveDF = GetDataFolderDFR()
268  setdatafolder root:
269  newdatafolder /o/s pearl_area
270  newdatafolder /o/s preview
271 
272  variable fileID
273  string scanpaths = ""
274  string dataname = ""
275 
276  // performance monitoring
277  variable timerRefNum
278  variable /g adh5_perf_secs
279  timerRefNum = startMSTimer
280 
281  HDF5OpenFile /P=$APathName /R /Z fileID as AFileName
282  if (v_flag == 0)
283  AFileName = s_path + s_filename
284  dfref fileDF = GetDataFolderDFR()
285 
286  scanpaths = psh5_list_scans(fileID)
287  variable ng = ItemsInList(scanpaths)
288  variable ig
289  string sg
290  variable np = ItemsInList(pref_scans)
291  variable ip
292  string sp
293  variable found = 0
294  if (ng > 0)
295  for (ip = 0; ip < np; ip += 1)
296  for (ig = 0; ig < ng; ig += 1)
297  sg = StringFromList(ig, scanpaths)
298  sp = StringFromList(ip, pref_scans)
299  if (StringMatch(sg, sp))
300  found = 1
301  break
302  endif
303  endfor
304  if (found)
305  break
306  endif
307  endfor
308  if (!found)
309  ig = 0
310  endif
311  sg = StringFromList(ig, scanpaths)
312 
313  if (load_attr)
314  setdatafolder fileDF
315  newdatafolder /o/s attr
316  killwaves /a/z
317  psh5_load_scan_attrs(fileID, sg)
318  endif
319 
320  setdatafolder fileDF
321  dataname = psh5_load_scan_preview(fileID, sg, set_scale=load_attr, pref_datasets=pref_datasets)
322 
323  wave /z data = $dataname
324  string destpath = GetDataFolder(1, saveDF) + ANickName
325  if (waveexists(data))
326  duplicate /o data, $destpath
327  wave /z data = $destpath
328  else
329  print "no data found in file " + AFileName
330  endif
331 
332  else
333  print "no scans found in file " + AFileName
334  endif
335 
336  HDF5CloseFile fileID
337  endif
338 
339  if (timerRefNum >= 0)
340  adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
341  endif
342 
343  setdatafolder saveDF
344  return dataname
345 };
346 
369 string psh5_load_scan_complete(variable fileID, string scanpath, variable load_data = defaultValue, variable load_attr = defaultValue){
370  variable fileID
371  string scanpath
372  variable load_data
373  variable load_attr
374 
375  if (ParamIsDefault(load_data))
376  load_data = 1
377  endif
378  if (ParamIsDefault(load_attr))
379  load_attr = 1
380  endif
381 
382  dfref saveDF = GetDataFolderDFR()
383 
384  dfref dataDF = GetDataFolderDFR()
385  string wavenames
386  string attrnames
387  psh5_load_scan_meta(fileID, scanpath)
388  if (load_attr)
389  newdatafolder /s /o attr
390  attrnames = psh5_load_scan_attrs(fileID, scanpath)
391  endif
392  if (load_data)
393  setdatafolder dataDF
394  wavenames = psh5_load_scan_data(fileID, scanpath)
395  endif
396  if (load_data && load_attr)
397  setdatafolder dataDF
399  endif
400 
401  setdatafolder saveDF
402  return wavenames
403 };
404 
413 string psh5_list_scans(variable fileID){
414  variable fileID
415 
416  HDF5ListGroup /F /TYPE=1 fileID, "/"
417 
418  variable ig
419  variable ng = ItemsInList(S_HDF5ListGroup, ";")
420  string sg
421  string scans = ""
422 
423  for (ig = 0; ig < ng; ig += 1)
424  sg = StringFromList(ig, S_HDF5ListGroup, ";")
425  if (cmpstr(sg[1,4], "scan") == 0)
426  scans = AddListItem(sg, scans, ";", inf)
427  endif
428  endfor
429 
430  return scans
431 };
432 
448 string psh5_list_scan_datasets(variable fileID, string scanpath, variable include_regions = defaultValue){
449  variable fileID
450  string scanpath
451  variable include_regions
452 
453  if (ParamIsDefault(include_regions))
454  include_regions = 0
455  endif
456  string result
457 
458  HDF5ListGroup /TYPE=2 /Z fileID, scanpath
459  result = S_HDF5ListGroup
460 
461  if (include_regions)
462  HDF5ListGroup /R /TYPE=2 /Z fileID, scanpath
463  variable n = ItemsInList(S_HDF5ListGroup)
464  variable i
465  string ds
466  string region_datasets
467  for (i = 0; i < n; i += 1)
468  ds = StringFromList(i, S_HDF5ListGroup)
469  if (StringMatch(ds, "region*/*"))
470  //region_datasets = psh5_list_scan_datasets(fileID, ReplaceString("//", scanpath + "/" + region, "/"), include_regions=0)
471  result = AddListItem(ds, result, ";", inf)
472  endif
473  endfor
474  endif
475 
476  return result
477 };
478 
489 string psh5_list_scan_regions(variable fileID, string scanpath){
490  variable fileID
491  string scanpath
492 
493  HDF5ListGroup /TYPE=1 /Z fileID, scanpath
494  variable n = ItemsInList(S_HDF5ListGroup)
495  variable i
496  string result = ""
497  string s
498  for (i = 0; i < n; i += 1)
499  s = StringFromList(i, S_HDF5ListGroup)
500  if (StringMatch(s, "region*"))
501  result = AddListItem(s, result, ";", inf)
502  endif
503  endfor
504 
505  return result
506 };
507 
522 string psh5_load_scan_data(variable fileID, string scanpath){
523  variable fileID
524  string scanpath
525 
526  string datasets = psh5_list_scan_datasets(fileID, scanpath, include_regions=1)
527  variable nds = ItemsInList(datasets)
528  variable ids
529  string sds
530  string sw
531  string wavenames = ""
532  for (ids = 0; ids < nds; ids += 1)
533  sds = StringFromList(ids, datasets)
534  sw = psh5_load_dataset(fileID, scanpath, sds, set_scale=0)
535  wavenames = AddListItem(sw, wavenames, ";", inf)
536  endfor
537 
538  return wavenames
539 };
540 
562 string psh5_load_scan_attrs(variable fileID, string scanpath, variable attr_sets = defaultValue){
563  variable fileID
564  string scanpath
565  variable attr_sets
566 
567  if (ParamIsDefault(attr_sets))
568  attr_sets = 1
569  endif
570 
571  string attr_path = ReplaceString("//", scanpath + "/attrs", "/")
572  string attr_list = ""
573  if (attr_sets & 1)
574  HDF5ListGroup /TYPE=2 /Z fileID, attr_path
575  if (!v_flag)
576  attr_list = S_HDF5ListGroup
577  endif
578  endif
579 
580  variable ids
581  variable nds
582  string sds
583 
584  if (attr_sets & 2)
585  nds = ItemsInList(kScientaScalingDatasets, ";")
586  for (ids = 0; ids < nds; ids += 1)
587  sds = StringFromList(ids, kScientaScalingDatasets)
588  if (WhichListItem(sds, attr_list) < 0)
589  attr_list = AddListItem(sds, attr_list, ";", inf)
590  endif
591  endfor
592  endif
593 
594  nds = ItemsInList(attr_list, ";")
595  string wavenames = ""
596  for (ids = 0; ids < nds; ids += 1)
597  sds = StringFromList(ids, attr_list, ";")
598  HDF5LoadData /O /Q /Z fileID, attr_path + "/" + sds
599  if (!v_flag)
600  wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
601  endif
602  endfor
603  wavenames = ReplaceString(";;", wavenames, ";")
604 
605  return wavenames
606 };
607 
630 string psh5_load_scan_meta(variable fileID, string scanpath){
631  variable fileID
632  string scanpath
633  string wavenames = ""
634 
635  HDF5LoadData /O /Q /Z /A="Dimensions" /N=ScanDimensions /TYPE=1 fileID, scanpath
636  if (!v_flag)
637  wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
638  else
639  make /n=1 /o ScanDimensions
640  ScanDimensions = 0
641  wavenames = AddListItem("ScanDimensions", wavenames, ";", inf)
642  endif
643  HDF5LoadData /O /Q /Z /A="Readables" /N=ScanReadables /TYPE=1 fileID, scanpath
644  if (!v_flag)
645  wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
646  else
647  make /n=1 /o /t ScanReadables
648  ScanReadables[0] = "ScientaSpectrum"
649  wavenames = AddListItem("ScanReadables", wavenames, ";", inf)
650  endif
651  HDF5LoadData /O /Q /Z /A="Writables" /N=ScanWritables /TYPE=1 fileID, scanpath
652  if (!v_flag)
653  wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
654  endif
655  HDF5LoadData /O /Q /Z /A="Steps" /N=ScanSteps /TYPE=1 fileID, scanpath
656  if (!v_flag)
657  wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
658  endif
659  wavenames = ReplaceString(";;", wavenames, ";")
660 
661  return wavenames
662 };
663 
697 string psh5_load_dataset(variable fileID, string scanpath, string datasetname, variable set_scale = defaultValue){
698  variable fileID
699  string scanpath
700  string datasetname
701  variable set_scale
702 
703  if (ParamIsDefault(set_scale))
704  set_scale = 1
705  endif
706 
707  dfref base_df = GetDataFolderDFR()
708 
709  string datasetpath
710  datasetpath = scanpath + "/" + datasetname
711  datasetpath = ReplaceString("//", datasetpath, "/")
712 
713  string regionname
714  string regionpath
715  if (ItemsInList(datasetname, "/") >= 2)
716  regionname = StringFromList(0, datasetname, "/")
717  regionpath = ReplaceString("//", scanpath + "/" + regionname, "/")
718  datasetname = RemoveListItem(0, datasetname, "/")
719  NewDataFolder /o/s $regionname
720  else
721  regionname = ""
722  regionpath = scanpath
723  endif
724 
725  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
726  InitHDF5DataInfo(di)
727  variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
728  if (err != 0)
729  print "error accessing detector/data"
730  return ""
731  endif
732 
733  string dataname
734  if (di.ndims < 2)
735  HDF5LoadData /O /Q /Z fileID, datasetpath
736  dataname = StringFromList(0, S_waveNames)
737  else
738  dataname = psh5_load_dataset_slabs(fileID, regionpath, datasetname)
739  endif
740 
741  wave /z data = $dataname
742  if (waveexists(data))
743  psh5_load_dataset_meta(fileID, regionpath, datasetname, data)
744  ps_set_dimlabels(data)
745  if (set_scale)
746  ps_scale_dataset(data)
747  endif
748  else
749  dataname = ""
750  endif
751 
752  setdatafolder base_df
753  return dataname
754 };
755 
769 static string select_dataset(string file_datasets, string pref_datasets){
770  string file_datasets
771  string pref_datasets
772 
773  variable index
774  variable nds = ItemsInList(file_datasets)
775  variable ids
776  string sds = ""
777  string mds = ""
778  variable np = ItemsInList(pref_datasets)
779  variable ip
780  string sp
781  variable found = 0
782  if (nds > 0)
783  for (ip = 0; ip < np; ip += 1)
784  for (ids = 0; ids < nds; ids += 1)
785  sds = StringFromList(ids, file_datasets)
786  index = ItemsInList(sds, "/") - 1
787  mds = StringFromList(index, sds, "/")
788  sp = StringFromList(ip, pref_datasets)
789  if (StringMatch(mds, sp))
790  found = 1
791  break
792  endif
793  endfor
794  if (found)
795  break
796  endif
797  endfor
798  if (!found)
799  ids = 0
800  sds = StringFromList(ids, file_datasets)
801  endif
802  endif
803 
804  return sds
805 };
806 
831 string psh5_load_scan_preview(variable fileID, string scanpath, variable set_scale = defaultValue, string pref_datasets = defaultValue){
832  variable fileID
833  string scanpath
834  variable set_scale
835  string pref_datasets
836 
837  if (ParamIsDefault(set_scale))
838  set_scale = 1
839  endif
840  if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
841  pref_datasets = kPreviewDatasets
842  endif
843 
844  dfref saveDF = GetDataFolderDFR()
845  dfref dataDF = saveDF
846 
847  string datasets = psh5_list_scan_datasets(fileID, scanpath, include_regions=1)
848  string datasetname = select_dataset(datasets, pref_datasets)
849  string datasetpath
850  datasetpath = scanpath + "/" + datasetname
851  datasetpath = ReplaceString("//", datasetpath, "/")
852 
853  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
854  InitHDF5DataInfo(di)
855  variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
856  if (err != 0)
857  print "error accessing detector/data"
858  return ""
859  endif
860 
861  string dataname
862  if (di.ndims < 2)
863  HDF5LoadData /O /Q /Z fileID, datasetpath
864  dataname = StringFromList(0, S_waveNames)
865  wave /z data = $dataname
866  if (waveexists(data))
867  ps_set_dimlabels(data)
868  endif
869  else
870  variable dim2start = 0
871  variable dim2count = 1
872  variable dim3start = 0
873  variable dim3count = 1
874  if (di.ndims >= 3)
875  dim2start = floor(di.dims[2] / 2)
876  dim2count = 1
877  endif
878  if (di.ndims >= 4)
879  dim3start = floor(di.dims[3] / 2)
880  dim3count = 1
881  endif
882 
883  dataname = psh5_load_dataset_slab(fileID, scanpath, datasetname, dim2start, dim2count, dim3start, dim3count)
884  endif
885 
886  wave /z data = $dataname
887  if (waveexists(data))
888  if (set_scale)
889  setdatafolder dataDF
890  string positioners
891  string positioner
892  string positionerpath
893  positioners = psh5_load_scan_meta(fileID, scanpath)
894  wave /t /z ScanWritables
895  if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
896  positioner = ScanWritables[0]
897  if (strlen(positioner) > 0)
898  positionerpath = scanpath + "/" + positioner
899  positionerpath = ReplaceString("//", positionerpath, "/")
900  HDF5LoadData /O /Q /Z fileID, positionerpath
901  endif
902  endif
903 
904  setdatafolder dataDF
905  newdatafolder /o/s attr
906  killwaves /a/z
907  psh5_load_scan_attrs(fileID, scanpath, attr_sets=2)
908  setdatafolder dataDF
909  ps_scale_dataset(data)
910  endif
911  else
912  dataname = ""
913  endif
914 
915  return dataname
916 };
917 
945 string psh5_load_scan_section(variable fileID, string scanpath, variable dim, variable set_scale = defaultValue, string pref_datasets = defaultValue){
946  variable fileID
947  string scanpath
948  variable dim
949  variable set_scale
950  string pref_datasets
951 
952  // select first dimension (future argument)
953  // 0 = first dimension is x axis (energy of scienta image)
954  dim = 0
955 
956  if (ParamIsDefault(set_scale))
957  set_scale = 1
958  endif
959  if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
960  pref_datasets = kPreviewDatasets
961  endif
962 
963  dfref saveDF = GetDataFolderDFR()
964  dfref dataDF = saveDF
965 
966  string datasets = psh5_list_scan_datasets(fileID, scanpath)
967  string datasetname = select_dataset(datasets, pref_datasets)
968  string datasetpath
969  datasetpath = scanpath + "/" + datasetname
970  datasetpath = ReplaceString("//", datasetpath, "/")
971  string dataname = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
972  string destname = dataname[0,29] + num2str(dim)
973 
974  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
975  InitHDF5DataInfo(di)
976  variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
977  if (err != 0)
978  print "error accessing detector/data"
979  return ""
980  else if (di.ndims != 3)
981  print "error: rank of dataset != 3"
982  return ""
983  endif
984 
985  variable idx, idy, idz, idt
986  variable transpose = WhichListItem(dataname, kTransposedDatasets) >= 0
987  if (transpose)
988  idx = 1
989  idy = 0
990  else
991  idx = 0
992  idy = 1
993  endif
994  idz = 2
995  idt = 3
996 
997  variable nx, ny, nz
998  nx = di.dims[idx]
999  ny = di.dims[idy]
1000  nz = di.dims[idz]
1001 
1002  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
1003  wave slab
1004  slab[][%Start] = 0
1005  slab[][%Stride] = 1
1006  slab[][%Count] = 1
1007  slab[][%Block] = 1
1008 
1009  if (dim == 0)
1010  slab[idy][%Start] = floor(ny / 2)
1011  slab[idx][%Block] = nx
1012  make /n=(nx,nz) /o $destname
1013  else
1014  slab[idx][%Start] = floor(nx / 2)
1015  slab[idy][%Block] = ny
1016  make /n=(ny,nz) /o $destname
1017  endif
1018  slab[idz][%Block] = nz
1019  wave data = $destname
1020  data = 0
1021 
1022  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1023  if (!v_flag)
1024  wave slabdata
1025  if (transpose)
1026  data += slabdata[0][p][q][0]
1027  else
1028  data += slabdata[p][0][q][0]
1029  endif
1030  endif
1031  killwaves /z slab, slabdata
1032 
1033  if (set_scale)
1034  make /n=(1,1,1) /free dummy
1035  ps_set_dimlabels2(dummy, dataname)
1036  setdimlabel 0, -1, $GetDimLabel(dummy, dim, -1), data
1037  setdimlabel 1, -1, $kScanDimLabel, data
1038 
1039  setdatafolder dataDF
1040  string positioners
1041  string positioner
1042  string positionerpath
1043  positioners = psh5_load_scan_meta(fileID, scanpath)
1044  wave /t /z ScanWritables
1045  if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1046  positioner = ScanWritables[0]
1047  if (strlen(positioner) > 0)
1048  positionerpath = scanpath + "/" + positioner
1049  positionerpath = ReplaceString("//", positionerpath, "/")
1050  HDF5LoadData /O /Q /Z fileID, positionerpath
1051  endif
1052  endif
1053 
1054  setdatafolder dataDF
1055  newdatafolder /o/s attr
1056  killwaves /a/z
1057  psh5_load_scan_attrs(fileID, scanpath, attr_sets=2)
1058  setdatafolder dataDF
1059  ps_scale_dataset(data)
1060  endif
1061 
1062  return destname
1063 };
1064 
1083 variable psh5_load_dataset_meta(variable fileID, string datapath, string datasetname, wave datawave){
1084  variable fileID
1085  string datapath
1086  string datasetname
1087  wave datawave
1088 
1089  dfref saveDF = GetDataFolderDFR()
1090  SetDataFolder NewFreeDataFolder()
1091 
1092  string datasetpath = datapath + "/" + datasetname
1093  datasetpath = ReplaceString("//", datasetpath, "/")
1094  string wnote
1095 
1096  HDF5LoadData /O /Q /Z /A="Writable Dimension" /N=WriteDim fileID, datasetpath
1097  if (!v_flag)
1098  wave WriteDim
1099  // scan dimension starts at 1
1100  sprintf wnote, "ScanDimension=%u", WriteDim[0]
1101  Note datawave, wnote
1102  endif
1103 
1104  HDF5LoadData /O /Q /Z /A="Writable Index" /N=WriteIndex fileID, datasetpath
1105  if (!v_flag)
1106  wave WriteIndex
1107  sprintf wnote, "WriteableIndex=%u", WriteIndex[0]
1108  Note datawave, wnote
1109  endif
1110 
1111  HDF5LoadData /O /Q /Z /A="Readable Index" /N=ReadIndex fileID, datasetpath
1112  if (!v_flag)
1113  wave ReadIndex
1114  sprintf wnote, "ReadableIndex=%u", ReadIndex[0]
1115  Note datawave, wnote
1116  endif
1117 
1118  setdatafolder saveDF
1119  return 0
1120 };
1121 
1140 string psh5_load_dataset_slabs(variable fileID, string datapath, string datasetname, variable progress = defaultValue){
1141  variable fileID
1142  string datapath
1143  string datasetname
1144  variable progress
1145 
1146  if (ParamIsDefault(progress))
1147  progress = 1
1148  endif
1149 
1150  variable result = 0
1151  string datasetpath
1152  string datawavename
1153  datasetpath = datapath + "/" + datasetname
1154  datasetpath = ReplaceString("//", datasetpath, "/")
1155  datawavename = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
1156 
1157  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
1158  InitHDF5DataInfo(di)
1159  variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1160  if (err != 0)
1161  print "error accessing detector/data"
1162  return ""
1163  endif
1164  if (di.ndims < 2)
1165  print "error: rank of dataset < 2"
1166  return ""
1167  else if (di.ndims < 3)
1168  progress = 0
1169  endif
1170 
1171  variable idx, idy, idz, idt, izt
1172  variable transpose = WhichListItem(datawavename, kTransposedDatasets) >= 0
1173  if (transpose)
1174  idx = 1
1175  idy = 0
1176  else
1177  idx = 0
1178  idy = 1
1179  endif
1180  idz = 2
1181  idt = 3
1182 
1183  variable nx, ny, nz, nt, nzt
1184  nx = di.dims[idx]
1185  ny = di.dims[idy]
1186  nz = di.dims[idz]
1187  nt = di.dims[idt]
1188  make /n=(nx,ny,nz,nt) /o $datawavename
1189  wave data = $datawavename
1190 
1191  nz = max(nz, 1)
1192  nt = max(nt, 1)
1193  nzt = nz * nt
1194  izt = 0
1195  if (progress)
1196  display_progress_panel("HDF5 Import", "Loading data...", nzt)
1197  endif
1198 
1199  // load data image by image
1200  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
1201  wave slab
1202  slab[][%Start] = 0
1203  slab[][%Stride] = 1
1204  slab[][%Count] = 1
1205  slab[][%Block] = 1
1206  slab[idx][%Block] = nx
1207  slab[idy][%Block] = ny
1208 
1209  variable iz, it
1210  for (iz = 0; iz < nz; iz += 1)
1211  for (it = 0; it < nt; it += 1)
1212  slab[idz][%Start] = iz
1213  slab[idt][%Start] = it
1214  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1215  wave slabdata// 2D, 3D, or 4D with singletons
1216  if (transpose)
1217  data[][][iz][it] = slabdata[q][p][0][0]
1218  else
1219  data[][][iz][it] = slabdata[p][q][0][0]
1220  endif
1221 
1222  // progress window
1223  izt += 1
1224  if (progress)
1225  if (update_progress_panel(izt))
1226  result = -4// user abort
1227  break
1228  endif
1229  endif
1230  endfor
1231  if (result < 0)
1232  break
1233  endif
1234  endfor
1235 
1236  if (progress)
1238  endif
1239 
1240  killwaves /z slab, slabdata
1241  if (!result)
1242  ps_set_dimlabels(data)
1243  return datawavename
1244  else
1245  killwaves /z data
1246  return ""
1247  endif
1248 };
1249 
1276 string psh5_load_dataset_slab(variable fileID, string datapath, string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count){
1277  variable fileID
1278  string datapath
1279  string datasetname
1280  variable dim2start
1281  variable dim2count
1282  variable dim3start
1283  variable dim3count
1284 
1285  string datasetpath
1286  string datawavename
1287  datasetpath = datapath + "/" + datasetname
1288  datasetpath = ReplaceString("//", datasetpath, "/")
1289  datawavename = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
1290 
1291  STRUCT HDF5DataInfo di
1292  InitHDF5DataInfo(di)
1293  variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1294  if (err != 0)
1295  print "error accessing detector/data"
1296  return ""
1297  endif
1298  if (di.ndims < 2)
1299  print "error: rank of dataset < 2"
1300  return ""
1301  endif
1302 
1303  variable idx, idy, idz, idt
1304  variable transpose = WhichListItem(datawavename, kTransposedDatasets) >= 0
1305  if (transpose)
1306  idx = 1
1307  idy = 0
1308  else
1309  idx = 0
1310  idy = 1
1311  endif
1312  idz = 2
1313  idt = 3
1314 
1315  variable nx, ny
1316  nx = di.dims[idx]
1317  ny = di.dims[idy]
1318  make /n=(nx,ny) /o $datawavename
1319  wave data = $datawavename
1320  data = 0
1321 
1322  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
1323  wave slab
1324  slab[][%Start] = 0
1325  slab[][%Stride] = 1
1326  slab[][%Count] = 1
1327  slab[][%Block] = 1
1328  slab[idx][%Block] = nx
1329  slab[idy][%Block] = ny
1330 
1331  variable iz, it
1332  variable navg = 0
1333  variable dim2end = dim2start + dim2count - 1
1334  variable dim3end = dim3start + dim3count - 1
1335  for (iz = dim2start; iz <= dim2end; iz += 1)
1336  for (it = dim3start; it <= dim3end; it += 1)
1337  slab[idz][%Start] = iz
1338  slab[idt][%Start] = it
1339  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1340  if (!v_flag)
1341  wave slabdata
1342  if (transpose)
1343  data += slabdata[q][p][0][0]
1344  else
1345  data += slabdata[p][q][0][0]
1346  endif
1347  navg += 1
1348  endif
1349  endfor
1350  endfor
1351  if (navg)
1352  data /= navg
1353  endif
1354 
1355  killwaves /z slab, slabdata
1356  ps_set_dimlabels(data)
1357  return datawavename
1358 };
1359 
1375 variable ps_set_dimlabels(wave data){
1376  wave data
1377 
1378  ps_set_dimlabels2(data, NameOfWave(data))
1379 };
1380 
1394 variable ps_set_dimlabels2(wave data, string name){
1395  wave data
1396  string name
1397 
1398  variable dummy
1399  try
1400  // intrinsic dimensions
1401  strswitch(name)
1402  case "ScientaImage":
1403  setdimlabel 0, -1, $kEnergyDimLabel, data
1404  setdimlabel 1, -1, $kAngleDimLabel, data
1405  if (WaveDims(data) >= 3)
1406  setdimlabel 2, -1, $kScanDimLabel, data
1407  endif
1408  AbortOnRTE
1409  break
1410  case "ImageAngleDistribution":
1411  case "ScientaAngleDistribution":
1412  if (WaveDims(data) >= 2)
1413  setdimlabel 0, -1, $kScanDimLabel, data
1414  setdimlabel 1, -1, $kAngleDimLabel, data
1415  else
1416  setdimlabel 0, -1, $kAngleDimLabel, data
1417  endif
1418  AbortOnRTE
1419  break
1420  case "ScientaSpectrum":
1421  case "ImageEnergyDistribution":
1422  case "ScientaEnergyDistribution":
1423  if (WaveDims(data) >= 2)
1424  setdimlabel 0, -1, $kScanDimLabel, data
1425  setdimlabel 1, -1, $kEnergyDimLabel, data
1426  else
1427  setdimlabel 0, -1, $kEnergyDimLabel, data
1428  endif
1429  AbortOnRTE
1430  break
1431  default:
1432  if (WaveDims(data) == 1)
1433  setdimlabel 0, -1, $kScanDimLabel, data
1434  AbortOnRTE
1435  else
1436  return 1
1437  endif
1438  endswitch
1439  catch
1440  dummy = GetRTError(1)
1441  return 2
1442  endtry
1443  return 0
1444 };
1445 
1451 static dfr find_scan_folder(dfref dataDF){
1452  dfref dataDF
1453 
1454  dfref attrDF = dataDF:attr
1455  if (!DataFolderRefStatus(attrDF))
1456  string df = GetDataFolder(1, dataDF) + ":"
1457  dfref scanDF = $df
1458  else
1459  dfref scanDF = dataDF
1460  endif
1461  return scanDF
1462 };
1463 
1468 static dfr find_attr_folder(dfref dataDF){
1469  dfref dataDF
1470 
1471  dfref attrDF = dataDF:attr
1472  if (!DataFolderRefStatus(attrDF))
1473  string df = GetDataFolder(1, dataDF) + ":"
1474  dfref scanDF = $df
1475  dfref attrDF = scanDF:attr
1476  endif
1477  return attrDF
1478 };
1479 
1497  dfref scanDF = GetDataFolderDFR()
1498  dfref attrDF = find_attr_folder(scanDF)
1499 
1500  make /n=3 /free lo, hi
1501  make /n=3 /t /free ax, un
1502  wave /t /z /SDFR=scanDF ScanReadables
1503  if (WaveExists(ScanReadables))
1504  variable isr
1505  variable nsr = numpnts(ScanReadables)
1506  string ssr
1507  string sdf
1508  for (isr = 0; isr < nsr; isr += 1)
1509  setdatafolder scanDF
1510  ssr = ScanReadables[isr]
1511  if (ItemsInList(ssr, "/") >= 2)
1512  sdf = StringFromList(0, ssr, "/")
1513  ssr = RemoveListItem(0, ssr, "/")
1514  setdatafolder $sdf
1515  endif
1516  wave /z wsr=$ssr
1517  if (WaveExists(wsr))
1518  ps_detect_scale(ax, lo, hi, un)
1519  ps_scale_dataset_2(wsr, ax, lo, hi, un)
1520  endif
1521  endfor
1522  endif
1523  setdatafolder scanDF
1524 };
1525 
1542 variable ps_scale_dataset(wave data){
1543  wave data
1544 
1545  dfref saveDF = GetDataFolderDFR()
1546  dfref dataDF = GetWavesDataFolderDFR(data)
1547 
1548  setdatafolder dataDF
1549  make /n=3 /free lo, hi
1550  make /n=3 /t /free ax, un
1551  ps_detect_scale(ax, lo, hi, un)
1552  ps_scale_dataset_2(data, ax, lo, hi, un)
1553  setdatafolder saveDF
1554 };
1555 
1556 static wave find_scale_wave(string name, dfref dataDF, dfref scanDF, dfref attrDF){
1557  string name
1558  dfref dataDF
1559  dfref scanDF
1560  dfref attrDF
1561 
1562  wave /SDFR=dataDF /Z w = $name
1563  if (!WaveExists(w))
1564  wave /SDFR=scanDF /Z w = $name
1565  if (!WaveExists(w))
1566  wave /SDFR=attrDF /Z w = $name
1567  endif
1568  endif
1569  return w
1570 };
1571 
1613 variable ps_detect_scale(wave ax, wave lo, wave hi, wave un){
1614  wave /t ax
1615  wave lo
1616  wave hi
1617  wave /t un
1618 
1619  dfref dataDF = GetDataFolderDFR()
1620  dfref scanDF = find_scan_folder(dataDF)
1621  dfref attrDF = find_attr_folder(dataDF)
1622 
1623  redimension /n=4 lo, hi, un, ax
1624  setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un, ax
1625  setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un, ax
1626  setdimlabel 0, 2, $kScanDimLabel, lo, hi, un, ax
1627  setdimlabel 0, 3, $kDataDimLabel, lo, hi, un, ax
1628 
1629  // default values
1630  lo[%$kEnergyDimLabel] = 0
1631  hi[%$kEnergyDimLabel] = 1
1632  un[%$kEnergyDimLabel] = "eV"
1633  ax[%$kEnergyDimLabel] = "Ekin"
1634 
1635  lo[%$kAngleDimLabel] = -1
1636  hi[%$kAngleDimLabel] = 1
1637  un[%$kAngleDimLabel] = "arb."
1638  un[%$kAngleDimLabel] = "slice"
1639 
1640  lo[%$kScanDimLabel] = 0
1641  hi[%$kScanDimLabel] = 1
1642  un[%$kScanDimLabel] = "arb."
1643  ax[%$kScanDimLabel] = "scan"
1644 
1645  lo[%$kDataDimLabel] = 0
1646  hi[%$kDataDimLabel] = 0
1647  un[%$kDataDimLabel] = "arb."
1648  ax[%$kDataDimLabel] = "value"
1649 
1650  wave /SDFR=attrDF /T /Z LensMode
1651  wave /Z ChannelBegin = find_scale_wave("ScientaChannelBegin", dataDF, scanDF, attrDF)
1652  wave /Z ChannelEnd = find_scale_wave("ScientaChannelEnd", dataDF, scanDF, attrDF)
1653  wave /Z SliceBegin = find_scale_wave("ScientaSliceBegin", dataDF, scanDF, attrDF)
1654  wave /Z SliceEnd = find_scale_wave("ScientaSliceEnd", dataDF, scanDF, attrDF)
1655 
1656  // lens mode can give more detail
1657  if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
1658  strswitch(LensMode[0])
1659  case "Angular45":
1660  lo[%$kAngleDimLabel] = -45/2
1661  hi[%$kAngleDimLabel] = +45/2
1662  un[%$kAngleDimLabel] = ""
1663  ax[%$kAngleDimLabel] = "angle"
1664  break
1665  case "Angular60":
1666  lo[%$kAngleDimLabel] = -60/2
1667  hi[%$kAngleDimLabel] = +60/2
1668  un[%$kAngleDimLabel] = ""
1669  ax[%$kAngleDimLabel] = "angle"
1670  break
1671  case "Transmission":
1672  un[%$kAngleDimLabel] = "arb."
1673  ax[%$kAngleDimLabel] = "offset"
1674  break
1675  endswitch
1676  endif
1677 
1678  // best option if scales are explicit in separate waves
1679  if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
1680  lo[%$kEnergyDimLabel] = ChannelBegin[0]
1681  hi[%$kEnergyDimLabel] = ChannelEnd[0]
1682  endif
1683  if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
1684  lo[%$kAngleDimLabel] = SliceBegin[0]
1685  hi[%$kAngleDimLabel] = SliceEnd[0]
1686  endif
1687 
1688  wave /z /t /SDFR=scanDF ScanWritables
1689  if (WaveExists(ScanWritables))
1690  wave /z /SDFR=scanDF scanner = $ScanWritables[0]
1691  if (!WaveExists(scanner))
1692  wave /z /SDFR=attrDF scanner = $ScanWritables[0]
1693  endif
1694  if (WaveExists(scanner) && (numpnts(scanner) >= 1))
1695  lo[%$kScanDimLabel] = scanner[0]
1696  hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
1697  ax[%$kScanDimLabel] = NameOfWave(scanner)
1698  strswitch(NameOfWave(scanner))
1699  case "Eph":
1700  ax[%$kScanDimLabel] = "photon energy"
1701  un[%$kScanDimLabel] = "eV"
1702  break
1703  case "ManipulatorX":
1704  case "ManipulatorY":
1705  case "ManipulatorZ":
1706  case "FocusYTrans":
1707  case "FocusZTrans":
1708  case "RefocusYTrans":
1709  case "RefocusZTrans":
1710  case "ExitSlitY":
1711  un[%$kScanDimLabel] = "mm"
1712  break
1713  case "ExitSlit":
1714  un[%$kScanDimLabel] = "m"
1715  break
1716  case "ManipulatorTheta":
1717  case "ManipulatorTilt":
1718  case "ManipulatorPhi":
1719  un[%$kScanDimLabel] = ""
1720  break
1721  case "FocusXRot":
1722  case "FocusYRot":
1723  case "FocusZRot":
1724  case "RefocusXRot":
1725  case "RefocusYRot":
1726  case "RefocusZRot":
1727  un[%$kScanDimLabel] = "mrad"
1728  break
1729  endswitch
1730  endif
1731  endif
1732 };
1733 
1767 variable ps_scale_dataset_2(wave data, wave ax, wave lo, wave hi, wave un){
1768  wave data
1769  wave /t ax
1770  wave lo
1771  wave hi
1772  wave /t un
1773 
1774  string sdim
1775  sdim = GetDimLabel(data, 0, -1)
1776  if (strlen(sdim))
1777  setscale /i x lo[%$sdim], hi[%$sdim], un[%$sdim], data
1778  Note data, "AxisLabelX=" + ax[%$sdim]
1779  endif
1780 
1781  sdim = GetDimLabel(data, 1, -1)
1782  if (strlen(sdim))
1783  setscale /i y lo[%$sdim], hi[%$sdim], un[%$sdim], data
1784  Note data, "AxisLabelY=" + ax[%$sdim]
1785  endif
1786 
1787  sdim = GetDimLabel(data, 2, -1)
1788  if (strlen(sdim))
1789  setscale /i z lo[%$sdim], hi[%$sdim], un[%$sdim], data
1790  Note data, "AxisLabelZ=" + ax[%$sdim]
1791  endif
1792 
1793  string data_unit = un[%$kDataDimLabel]
1794  string data_label = ax[%$kDataDimLabel]
1795  if (cmpstr(data_unit, "arb.") == 0)
1796  strswitch(NameOfWave(data))
1797  case "SampleCurrent":
1798  case "RefCurrent":
1799  case "AuxCurrent":
1800  data_unit = "A"
1801  data_label = "current"
1802  break
1803  case "MachineCurrent":
1804  data_unit = "mA"
1805  data_label = "current"
1806  break
1807  endswitch
1808  endif
1809  setscale d 0, 0, data_unit, data
1810  Note data, "AxisLabelD=" + data_label
1811  Note data, "Dataset=" + NameOfWave(data)
1812 };
1813 
1853 string psh5_load_reduced(string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable progress = defaultValue){
1854  string ANickName
1855  string APathName
1856  string AFileName
1857  funcref adh5_default_reduction reduction_func
1858  string reduction_param
1859  variable progress
1860 
1861  if (ParamIsDefault(progress))
1862  progress = 1
1863  endif
1864 
1865  dfref saveDF = GetDataFolderDFR()
1866 
1867  // performance monitoring
1868  variable timerRefNum
1869  variable /g psh5_perf_secs
1870  timerRefNum = startMSTimer
1871 
1872  variable fileID = psh5_open_file(ANickName, APathName, AFileName)
1873  string wavenames = ""
1874  if (fileID)
1875  dfref fileDF = GetDataFolderDFR()
1876  svar s_filepath
1877  svar s_scanpaths
1878  AFileName = s_filepath
1879  print "loading " + s_filepath + "\r"
1880 
1881  variable ig = 0
1882  variable ng = ItemsInList(s_scanpaths)
1883  string scanpath
1884  string folder
1885  string positioners
1886  string positioner
1887  string positionerpath
1888 
1889  scanpath = StringFromList(ig, s_scanpaths)
1890  folder = ReplaceString("/", scanpath, "")
1891  folder = ReplaceString(" ", folder, "")
1892  folder = CleanupName(folder, 0)
1893  setdatafolder fileDF
1894  newdatafolder /s /o $folder
1895  dfref dataDF = GetDataFolderDFR()
1896  positioners = psh5_load_scan_meta(fileID, scanpath)
1897  newdatafolder /s /o attr
1898  killwaves /a/z
1899  psh5_load_scan_attrs(fileID, scanpath)
1900  setdatafolder dataDF
1901  wave /t /z ScanWritables
1902  if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1903  positioner = ScanWritables[0]
1904  if (strlen(positioner) > 0)
1905  positionerpath = scanpath + "/" + positioner
1906  positionerpath = ReplaceString("//", positionerpath, "/")
1907  HDF5LoadData /O /Q /Z fileID, positionerpath
1908  endif
1909  endif
1910 
1911  setdatafolder dataDF
1912  string datasets = psh5_list_scan_datasets(fileID, scanpath, include_regions=1)
1913  string dataset = select_dataset(datasets, "ScientaImage")
1914  wavenames = psh5_load_dataset_reduced(fileID, scanpath, dataset, reduction_func, reduction_param, progress=progress)
1915 
1916  psh5_close_file(fileID)
1917  endif
1918 
1919  if (timerRefNum >= 0)
1920  psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
1921  endif
1922 
1923  setdatafolder saveDF
1924  return wavenames
1925 };
1926 
1927 
1976 string psh5_load_dataset_reduced(variable fileID, string scanpath, string datasetname, funcref reduction_func, string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
1977  variable fileID
1978  string scanpath
1979  string datasetname
1980  funcref adh5_default_reduction reduction_func
1981  string reduction_param
1982  variable progress
1983  variable nthreads
1984 
1985  if (ParamIsDefault(progress))
1986  progress = 1
1987  endif
1988  if (ParamIsDefault(nthreads))
1989  nthreads = -1
1990  endif
1991 
1992  dfref base_df = GetDataFolderDFR()
1993  variable result = 0
1994  string datasetpath
1995  string datawavename
1996  string wavenames = ""
1997 
1998  datasetpath = scanpath + "/" + datasetname
1999  datasetpath = ReplaceString("//", datasetpath, "/")
2000  datawavename = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
2001 
2002  string regionname
2003  string regionpath
2004  if (ItemsInList(datasetname, "/") >= 2)
2005  regionname = StringFromList(0, datasetname, "/")
2006  regionpath = ReplaceString("//", scanpath + "/" + regionname, "/")
2007  datasetname = RemoveListItem(0, datasetname, "/")
2008  NewDataFolder /o/s $regionname
2009  else
2010  regionname = ""
2011  regionpath = scanpath
2012  endif
2013 
2014  STRUCT HDF5DataInfo di// Defined in HDF5 Browser.ipf.
2015  InitHDF5DataInfo(di)
2016  variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
2017  if (err != 0)
2018  print "error accessing detector/data"
2019  result = -1
2020  return wavenames
2021  endif
2022  if (di.ndims < 2)
2023  print "error: rank of dataset < 2"
2024  result = -2
2025  return wavenames
2026  else if (di.ndims < 3)
2027  progress = 0
2028  endif
2029 
2030  variable idx, idy, idz, idt
2031  variable transpose = WhichListItem(datawavename, kTransposedDatasets) >= 0
2032  if (transpose)
2033  idx = 1
2034  idy = 0
2035  else
2036  idx = 0
2037  idy = 1
2038  endif
2039  idz = 2
2040  idt = 3
2041 
2042  variable nx, ny, nz, nt, nzt
2043  nx = di.dims[idx]
2044  ny = di.dims[idy]
2045  nz = di.dims[idz]
2046  nt = di.dims[idt]
2047  // adjust singleton dimensions
2048  nz = max(nz, 1)
2049  nt = max(nt, 1)
2050  nzt = nz * nt
2051 
2052  // load data image by image
2053  HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
2054  wave slab
2055  slab[][%Start] = 0
2056  slab[][%Stride] = 1
2057  slab[][%Count] = 1
2058  slab[][%Block] = 1
2059  slab[idx][%Block] = nx
2060  slab[idy][%Block] = ny
2061 
2062  // set up multi threading
2063  if (nthreads < 0)
2064  nthreads = ThreadProcessorCount
2065  endif
2066  if (nthreads > 0)
2067  variable threadGroupID = ThreadGroupCreate(nthreads)
2068  variable ithread
2069  for (ithread = 0; ithread < nthreads; ithread += 1)
2070  ThreadStart threadGroupID, ithread, reduce_slab_worker(reduction_func)
2071  endfor
2072  else
2073  make /n=(nzt) /df /free processing_folders
2074  endif
2075 
2076  if (progress)
2077  display_progress_panel("HDF5 Import", "Loading data (step 1 of 2)...", nzt)
2078  endif
2079 
2080  make /n=(nx,ny) /d /o image_template
2081  setdimlabel 0, -1, $kEnergyDimLabel, image_template
2082  setdimlabel 1, -1, $kAngleDimLabel, image_template
2083  ps_scale_dataset(image_template)
2084 
2085  variable iz, it, izt
2086  string dfname
2087  izt = 0
2088  for (iz = 0; iz < nz; iz += 1)
2089  for (it = 0; it < nt; it += 1)
2090  // load hyperslab
2091  slab[idz][%Start] = iz
2092  slab[idt][%Start] = it
2093  dfname = "processing_" + num2str(izt)
2094  newdatafolder /s $dfname
2095  HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
2096 
2097  // send to processing queue
2098  duplicate image_template, image
2099  variable /g r_index = iz
2100  variable /g s_index = it
2101  string /g func_param = reduction_param
2102 
2103  if (nthreads > 0)
2104  WaveClear image
2105  ThreadGroupPutDF threadGroupID, :
2106  else
2107  processing_folders[izt] = GetDataFolderDFR()
2108  make /n=1/d profile1, profile2
2109  wave slabdata
2110  variable /g func_result
2111  func_result = reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
2112  WaveClear slabdata, image, profile1, profile2
2113  setdatafolder ::
2114  endif
2115 
2116  izt += 1
2117  // progress window
2118  if (progress)
2119  if (update_progress_panel(izt))
2120  print "user abort"
2121  result = -4
2122  break
2123  endif
2124  endif
2125  endfor
2126  endfor
2127 
2128  killwaves /z slab, slabdata, image_template
2129  if (progress)
2130  update_progress_panel(0, message="Processing data (step 2 of 2)...")
2131  endif
2132 
2133  dfref dfr
2134  for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
2135  if (nthreads > 0)
2136  do
2137  dfr = ThreadGroupGetDFR(threadGroupID, 1000)
2138  if (DatafolderRefStatus(dfr) != 0)
2139  break
2140  endif
2141  if (progress)
2142  if (update_progress_panel(izt))
2143  print "user abort"
2144  result = -4
2145  break
2146  endif
2147  endif
2148  while (1)
2149  else
2150  dfr = processing_folders[izt]
2151  if (progress)
2152  if (update_progress_panel(izt))
2153  print "user abort"
2154  result = -4
2155  break
2156  endif
2157  endif
2158  endif
2159 
2160  if (result != 0)
2161  break
2162  endif
2163 
2164  nvar rr = dfr:r_index
2165  nvar ss = dfr:s_index
2166  nvar func_result = dfr:func_result
2167  wave profile1 = dfr:profile1
2168  wave profile2 = dfr:profile2
2169 
2170  if (func_result == 0)
2171  if (izt == 0)
2172  make /n=(dimsize(profile1, 0), nz, nt) /d /o ReducedData1
2173  make /n=(dimsize(profile2, 0), nz, nt) /d /o ReducedData2
2174  setdimlabel 0, -1, $getdimlabel(profile1, 0, -1), ReducedData1
2175  setdimlabel 0, -1, $getdimlabel(profile2, 0, -1), ReducedData2
2176  setdimlabel 1, -1, $kScanDimLabel, ReducedData1
2177  setdimlabel 1, -1, $kScanDimLabel, ReducedData2
2178  setscale /p x dimoffset(profile1, 0), dimdelta(profile1, 0), waveunits(profile1, 0), ReducedData1
2179  setscale /p x dimoffset(profile2, 0), dimdelta(profile2, 0), waveunits(profile2, 0), ReducedData2
2180  setscale d 0, 0, waveunits(profile1, -1), ReducedData1
2181  setscale d 0, 0, waveunits(profile2, -1), ReducedData2
2182  endif
2183  ReducedData1[][rr][ss] = profile1[p]
2184  ReducedData2[][rr][ss] = profile2[p]
2185  else
2186  print "error during data reduction."
2187  result = -3
2188  break
2189  endif
2190  endfor
2191 
2192  if (nthreads > 0)
2193  variable tstatus = ThreadGroupRelease(threadGroupID)
2194  if (tstatus == -2)
2195  print "error: thread did not terminate properly."
2196  result = -5
2197  endif
2198  else
2199  for (izt = 0; izt < nzt; izt += 1)
2200  KillDataFolder /Z processing_folders[izt]
2201  endfor
2202  endif
2203 
2204  if (result == 0)
2205  if (nz == 1)
2206  redimension /n=(-1, 0, 0) ReducedData1
2207  redimension /n=(-1, 0, 0) ReducedData2
2208  else if (nt == 1)
2209  redimension /n=(-1, nz, 0) ReducedData1
2210  redimension /n=(-1, nz, 0) ReducedData2
2211  endif
2212  wavenames = "ReducedData1;ReducedData2;"
2213  ps_scale_dataset(ReducedData1)
2214  ps_scale_dataset(ReducedData2)
2215  endif
2216  if (progress)
2218  endif
2219 
2220  setdatafolder base_df
2221  return wavenames
2222 };
2223 
2224 threadsafe static variable reduce_slab_worker(funcref reduction_func){
2225  funcref adh5_default_reduction reduction_func
2226  do
2227  // wait for job from main thread
2228  do
2229  dfref dfr = ThreadGroupGetDFR(0, 1000)
2230  if (DataFolderRefStatus(dfr) == 0)
2231  if (GetRTError(2))
2232  return 0// no more jobs
2233  endif
2234  else
2235  break
2236  endif
2237  while (1)
2238 
2239  // get input data
2240  wave slabdata = dfr:slabdata
2241  wave image = dfr:image
2242  svar func_param = dfr:func_param
2243  nvar rr = dfr:r_index
2244  nvar ss = dfr:s_index
2245 
2246  // do the work
2247  newdatafolder /s outDF
2248  make /n=1/d profile1, profile2
2249  variable /g r_index = rr
2250  variable /g s_index = ss
2251  variable /g func_result
2252  func_result = reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
2253 
2254  // send output to queue and clean up
2255  WaveClear slabdata, image, profile1, profile2
2256  ThreadGroupPutDF 0, :
2257  KillDataFolder dfr
2258  while (1)
2259 
2260  return 0
2261 };
2262 
2263 threadsafe static variable reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param){
2264  wave slabdata
2265  wave image
2266  wave profile1
2267  wave profile2
2268  funcref adh5_default_reduction reduction_func
2269  string reduction_param
2270 
2271  image = slabdata[q][p][0][0]
2272 
2273  return reduction_func(image, profile1, profile2, reduction_param)
2274 };
2275 
2290 string psh5_load_info(string APathName, string AFileName){
2291  string APathName
2292  string AFileName
2293 
2294  dfref saveDF = GetDataFolderDFR()
2295  dfref fileDF = NewFreeDataFolder()
2296  setdatafolder fileDF
2297 
2298  variable fileID
2299  string filepath
2300  string scanpaths
2301  variable nscans
2302  variable iscan
2303  string scanpath
2304  string info = ""
2305 
2306  HDF5OpenFile /P=$APathName /R fileID as AFileName
2307  if (v_flag == 0)
2308  filepath = s_path + s_filename
2309  scanpaths = psh5_list_scans(fileID)
2310  nscans = ItemsInList(scanpaths)
2311  for (iscan = 0; iscan < nscans; iscan += 1)
2312  scanpath = StringFromList(iscan, scanpaths)
2313  info = info + scanpath + "\r"
2314  info = info + psh5_load_scan_info(fileID, scanpath)
2315  endfor
2316  HDF5CloseFile fileID
2317  endif
2318 
2319  setdatafolder saveDF
2320  return info
2321 };
2322 
2336 string psh5_load_scan_info(variable fileID, string scanpath){
2337  variable fileID
2338  string scanpath
2339 
2340  string info = ""
2341  string positions = ""
2342  string positioners = ""
2343  string detectors = ""
2344 
2345  psh5_load_scan_meta(fileID, scanpath)
2346  wave /z ScanDimensions
2347  wave /t /z ScanWritables
2348  wave /t /z ScanReadables
2349  wave /z ScanSteps
2350 
2351  if (WaveExists(ScanSteps) && (numpnts(ScanSteps) >= 1))
2352  ScanSteps += 1
2353  positions = "positions = (" + wave2list(ScanSteps, "%u", ",") + ")"
2354  info = AddListItem(positions, info, "\r", inf)
2355  endif
2356  if (WaveExists(ScanWritables) && (numpnts(ScanWritables) >= 1))
2357  positioners = "positioners = " + twave2list(ScanWritables, ",")
2358  info = AddListItem(positioners, info, "\r", inf)
2359  endif
2360  if (WaveExists(ScanReadables) && (numpnts(ScanReadables) >= 1))
2361  detectors = "detectors = " + twave2list(ScanReadables, ",")
2362  info = AddListItem(detectors, info, "\r", inf)
2363  endif
2364 
2365  return info
2366 };
2367 
2371 static string twave2list(wave wt, string sep){
2372  wave /t wt
2373  string sep
2374 
2375  string list = ""
2376  variable n = numpnts(wt)
2377  variable i
2378  for (i = 0; i < n; i += 1)
2379  list = AddListItem(wt[i], list, sep, inf)
2380  endfor
2381 
2382  return list
2383 };
2384 
2388 static string wave2list(wave w, string format, string sep){
2389  wave w
2390  string format
2391  string sep
2392 
2393  string list = ""
2394  variable n = numpnts(w)
2395  variable i
2396  string s
2397  for (i = 0; i < n; i += 1)
2398  sprintf s, format, w[i]
2399  list = AddListItem(s, list, sep, inf)
2400  endfor
2401 
2402  return list
2403 };
2404 
string psh5_list_scan_regions(variable fileID, string scanpath)
list regions of a PShell scan group.
+
const string kEnergyDimLabel
Dimension label for the energy dispersive dimension of multi-dimensional datasets.
+
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 psh5_load_dataset_reduced(variable fileID, string scanpath, string datasetname, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
load a reduced dataset from the open PShell HDF5 file.
+
variable kill_progress_panel()
+
variable display_progress_panel(string title, string message, variable progress_max)
+
string psh5_load_scan_preview(variable fileID, string scanpath, variable set_scale=defaultValue, string pref_datasets=defaultValue)
load a preview dataset from an open PShell HDF5 file.
+
string psh5_load_scan_attrs(variable fileID, string scanpath, variable attr_sets=defaultValue)
load attributes of a PShell scan group.
+
const string kTransposedDatasets
List of datasets that should be transposed upon loading.
+
string psh5_load_scan_complete(variable fileID, string scanpath, variable load_data=defaultValue, variable load_attr=defaultValue)
load all data of a selected scan from a PShell data file.
+
static threadsafe variable reduce_slab_worker(funcref reduction_func)
+
variable ps_set_dimlabels2(wave data, string name)
set dimension labels according to the axis type
+
const string kScanDimLabel
Dimension label for the scan dimension of multi-dimensional datasets.
+
string psh5_load_dataset(variable fileID, string scanpath, string datasetname, variable set_scale=defaultValue)
load a dataset from an open PShell HDF5 file.
+
variable ps_set_dimlabels(wave data)
set dimension labels according to the axis type
+
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 dfr find_scan_folder(dfref dataDF)
find the scan folder
+
const string kAngleDimLabel
Dimension label for the angle dispersive dimension of multi-dimensional datasets. ...
+
static string twave2list(wave wt, string sep)
convert text wave to list.
+
variable ps_scale_dataset_2(wave data, wave ax, wave lo, wave hi, wave un)
set the dimension scales of a dataset.
+
static string wave2list(wave w, string format, string sep)
convert numeric wave to list.
+
static threadsafe variable reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param)
+
static string select_dataset(string file_datasets, string pref_datasets)
select the preferred dataset from a list of available datasets.
+
const string kDataDimLabel
Dimension label for the data dimension.
+
variable psh5_open_file(string ANickName, string APathName, string AFileName)
open a HDF5 file created by the PShell data acquisition program and prepare the data folder...
+
string psh5_load_dataset_slabs(variable fileID, string datapath, string datasetname, variable progress=defaultValue)
load a dataset slab-wise from the open PShell HDF5 file.
+
variable ps_scale_datasets()
set the dimension scales of loaded PShell Scienta datasets according to attributes.
+
string psh5_load_scan_meta(variable fileID, string scanpath)
load metadata of a PShell scan group.
+
threadsafe variable adh5_default_reduction(wave source, wave dest1, wave dest2, string *param)
function prototype for adh5_load_reduced_detector
+
const string kScientaScalingDatasets
List of datasets that must be loaded to determine the axis scaling of a Scienta image.
+
string psh5_load_scan_section(variable fileID, string scanpath, variable dim, variable set_scale=defaultValue, string pref_datasets=defaultValue)
load a longitudinal section of a scan from an open PShell HDF5 file.
+
string psh5_list_scan_datasets(variable fileID, string scanpath, variable include_regions=defaultValue)
list datasets of a PShell scan group.
+
string psh5_load_info(string APathName, string AFileName)
load descriptive info from a PShell data file.
+
string psh5_load_dataset_slab(variable fileID, string datapath, string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count)
load a single image from the open PShell data file.
+
string psh5_load_scan_data(variable fileID, string scanpath)
load all datasets of a PShell scan group.
+
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 dfr find_attr_folder(dfref dataDF)
find the attributes data folder
+
static wave find_scale_wave(string name, dfref dataDF, dfref scanDF, dfref attrDF)
+
variable update_progress_panel(variable progress, string message=defaultValue, variable progress_max=defaultValue)
+
string psh5_list_scans(variable fileID)
list scan groups of a PShell data file.
+
variable psh5_close_file(variable fileID)
close a HDF5 file opened by psh5_open_file.
+
variable ps_detect_scale(wave ax, wave lo, wave hi, wave un)
detect the dimension scales from attributes.
+
variable psh5_load_dataset_meta(variable fileID, string datapath, string datasetname, wave datawave)
load metadata of a PShell dataset.
+
const string kPreviewDatasets
List of preferred datasets to load for preview.
+
variable ps_scale_dataset(wave data)
set the dimension scales of a loaded PShell Scienta dataset according to attributes.
+
string psh5_load_scan_info(variable fileID, string scanpath)
load descriptive info from a PShell scan.
+
+
+ + + + diff --git a/doc/html/pearl-scienta-preprocess_8ipf.html b/doc/html/pearl-scienta-preprocess_8ipf.html new file mode 100644 index 0000000..74c7508 --- /dev/null +++ b/doc/html/pearl-scienta-preprocess_8ipf.html @@ -0,0 +1,708 @@ + + + + + + +PEARL Procedures: pearl-scienta-preprocess.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-scienta-preprocess.ipf File Reference
+
+
+ +

preprocessing functions for Scienta detector images. +More...

+ +

Go to the source code of this file.

+ + + + + +

+Namespaces

 PearlScientaPreprocess
 preprocessing functions for Scienta detector images.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

variable prompt_int_linbg_reduction (string *param)
 
string capture_int_linbg_cursors ()
 
string csr_int_linbg_reduction (string win)
 
variable test_int_linbg (wave image)
 
threadsafe variable int_linbg_reduction (wave source, wave dest1, wave dest2, string *param)
 
variable test_shockley_anglefit (wave image, variable branch)
 
variable prompt_Shockley_anglefit (string *param)
 
threadsafe variable Shockley_anglefit (wave source, wave dest1, wave dest2, string *param)
 
variable prompt_int_quadbg_reduction (string *param)
 
variable test_int_quadbg (wave image)
 
threadsafe variable int_quadbg_reduction (wave source, wave dest1, wave dest2, string *param)
 
variable scienta_norm (wave w, variable x)
 
wave fit_scienta_ang_transm (wave data, wave params)
 
threadsafe variable scienta_ang_transm (wave w, variable x)
 
wave fit_scienta_poly_bg (wave data, wave params, variable bgterms)
 
variable scienta_poly_bg (wave w, variable e, variable a)
 
variable prompt_redim_linbg_reduction (string *param)
 parameter dialog for the redim_linbg_reduction() function More...
 
threadsafe variable redim_linbg_reduction (wave source, wave dest1, wave dest2, string *param)
 linear background reduction function for incorrectly dimensioned scienta image More...
 
+

Detailed Description

+

preprocessing functions for Scienta detector images.

+

this procedure contains functions for data reduction and instrument-specific normalization.

+
Author
matthias muntwiler, matth.nosp@m.ias..nosp@m.muntw.nosp@m.iler.nosp@m.@psi..nosp@m.ch
+ + +

Definition in file pearl-scienta-preprocess.ipf.

+

Function Documentation

+ +
+
+ + + + + + + +
string capture_int_linbg_cursors ()
+
+ +

Definition at line 65 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
string csr_int_linbg_reduction (string win)
+
+ +

Definition at line 75 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
wave fit_scienta_ang_transm (wave data,
wave params 
)
+
+ +

Definition at line 550 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
wave fit_scienta_poly_bg (wave data,
wave params,
variable bgterms 
)
+
+ +

Definition at line 609 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable int_linbg_reduction (wave source,
wave dest1,
wave dest2,
string * param 
)
+
+ +

Definition at line 196 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable int_quadbg_reduction (wave source,
wave dest1,
wave dest2,
string * param 
)
+
+ +

Definition at line 456 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable prompt_int_linbg_reduction (string * param)
+
+ +

Definition at line 35 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable prompt_int_quadbg_reduction (string * param)
+
+ +

Definition at line 409 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable prompt_redim_linbg_reduction (string * param)
+
+ +

parameter dialog for the redim_linbg_reduction() function

+
Parameters
+ + +
paramparameter string in a key1=value1;key2=value2;... list. the parameter string is passed by reference. see redim_linbg_reduction() for a description of parameters.
+
+
+
Returns
zero if the user clicked OK, non-zero if the user clicked Cancel.
+ +

Definition at line 715 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable prompt_Shockley_anglefit (string * param)
+
+ +

Definition at line 321 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable redim_linbg_reduction (wave source,
wave dest1,
wave dest2,
string * param 
)
+
+ +

linear background reduction function for incorrectly dimensioned scienta image

+

if the energy step size does not divide the energy range to an integer number, the scienta image is exported with the wrong array size. this can be fixed by redimensioning the array.

+

the current implementation works in the case where dimension 0 needs to be incremented. the function may be generalized to dimension 1 and/or decrementing by additional parameters. it is not known yet whether a generalization is needed or whether it can cover all cases.

+

background subtraction and peak integration is the same as by the int_linbg_reduction() function.

+
Parameters
+ + + + + +
sourcesource wave Scienta detector image, energy axis along X, angle axis along Y
dest1destination wave 1
dest2destination wave 2 each wave is a one-dimensional intensity distribution the function may redimension these waves to one of the image dimensions (it must be clear to the user which dimension this is). the meaning of dest1 and dest2 is up to the particular function, e.g. dest1 could hold the mean value and dest2 the one-sigma error, or dest1 could hold the X-profile, and dest2 the Y-profile.
paramparameter string in a key1=value1;key2=value2;... list. the parameter string is passed by reference.
+
+
+

all region parameters are relative to the image size (0...1).

    +
  • Lcrop size of the lower cropping region
  • +
  • Hcrop size of the upper cropping region
  • +
  • Lsize size of the lower background integration region
  • +
  • Hsize size of the upper background integration region
  • +
  • Cpos center position of the of the peak integration region
  • +
  • Csize size of the peak integration region
  • +
+

typical values (peak centered on detector, FWHM ~ 20 % of image) Lcrop=0.11;Hcrop=0.11;Lsize=0.2;Hsize=0.2;Cpos=0.5;Csize=0.2

+
Returns
zero if successful, non-zero if an error occurs.
+ +

Definition at line 786 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
threadsafe variable scienta_ang_transm (wave w,
variable x 
)
+
+ +

Definition at line 577 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable scienta_norm (wave w,
variable x 
)
+
+ +

Definition at line 543 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable scienta_poly_bg (wave w,
variable e,
variable a 
)
+
+ +

Definition at line 653 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
threadsafe variable Shockley_anglefit (wave source,
wave dest1,
wave dest2,
string * param 
)
+
+ +

Definition at line 336 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable test_int_linbg (wave image)
+
+ +

Definition at line 179 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + +
variable test_int_quadbg (wave image)
+
+ +

Definition at line 439 of file pearl-scienta-preprocess.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable test_shockley_anglefit (wave image,
variable branch 
)
+
+ +

Definition at line 296 of file pearl-scienta-preprocess.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-scienta-preprocess_8ipf.js b/doc/html/pearl-scienta-preprocess_8ipf.js new file mode 100644 index 0000000..890d7a2 --- /dev/null +++ b/doc/html/pearl-scienta-preprocess_8ipf.js @@ -0,0 +1,21 @@ +var pearl_scienta_preprocess_8ipf = +[ + [ "capture_int_linbg_cursors", "pearl-scienta-preprocess_8ipf.html#ae6877c51ad15c2ba8a69c65356cb34b8", null ], + [ "csr_int_linbg_reduction", "pearl-scienta-preprocess_8ipf.html#a95fbd22f52f61d2bff0625b7b8e159d1", null ], + [ "fit_scienta_ang_transm", "pearl-scienta-preprocess_8ipf.html#a8536a1da8aa85e34370f384ad2ee0d5e", null ], + [ "fit_scienta_poly_bg", "pearl-scienta-preprocess_8ipf.html#a4f850a816852a1d0e22deaf894765c2c", null ], + [ "int_linbg_reduction", "pearl-scienta-preprocess_8ipf.html#a4e5ae4a68d9caa4710db477d71e2b9e0", null ], + [ "int_quadbg_reduction", "pearl-scienta-preprocess_8ipf.html#aa5ac074dd3e405d13d3c4401d96e4743", null ], + [ "prompt_int_linbg_reduction", "pearl-scienta-preprocess_8ipf.html#a145c7275b8809c5e789b932ef46e4811", null ], + [ "prompt_int_quadbg_reduction", "pearl-scienta-preprocess_8ipf.html#a6d06ea5a11ba79160efeea7fe673af8c", null ], + [ "prompt_redim_linbg_reduction", "pearl-scienta-preprocess_8ipf.html#a6e7de6441bbcba217760448babaca827", null ], + [ "prompt_Shockley_anglefit", "pearl-scienta-preprocess_8ipf.html#ab3e0823a6ec7d85e08276cd32d0ffd21", null ], + [ "redim_linbg_reduction", "pearl-scienta-preprocess_8ipf.html#a9b3321b9ed876ff50e260fa311ebf4be", null ], + [ "scienta_ang_transm", "pearl-scienta-preprocess_8ipf.html#a26f46acd339fb483ce9792e06170c189", null ], + [ "scienta_norm", "pearl-scienta-preprocess_8ipf.html#a09ae6058d39d76a59c862e945d512fa8", null ], + [ "scienta_poly_bg", "pearl-scienta-preprocess_8ipf.html#a26e51aa77d5f416d613f1c5df82b6f5c", null ], + [ "Shockley_anglefit", "pearl-scienta-preprocess_8ipf.html#adc472d56286afd855109d561fbf633bd", null ], + [ "test_int_linbg", "pearl-scienta-preprocess_8ipf.html#a01fdc27931518dc988500b3cba409e57", null ], + [ "test_int_quadbg", "pearl-scienta-preprocess_8ipf.html#a1b1f473b96119afa602759a51e0c5b4c", null ], + [ "test_shockley_anglefit", "pearl-scienta-preprocess_8ipf.html#ad9c09259aaaf32246fe9391dfb3e2c93", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-scienta-preprocess_8ipf_source.html b/doc/html/pearl-scienta-preprocess_8ipf_source.html new file mode 100644 index 0000000..243d9c9 --- /dev/null +++ b/doc/html/pearl-scienta-preprocess_8ipf_source.html @@ -0,0 +1,146 @@ + + + + + + +PEARL Procedures: pearl-scienta-preprocess.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-scienta-preprocess.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 = PearlScientaPreprocess
4 #pragma version = 1.02
5 
6 // $Id$
7 // author: matthias.muntwiler@psi.ch
8 // Copyright (c) 2013-14 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 
29 
34 
35 variable prompt_int_linbg_reduction(string* param){
36  string &param
37 
38  variable Lcrop = NumberByKey("Lcrop", param, "=", ";")
39  variable Lsize = NumberByKey("Lsize", param, "=", ";")
40  variable Hcrop = NumberByKey("Hcrop", param, "=", ";")
41  variable Hsize = NumberByKey("Hsize", param, "=", ";")
42  variable Cpos = NumberByKey("Cpos", param, "=", ";")
43  variable Csize = NumberByKey("Csize", param, "=", ";")
44 
45  prompt Lcrop, "Lower cropping region"
46  prompt Hcrop, "Upper cropping region"
47  prompt Lsize, "Lower background region"
48  prompt Hsize, "Upper background region"
49  prompt Cpos, "Center position"
50  prompt Csize, "Center integration region"
51 
52  doprompt "int_linbg_reduction Parameters", lcrop, hcrop, lsize, hsize, cpos, csize
53  if (v_flag == 0)
54  param = ReplaceNumberByKey("Lcrop", param, Lcrop, "=", ";")
55  param = ReplaceNumberByKey("Lsize", param, Lsize, "=", ";")
56  param = ReplaceNumberByKey("Hcrop", param, Hcrop, "=", ";")
57  param = ReplaceNumberByKey("Hsize", param, Hsize, "=", ";")
58  param = ReplaceNumberByKey("Cpos", param, Cpos, "=", ";")
59  param = ReplaceNumberByKey("Csize", param, Csize, "=", ";")
60  endif
61 
62  return v_flag
63 };
64 
66  // this function is for testing only, until we implement a proper interface
67  string param = csr_int_linbg_reduction("")
68  svar /z global_params = root:packages:pearl_explorer:s_reduction_params
69  if (svar_exists(global_params))
70  global_params = param
71  endif
72  return param
73 };
74 
75 string csr_int_linbg_reduction(string win){
76  // PRELIMINARY - function arguments may change
77 
78  // sets reduction parameters from cursors in a graph.
79  // an even number of cursors (2 or more) must be set on the image.
80  // cursor names and order do not matter,
81  // except that the alphabetically first cursor which is attached to an image selects the image.
82  // the cursors mark the following positions, from innermost to outermost pair:
83  // 1) low and high limits of peak region.
84  // 2) peak-side boundary of lower and upper background region.
85  // 3) lower and upper cropping region.
86 
87  string win
88 
89  // read all cursor positions
90  variable ic
91  string sc
92  variable nc = 10
93  make /n=(nc) /free positions
94  variable np = 0
95  wave /z image = $""
96  string imagename = ""
97  string tracename = ""
98  string info
99 
100  for (ic = 0; ic < nc; ic += 1)
101  sc = num2char(char2num("A") + ic)
102  wave /z wc = CsrWaveRef($sc, win)
103  info = CsrInfo($sc, win)
104  tracename = StringByKey("TNAME", info, ":", ";")
105  if (waveexists(wc) && (wavedims(wc) == 2))
106  if (!waveexists(image))
107  wave image = wc
108  imagename = tracename
109  endif
110  if (cmpstr(tracename, imagename) == 0)
111  positions[np] = pcsr($sc, win)
112  np += 1
113  endif
114  endif
115  endfor
116 
117  np = floor(np / 2) * 2// ignore odd cursor
118  redimension /n=(np) positions
119  sort positions, positions
120  // shift upper positions by one so that the rightmost pixel becomes 1.0
121  positions = p >= np / 2 ? positions + 1 : positions
122  positions = positions / dimsize(image, 0)
123 
124  // map innermost cursor pair to peak center and size
125  variable ip2 = np / 2
126  variable ip1 = ip2 - 1
127  variable Cpos = (positions[ip1] + positions[ip2]) / 2
128  variable Csize = positions[ip2] - positions[ip1]
129  if (ip1 >= 0)
130  Cpos = (positions[ip1] + positions[ip2]) / 2
131  Csize = positions[ip2] - positions[ip1]
132  else
133  // default: a small region in the center
134  Cpos = 0.5
135  Csize = 0.2
136  endif
137 
138  // background region
139  ip1 -= 1
140  ip2 += 1
141  variable Lsize
142  variable Hsize
143  if (ip1 >= 0)
144  Lsize = positions[ip1]
145  Hsize = 1 - positions[ip2]
146  else
147  // default: everything outside the peak region
148  Lsize = Cpos - Csize / 2
149  Hsize = 1 - (Cpos + Csize / 2)
150  endif
151 
152  // crop region
153  ip1 -= 1
154  ip2 += 1
155  variable Lcrop
156  variable Hcrop
157  if (ip1 >= 0)
158  Lcrop = positions[ip1]
159  Hcrop = 1 - positions[ip2]
160  else
161  // default: dead corners of the EW4000 at PEARL
162  Lcrop = 0.11
163  Hcrop = 0.11
164  endif
165  Lsize = max(Lsize - Lcrop, 0)
166  Hsize = max(Hsize - Hcrop, 0)
167 
168  string param = ""
169  param = ReplaceNumberByKey("Lcrop", param, Lcrop, "=", ";")
170  param = ReplaceNumberByKey("Lsize", param, Lsize, "=", ";")
171  param = ReplaceNumberByKey("Hcrop", param, Hcrop, "=", ";")
172  param = ReplaceNumberByKey("Hsize", param, Hsize, "=", ";")
173  param = ReplaceNumberByKey("Cpos", param, Cpos, "=", ";")
174  param = ReplaceNumberByKey("Csize", param, Csize, "=", ";")
175 
176  return param
177 };
178 
179 variable test_int_linbg(wave image){
180  // useful for testing or manual processing
181  // since the int_linbg_reduction function cannot be called from the command line directly.
182  wave image
183 
184  string param = ""
186 
187  string data1_name = "test_data1"
188  string data2_name = "test_data2"
189  duplicate /o image, $data1_name, $data2_name
190  wave w_data1 = $data1_name
191  wave w_data2 = $data2_name
192 
193  int_linbg_reduction(image, w_data1, w_data2, param)
194 };
195 
196 threadsafe variable int_linbg_reduction(wave source, wave dest1, wave dest2, string* param){
197  // data reduction function for adh5_load_reduced_detector
198  // calculates the average pixel value of each angular slice
199  // in one center and two background intervals.
200  // a background value is calculated at the center position
201  // by linear interpolation from the two background values.
202  // returns the center minus linear background in dest1.
203  // returns the Poisson one-sigma error in dest2.
204  wave source// source wave
205  // Scienta detector image, energy axis along X, angle axis along Y
206  wave dest1, dest2// destination waves
207  // each wave is a one-dimensional intensity distribution
208  // the function may redimension these waves to one of the image dimensions
209  // (it must be clear to the user which dimension this is).
210  // the meaning of dest1 and dest2 is up to the particular function,
211  // e.g. dest1 could hold the mean value and dest2 the one-sigma error,
212  // or dest1 could hold the X-profile, and dest2 the Y-profile.
213  string &param// parameters in a key1=value1;key2=value2;... list
214  // all region parameters are relative to the image size (0...1)
215  // Lcrop = size of the lower cropping region
216  // Hcrop = size of the upper cropping region
217  // Lsize = size of the lower background integration region
218  // Hsize = size of the upper background integration region
219  // Cpos = center position of the of the peak integration region
220  // Csize = size of the peak integration region
221 
222  // typical values (peak centered on detector, FWHM ~ 20 % of image)
223  // Lcrop=0.11;Hcrop=0.11;Lsize=0.2;Hsize=0.2;Cpos=0.5;Csize=0.2
224 
225  variable nx = dimsize(source, 0)
226  variable ny = dimsize(source, 1)
227 
228  // read parameters
229  variable lcrop = NumberByKey("Lcrop", param, "=", ";")
230  variable lsize = NumberByKey("Lsize", param, "=", ";")
231  variable hcrop = NumberByKey("Hcrop", param, "=", ";")
232  variable hsize = NumberByKey("Hsize", param, "=", ";")
233  variable cpos = NumberByKey("Cpos", param, "=", ";")
234  variable csize = NumberByKey("Csize", param, "=", ";")
235 
236  // validate parameters
237  // background parameters are optional, center parameter is required.
238  if (numtype(lcrop) != 0)
239  lcrop = 0
240  endif
241  if (numtype(lsize) != 0)
242  lsize = 0
243  endif
244  if (numtype(hcrop) != 0)
245  hcrop = 0
246  endif
247  if (numtype(hsize) != 0)
248  hsize = 0
249  endif
250  if (numtype(Cpos) != 0)
251  return 1// Cpos parameter missing
252  endif
253  if (numtype(Csize) != 0)
254  return 2// Csize parameter missing
255  endif
256 
257  variable lpos = lcrop + lsize / 2
258  variable hpos = 1 - (hcrop + hsize / 2)
259 
260  variable p0
261  variable p1
262 
263  adh5_setup_profile(source, dest1, 1)
264  adh5_setup_profile(source, dest2, 1)
265 
266  duplicate /free dest1, lbg, hbg
267  if (lsize > 0)
268  p0 = round(lcrop * nx)
269  p1 = round((lcrop + lsize) * nx)
270  ad_profile_y_w(source, p0, p1, lbg)
271  else
272  lbg = 0
273  endif
274  if (hsize > 0)
275  p0 = round((1 - hcrop - hsize) * nx)
276  p1 = round((1 - hcrop) * nx)
277  ad_profile_y_w(source, p0, p1, hbg)
278  else
279  hbg = 0
280  endif
281  if (csize > 0)
282  p0 = round((cpos - csize/2) * nx)
283  p1 = round((cpos + csize/2) * nx)
284  ad_profile_y_w(source, p0, p1, dest1)
285  else
286  dest1 = 0
287  endif
288 
289  variable scale = (cpos - lpos) / (hpos - lpos)
290  dest2 = dest1
291  dest1 -= scale * (hbg - lbg) + lbg
292  dest2 = sqrt(dest2 + scale^2 * (hbg + lbg))
293  return 0// return zero if successful, non-zero if an error occurs
294 };
295 
296 variable test_shockley_anglefit(wave image, variable branch){
297  // apply the Shockley_anglefit function to a single image
298  // useful for testing or manual processing
299  // since the Shockley_anglefit function cannot be called from the command line directly.
300  wave image
301  variable branch// +1 or -1
302 
303  string param = ""
304  param = ReplaceStringByKey("branch", param, num2str(branch), "=", ";")
305 
306  string s_branch
307  if (branch >= 0)
308  s_branch = "p"
309  else
310  s_branch = "n"
311  endif
312  string pkpos_name = "saf_pkpos_" + s_branch
313  string pkwid_name = "saf_pkwid_" + s_branch
314  duplicate /o image, $pkpos_name, $pkwid_name
315  wave w_pkpos = $pkpos_name
316  wave w_pkwid = $pkwid_name
317 
318  shockley_anglefit(image, w_pkpos, w_pkwid, param)
319 };
320 
321 variable prompt_Shockley_anglefit(string* param){
322  string &param
323 
324  variable branch = NumberByKey("branch", param, "=", ";")
325 
326  prompt branch, "Branch (-1 or +1)"
327 
328  doprompt "Shockley_anglefit_reduction Parameters", branch
329  if (v_flag == 0)
330  param = ReplaceNumberByKey("branch", param, branch, "=", ";")
331  endif
332 
333  return v_flag
334 };
335 
336 threadsafe variable Shockley_anglefit(wave source, wave dest1, wave dest2, string* param){
337  // data reduction function for adh5_load_reduced_detector
338  // specialized for analysing the Cu(111) Shockley surface state
339  // do curve fitting of one branch of the surface state
340  // the result is peak position versus energy
341  // TODO: this function contains hard-coded parameters. please generalize as necessary.
342  wave source// source wave
343  // Scienta detector image, energy axis along X, angle axis along Y
344  // the apex of the surface state must be at angle 0
345  wave dest1, dest2// destination waves
346  // dest1: peak position
347  // dest2: peak width (sigma)
348  string &param// parameters in a key1=value1;key2=value2;... list
349  // branch=-1 or +1: select negative (positive) angles for the fit interval, respectively
350 
351  variable nx = dimsize(source, 0)
352  variable ny = dimsize(source, 1)
353 
354  // read parameters
355  variable branch = NumberByKey("branch", param, "=", ";")
356 
357  // validate parameters
358  if (numtype(branch) != 0)
359  branch = +1
360  endif
361 
362  // prepare output
363  adh5_setup_profile(source, dest1, 0)
364  adh5_setup_profile(source, dest2, 0)
365  dest1 = nan
366  dest2 = nan
367 
368  // select angle range
369  // hard-coded for a particular measurement series
370  variable y0
371  variable y1
372  if (branch < 0)
373  y0 = -5
374  y1 = 0
375  else
376  y0 = 0
377  y1 = 5
378  endif
379 
380  // select energy range
381  // start at the point of highest intensity and go up 0.45 eV
382  variable p0
383  variable p1
384  variable q0
385  variable q1
386  duplicate /free dest1, center
387  q0 = round((y0 - dimoffset(source, 1)) / dimdelta(source, 1))
388  q1 = round((y1 - dimoffset(source, 1)) / dimdelta(source, 1))
389  ad_profile_x_w(source, q0, q1, center)
390  wavestats /q/m=1 center
391  p0 = round((v_maxloc - dimoffset(source, 0)) / dimdelta(source, 0))
392  p1 = round((v_maxloc + 0.4 - dimoffset(source, 0)) / dimdelta(source, 0))
393 
394  // prepare intermediate data buffer
395  make /n=(ny)/d/free profile
396  setscale /p x dimoffset(source,1), dimdelta(source,1), waveunits(source,1), profile
397 
398  variable pp
399  for (pp = p0; pp <= p1; pp += 1)
400  profile = source[pp][p]
401  curvefit /Q /NTHR=1 /W=2 gauss profile(y0,y1)
402  wave w_coef
403  dest1[pp] = w_coef[2]
404  dest2[pp] = w_coef[3]
405  endfor
406  return 0// return zero if successful, non-zero if an error occurs
407 };
408 
409 variable prompt_int_quadbg_reduction(string* param){
410  string &param
411 
412  variable Lcrop = NumberByKey("Lcrop", param, "=", ";")
413  variable Lsize = NumberByKey("Lsize", param, "=", ";")
414  variable Hcrop = NumberByKey("Hcrop", param, "=", ";")
415  variable Hsize = NumberByKey("Hsize", param, "=", ";")
416  variable Cpos = NumberByKey("Cpos", param, "=", ";")
417  variable Csize = NumberByKey("Csize", param, "=", ";")
418 
419  prompt Lcrop, "Lower cropping region"
420  prompt Hcrop, "Upper cropping region"
421  prompt Lsize, "Lower background region"
422  prompt Hsize, "Upper background region"
423  prompt Cpos, "Center position"
424  prompt Csize, "Center integration region"
425 
426  doprompt "int_quadbg_reduction Parameters", lcrop, hcrop, lsize, hsize, cpos, csize
427  if (v_flag == 0)
428  param = ReplaceNumberByKey("Lcrop", param, Lcrop, "=", ";")
429  param = ReplaceNumberByKey("Lsize", param, Lsize, "=", ";")
430  param = ReplaceNumberByKey("Hcrop", param, Hcrop, "=", ";")
431  param = ReplaceNumberByKey("Hsize", param, Hsize, "=", ";")
432  param = ReplaceNumberByKey("Cpos", param, Cpos, "=", ";")
433  param = ReplaceNumberByKey("Csize", param, Csize, "=", ";")
434  endif
435 
436  return v_flag
437 };
438 
439 variable test_int_quadbg(wave image){
440  // useful for testing or manual processing
441  // since the int_quadbg_reduction function cannot be called from the command line directly.
442  wave image
443 
444  string param = ""
446 
447  string data1_name = "test_data1"
448  string data2_name = "test_data2"
449  duplicate /o image, $data1_name, $data2_name
450  wave w_data1 = $data1_name
451  wave w_data2 = $data2_name
452 
453  int_quadbg_reduction(image, w_data1, w_data2, param)
454 };
455 
456 threadsafe variable int_quadbg_reduction(wave source, wave dest1, wave dest2, string* param){
457  // data reduction function for adh5_load_reduced_detector
458  // integrates peak area minus a quadratic backgrouind
459  wave source// source wave
460  // Scienta detector image, energy axis along X, angle axis along Y
461  wave dest1, dest2// destination waves
462  string &param// parameters in a key1=value1;key2=value2;... list
463  // all region parameters are relative to the image size (0...1)
464  // Lcrop = size of the lower cropping region
465  // Hcrop = size of the upper cropping region
466  // Lsize = size of the lower background integration region
467  // Hsize = size of the upper background integration region
468  // Cpos = center position of the of the peak integration region
469  // Csize = size of the peak integration region
470 
471  // typical values (peak centered on detector, FWHM ~ 20 % of image)
472  // Lcrop=0.11;Hcrop=0.11;Lsize=0.2;Hsize=0.2;Cpos=0.5;Csize=0.2
473 
474  variable nx = dimsize(source, 0)
475  variable ny = dimsize(source, 1)
476 
477  // read parameters
478  variable lcrop = NumberByKey("Lcrop", param, "=", ";")
479  variable lsize = NumberByKey("Lsize", param, "=", ";")
480  variable hcrop = NumberByKey("Hcrop", param, "=", ";")
481  variable hsize = NumberByKey("Hsize", param, "=", ";")
482  variable cpos = NumberByKey("Cpos", param, "=", ";")
483  variable csize = NumberByKey("Csize", param, "=", ";")
484 
485  // validate parameters
486  // background parameters are optional, center parameter is required.
487  if (numtype(lcrop) != 0)
488  lcrop = 0
489  endif
490  if (numtype(lsize) != 0)
491  lsize = 0
492  endif
493  if (numtype(hcrop) != 0)
494  hcrop = 0
495  endif
496  if (numtype(hsize) != 0)
497  hsize = 0
498  endif
499  if (numtype(Cpos) != 0)
500  return 1// Cpos parameter missing
501  endif
502  if (numtype(Csize) != 0)
503  return 2// Csize parameter missing
504  endif
505 
506  // crop boundaries
507  variable pcl = round(lcrop * nx)
508  variable pch = round((1 - hcrop) * nx)
509  // fit boundaries
510  variable pfl = round((lcrop + lsize) * nx)
511  variable pfh = round((1 - hcrop - hsize) * nx)
512  // integration boundaries
513  variable pil = round((cpos - csize/2) * nx)
514  variable pih = round((cpos + csize/2) * nx)
515 
516  adh5_setup_profile(source, dest1, 0)
517  adh5_setup_profile(source, dest2, 0)
518 
519  // prepare intermediate data buffer
520  make /n=(nx) /d /free profile, mask, fit
521  setscale /p x dimoffset(source,0), dimdelta(source,0), waveunits(source,0), profile, mask, fit
522  mask = ((p >= pcl) && (p < pfl)) || ((p >= pfh) && (p < pch))
523 
524  variable qq
525  variable sp, sf
526  variable xil = x2pnt(profile, pil)
527  variable xih = x2pnt(profile, pih)
528 
529  make /n=3 /free /d w_coef
530  for (qq = 0; qq < ny; qq += 1)
531  profile = source[p][qq]
532  curvefit /Q /NTHR=1 /W=2 poly 3, kwCWave=w_coef, profile /M=mask
533  fit = poly(w_coef, x)
534  sp = sum(profile, xil, xih)
535  sf = sum(fit, xil, xih)
536  dest1[qq] = sp - sf
537  dest2[qq] = sqrt(sp)
538  endfor
539 
540  return 0// return zero if successful, non-zero if an error occurs
541 };
542 
543 variable scienta_norm(wave w, variable x){
544  wave w
545  variable x
546 
547  return w[0] * (x^2 - w[1]^2)
548 };
549 
550 wave fit_scienta_ang_transm(wave data, wave params){
551  wave data// measured angular distribution (1D)
552  wave /z params
553 
554  if (!waveexists(params))
555  make /n=12 /o params
556  endif
557  redimension /n=12/d params
558 
559  variable h = wavemax(data) - wavemin(data)
560  params[0] = h / 2
561  params[1] = 0
562  params[2] = 7
563  params[3] = h / 4
564  params[4] = -23
565  params[5] = 4
566  params[6] = h / 4
567  params[7] = +23
568  params[8] = 4
569  params[9] = h / 2
570  params[10] = 0
571  params[11] = -0.001
572  FuncFit /NTHR=0 /q scienta_ang_transm params data
573 
574  return params
575 };
576 
577 threadsafe variable scienta_ang_transm(wave w, variable x){
578  // parameterized angular transmission function of the analyser
579  wave w// coefficients
580  // w[0] = amplitude gauss 1
581  // w[1] = position gauss 1
582  // w[2] = width gauss 1
583  // w[3] = amplitude gauss 2
584  // w[4] = position gauss 2
585  // w[5] = width gauss 2
586  // w[6] = amplitude gauss 3
587  // w[7] = position gauss 3
588  // w[8] = width gauss 3
589  // w[9] = constant background
590  // w[10] = linear background
591  // w[11] = quadratic background
592  variable x
593 
594  make /free /n=4 /d w_int
595  w_int[0] = 0
596  w_int[1,] = w[p - 1]
597  variable pk1 = gauss1d(w_int, x)
598  w_int[1,] = w[p + 2]
599  variable pk2 = gauss1d(w_int, x)
600  w_int[1,] = w[p + 5]
601  variable pk3 = gauss1d(w_int, x)
602  w_int[0,2] = w[9 + p]
603  w_int[3] = 0
604  variable bg = poly(w_int, x)
605 
606  return bg + pk1 + pk2 + pk3
607 };
608 
609 wave fit_scienta_poly_bg(wave data, wave params, variable bgterms){
610  wave data// measured distribution (2D)
611  wave /z params// wave, will be redimensioned for the correct size
612  variable bgterms// number of terms in the polynomial background: 2, 3, or 4
613 
614  if (!waveexists(params))
615  make /n=15 /o params
616  endif
617  redimension /n=15 /d params
618 
619  variable wmax = wavemax(data)
620  variable wmin = wavemin(data)
621  params[0] = 0
622  params[1] = 7
623  params[2] = 1 / 2
624  params[3] = -23
625  params[4] = 4
626  params[5] = 1 / 2
627  params[6] = +23
628  params[7] = 4
629  params[8] = 1
630  params[9] = 0
631  params[10] = -0.001
632  params[11] = wmin
633  params[12] = (wmax - wmin) / dimdelta(data,1) / dimsize(data,1)
634  params[13] = 0
635  params[14] = 0
636 
637  string h = "0000000000000"
638  if (bgterms < 3)
639  h = h + "1"
640  else
641  h = h + "0"
642  endif
643  if (bgterms < 4)
644  h = h + "1"
645  else
646  h = h + "0"
647  endif
648  FuncFitMD /NTHR=1 /q /h=h scienta_poly_bg params data
649 
650  return params
651 };
652 
653 variable scienta_poly_bg(wave w, variable e, variable a){
654  // polynomial background with
655  // parameterized angular transmission function of the analyser
656  wave w// coefficients
657  // angular transmission, varies with a
658  // amplitude of gauss 1 = 1 constant
659  // other peak amplitudes and linear terms are relative to gauss 1
660  // w[0] = position gauss 1
661  // w[1] = width gauss 1
662  // w[2] = amplitude gauss 2, relative to gauss 1
663  // w[3] = position gauss 2
664  // w[4] = width gauss 2
665  // w[5] = amplitude gauss 3, relative to gauss 1
666  // w[6] = position gauss 3
667  // w[7] = width gauss 3
668  // w[8] = constant term
669  // w[9] = linear term
670  // w[10] = quadratic term
671  // spectral background, varies with e
672  // w[11] = constant term
673  // w[12] = linear term
674  // w[13] = quadratic term
675  // w[14] = cubic term
676  variable a// detection angle
677  variable e// electron energy
678 
679  make /free /n=4 /d w_int
680  variable p0 = 0
681 
682  w_int[0] = 0
683  w_int[1] = 1
684  w_int[2,] = w[p0 + p - 2]
685  variable pk1 = gauss1d(w_int, a)
686  p0 += 2
687 
688  w_int[1,] = w[p0 + p - 1]
689  variable pk2 = gauss1d(w_int, a)
690  p0 += 3
691 
692  w_int[1,] = w[p0 + p - 1]
693  variable pk3 = gauss1d(w_int, a)
694  p0 += 3
695 
696  w_int[0,2] = w[p0 + p]
697  w_int[3] = 0
698  variable base = poly(w_int, a)
699  p0 += 3
700 
701  w_int[0,3] = w[p0 + p]
702  variable bg = poly(w_int, e)
703 
704  return bg * (base + pk1 + pk2 + pk3)
705 };
706 
715 variable prompt_redim_linbg_reduction(string* param){
716  string &param
717 
718  variable Lcrop = NumberByKey("Lcrop", param, "=", ";")
719  variable Lsize = NumberByKey("Lsize", param, "=", ";")
720  variable Hcrop = NumberByKey("Hcrop", param, "=", ";")
721  variable Hsize = NumberByKey("Hsize", param, "=", ";")
722  variable Cpos = NumberByKey("Cpos", param, "=", ";")
723  variable Csize = NumberByKey("Csize", param, "=", ";")
724 
725  prompt Lcrop, "Lower cropping region"
726  prompt Hcrop, "Upper cropping region"
727  prompt Lsize, "Lower background region"
728  prompt Hsize, "Upper background region"
729  prompt Cpos, "Center position"
730  prompt Csize, "Center integration region"
731 
732  doprompt "redim_linbg_reduction Parameters", lcrop, hcrop, lsize, hsize, cpos, csize
733  if (v_flag == 0)
734  param = ReplaceNumberByKey("Lcrop", param, Lcrop, "=", ";")
735  param = ReplaceNumberByKey("Lsize", param, Lsize, "=", ";")
736  param = ReplaceNumberByKey("Hcrop", param, Hcrop, "=", ";")
737  param = ReplaceNumberByKey("Hsize", param, Hsize, "=", ";")
738  param = ReplaceNumberByKey("Cpos", param, Cpos, "=", ";")
739  param = ReplaceNumberByKey("Csize", param, Csize, "=", ";")
740  endif
741 
742  return v_flag
743 };
744 
786 threadsafe variable redim_linbg_reduction(wave source, wave dest1, wave dest2, string* param){
787  wave source
788  wave dest1, dest2
789  string &param
790 
791  variable nx = dimsize(source, 0)
792  variable ny = dimsize(source, 1)
793 
794  duplicate /free source, source_redim
795  redimension /n=(nx * ny) source_redim
796  nx += 1
797  redimension /n=(nx, ny) source_redim
798 
799  return int_linbg_reduction(source_redim, dest1, dest2, param)
800 };
801 
802 
wave fit_scienta_ang_transm(wave data, wave params)
+
variable test_int_linbg(wave image)
+
threadsafe variable Shockley_anglefit(wave source, wave dest1, wave dest2, string *param)
+
threadsafe variable redim_linbg_reduction(wave source, wave dest1, wave dest2, string *param)
linear background reduction function for incorrectly dimensioned scienta image
+
variable scienta_poly_bg(wave w, variable e, variable a)
+
threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
wave fit_scienta_poly_bg(wave data, wave params, variable bgterms)
+
variable prompt_Shockley_anglefit(string *param)
+
threadsafe variable adh5_setup_profile(wave image, wave profile, variable dim)
set up a one-dimensional wave for a line profile based on a 2D original wave.
+
variable prompt_int_quadbg_reduction(string *param)
+
threadsafe variable scienta_ang_transm(wave w, variable x)
+
threadsafe variable int_quadbg_reduction(wave source, wave dest1, wave dest2, string *param)
+
variable test_shockley_anglefit(wave image, variable branch)
+
threadsafe variable int_linbg_reduction(wave source, wave dest1, wave dest2, string *param)
+
variable scienta_norm(wave w, variable x)
+
variable prompt_redim_linbg_reduction(string *param)
parameter dialog for the redim_linbg_reduction() function
+
threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
+
variable prompt_int_linbg_reduction(string *param)
+
variable test_int_quadbg(wave image)
+
string csr_int_linbg_reduction(string win)
+
string capture_int_linbg_cursors()
+
+
+ + + + diff --git a/doc/html/pearl-tools_8ipf.html b/doc/html/pearl-tools_8ipf.html new file mode 100644 index 0000000..ef55515 --- /dev/null +++ b/doc/html/pearl-tools_8ipf.html @@ -0,0 +1,333 @@ + + + + + + +PEARL Procedures: pearl-tools.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-tools.ipf File Reference
+
+
+
#include "pearl-gui-tools"
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + +

+Functions

variable DefaultWaveIterator (wave w, string *sdata)
 
variable AppendToGraphIterator (wave w, string *sdata)
 
variable SumWavesIterator (wave w, string *sdata)
 
string IterateWaves (string matchStr, funcref iterator, string sdata)
 
variable DefaultFolderIterator (dfref df, string *sdata)
 
string IterateDataFolders (string matchStr, funcref iterator, string sdata, string progress_title=defaultValue)
 
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
variable AppendToGraphIterator (wave w,
string * sdata 
)
+
+ +

Definition at line 26 of file pearl-tools.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable DefaultFolderIterator (dfref df,
string * sdata 
)
+
+ +

Definition at line 65 of file pearl-tools.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable DefaultWaveIterator (wave w,
string * sdata 
)
+
+ +

Definition at line 18 of file pearl-tools.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
string IterateDataFolders (string matchStr,
funcref iterator,
string sdata,
string progress_title = defaultValue 
)
+
+ +

Definition at line 79 of file pearl-tools.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
string IterateWaves (string matchStr,
funcref iterator,
string sdata 
)
+
+ +

Definition at line 45 of file pearl-tools.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable SumWavesIterator (wave w,
string * sdata 
)
+
+ +

Definition at line 34 of file pearl-tools.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-tools_8ipf.js b/doc/html/pearl-tools_8ipf.js new file mode 100644 index 0000000..26c2455 --- /dev/null +++ b/doc/html/pearl-tools_8ipf.js @@ -0,0 +1,9 @@ +var pearl_tools_8ipf = +[ + [ "AppendToGraphIterator", "pearl-tools_8ipf.html#a90c62bdfc186e2482ccb18113a591d5e", null ], + [ "DefaultFolderIterator", "pearl-tools_8ipf.html#a3fb8c06030dc41a599380150807caeb0", null ], + [ "DefaultWaveIterator", "pearl-tools_8ipf.html#a6bdd1c0b269f1d7d99843ce0cb218cc7", null ], + [ "IterateDataFolders", "pearl-tools_8ipf.html#a7c5307e5e7c0202d2b088fdc11887069", null ], + [ "IterateWaves", "pearl-tools_8ipf.html#aabc250f68dd85ca58d7be5077255af99", null ], + [ "SumWavesIterator", "pearl-tools_8ipf.html#aea193a1b5fbdbb2a5dec9f25f3c05c45", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-tools_8ipf_source.html b/doc/html/pearl-tools_8ipf_source.html new file mode 100644 index 0000000..c2159d3 --- /dev/null +++ b/doc/html/pearl-tools_8ipf_source.html @@ -0,0 +1,134 @@ + + + + + + +PEARL Procedures: pearl-tools.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-tools.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.00
3 #pragma IgorVersion = 6.2
4 #pragma ModuleName = PearlTools
5 #include "pearl-gui-tools"
6 
7 // general programming tools for Igor
8 
9 // $Id$
10 // author: matthias.muntwiler@psi.ch
11 // Copyright (c) 2009-14 Paul Scherrer Institut
12 
13 // Licensed under the Apache License, Version 2.0 (the "License");
14 // you may not use this file except in compliance with the License.
15 // You may obtain a copy of the License at
16 // http://www.apache.org/licenses/LICENSE-2.0
17 
18 variable DefaultWaveIterator(wave w, string* sdata){
19 // function prototype for IterateWaves
20  wave w// wave which the iterator is supposed to work on
21  string &sdata// string with additional data, shared between calls
22  // this is a pass-by-reference argument,
23  // the function may modify the string
24 };
25 
26 variable AppendToGraphIterator(wave w, string* sdata){
27 // append iterated waves to the current graph
28  wave w// wave to be displayed
29  string &sdata// not used
30 
31  appendtograph w
32 };
33 
34 variable SumWavesIterator(wave w, string* sdata){
35 // sum waves into one result wave
36  wave w// wave which the iterator is supposed to work on
37  string &sdata// name of the result wave, can include absolute path
38  // the wave must exist and compatible with the summands
39  // the caller is responsible for initialization of the wave
40 
41  wave result = $sdata
42  result += w
43 };
44 
45 string IterateWaves(string matchStr, funcref iterator, string sdata){
46 // iterate over all waves matching a specified pattern (see built-in WaveList function),
47 // passing each wave to a user-defined iterator function
48  string matchStr// matchStr as for WaveList
49  funcref DefaultWaveIterator iterator// iterator function
50  // use the DefaultWaveIterator function as a template
51  string sdata// data string passed to iterator function
52  // the iterator may modify the string
53  // the function returns the string at the end
54 
55  string wlist = WaveList(matchStr, ";", "")
56  variable n = ItemsInList(wlist, ";")
57  variable i
58  for (i = 0; i < n; i += 1)
59  wave w = $(StringFromList(i, wlist, ";"))
60  iterator(w, sdata)
61  endfor
62  return sdata
63 };
64 
65 variable DefaultFolderIterator(dfref df, string* sdata){
66 // function prototype for IterateWaves
67  dfref df// data folder reference which the iterator is supposed to work on
68  string &sdata// string with additional data, shared between calls
69  // this is a pass-by-reference argument,
70  // the function may modify the string
71 
72  // switch to requested data folder
73  setdatafolder df
74  // for testing
75  print getdatafolder(1)
76  // no need to switch back to original folder
77 };
78 
79 string IterateDataFolders(string matchStr, funcref iterator, string sdata, string progress_title = defaultValue){
80 // iterate over all data folders matching a specified pattern in the current data folder,
81 // passing each folder to a user-defined iterator function
82  string matchStr// matchStr as for the built-in stringmatch function
83  funcref DefaultFolderIterator iterator// iterator function
84  // use the DefaultFolderIterator function as a template
85  string sdata// data string passed to iterator function
86  // the iterator may modify the string
87  // the function returns the string at the end
88  string progress_title// title of the progress window (optional)
89  // if not specified or empty, the progress window will not be shown.
90  // if the progress window is show, the user can abort the iteration.
91  // the function result does not indicate whether the iteration was completed or aborted.
92  // the iterator and caller must take care of leaving the data in a consistent state.
93 
94  if (ParamIsDefault(progress_title))
95  progress_title = ""
96  endif
97  variable show_progress = strlen(progress_title) > 0
98 
99  dfref origdf = GetDataFolderDFR()
100  dfref curdf
101  variable index = 0
102  variable abort_req = 0
103  string objName
104 
105  variable ndf = CountObjectsDFR(origdf, 4)
106  if (show_progress)
107  display_progress_panel(progress_title, "", ndf)
108  endif
109 
110  do
111  objName = GetIndexedObjNameDFR(origdf, 4, index)
112  if (strlen(objName) == 0)
113  break
114  endif
115  if (stringmatch(objname, matchstr))
116  if (show_progress)
117  abort_req = update_progress_panel(index, message=objName)
118  if (abort_req)
119  break
120  endif
121  endif
122  setdatafolder origdf
123  curdf = $(":" + objname)
124  iterator(curdf, sdata)
125  endif
126  index += 1
127  while(1)
128 
129  if (show_progress)
131  endif
132 
133  setdatafolder origdf
134  return sdata
135 };
136 
variable kill_progress_panel()
+
string IterateDataFolders(string matchStr, funcref iterator, string sdata, string progress_title=defaultValue)
Definition: pearl-tools.ipf:79
+
variable display_progress_panel(string title, string message, variable progress_max)
+
variable AppendToGraphIterator(wave w, string *sdata)
Definition: pearl-tools.ipf:26
+
string IterateWaves(string matchStr, funcref iterator, string sdata)
Definition: pearl-tools.ipf:45
+
variable DefaultWaveIterator(wave w, string *sdata)
Definition: pearl-tools.ipf:18
+
variable update_progress_panel(variable progress, string message=defaultValue, variable progress_max=defaultValue)
+
variable SumWavesIterator(wave w, string *sdata)
Definition: pearl-tools.ipf:34
+
variable DefaultFolderIterator(dfref df, string *sdata)
Definition: pearl-tools.ipf:65
+
+
+ + + + diff --git a/doc/html/pearl-vector-operations_8ipf.html b/doc/html/pearl-vector-operations_8ipf.html new file mode 100644 index 0000000..577c3aa --- /dev/null +++ b/doc/html/pearl-vector-operations_8ipf.html @@ -0,0 +1,405 @@ + + + + + + +PEARL Procedures: pearl-vector-operations.ipf File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
pearl-vector-operations.ipf File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + +

+Functions

variable rotate2d_x (variable xx, variable yy, variable angle)
 
variable rotate2d_y (variable xx, variable yy, variable angle)
 
wave create_rotation_matrix_free ()
 
wave set_rotation_x (wave matrix, variable angle)
 
wave set_rotation_y (wave matrix, variable angle)
 
wave set_rotation_z (wave matrix, variable angle)
 
variable rotate_x_wave (wave inout, variable angle)
 
variable rotate_y_wave (wave inout, variable angle)
 
variable rotate_z_wave (wave inout, variable angle)
 
+

Function Documentation

+ +
+
+ + + + + + + +
wave create_rotation_matrix_free ()
+
+ +

Definition at line 26 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable rotate2d_x (variable xx,
variable yy,
variable angle 
)
+
+ +

Definition at line 10 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
variable rotate2d_y (variable xx,
variable yy,
variable angle 
)
+
+ +

Definition at line 18 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable rotate_x_wave (wave inout,
variable angle 
)
+
+ +

Definition at line 83 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable rotate_y_wave (wave inout,
variable angle 
)
+
+ +

Definition at line 101 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
variable rotate_z_wave (wave inout,
variable angle 
)
+
+ +

Definition at line 119 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
wave set_rotation_x (wave matrix,
variable angle 
)
+
+ +

Definition at line 35 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
wave set_rotation_y (wave matrix,
variable angle 
)
+
+ +

Definition at line 51 of file pearl-vector-operations.ipf.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
wave set_rotation_z (wave matrix,
variable angle 
)
+
+ +

Definition at line 67 of file pearl-vector-operations.ipf.

+ +
+
+
+
+ + + + diff --git a/doc/html/pearl-vector-operations_8ipf.js b/doc/html/pearl-vector-operations_8ipf.js new file mode 100644 index 0000000..41fae52 --- /dev/null +++ b/doc/html/pearl-vector-operations_8ipf.js @@ -0,0 +1,12 @@ +var pearl_vector_operations_8ipf = +[ + [ "create_rotation_matrix_free", "pearl-vector-operations_8ipf.html#a72c3200a7344c708ea76e20cc2c19c43", null ], + [ "rotate2d_x", "pearl-vector-operations_8ipf.html#ac579a92f012f0d0ef7b8f097e1c8b3c7", null ], + [ "rotate2d_y", "pearl-vector-operations_8ipf.html#a355150c423ab975fe7f1832917118ea3", null ], + [ "rotate_x_wave", "pearl-vector-operations_8ipf.html#ada80428496dc748b960bd9c65df7da8b", null ], + [ "rotate_y_wave", "pearl-vector-operations_8ipf.html#adfd1d68e739694982fbd00b76568c1c0", null ], + [ "rotate_z_wave", "pearl-vector-operations_8ipf.html#a0030e927980581d57781ad391f2d872a", null ], + [ "set_rotation_x", "pearl-vector-operations_8ipf.html#a8a8dff94d9f7b992c2c2c0744001e74b", null ], + [ "set_rotation_y", "pearl-vector-operations_8ipf.html#adfdf1cfe8812d8d0006228f6c14c9582", null ], + [ "set_rotation_z", "pearl-vector-operations_8ipf.html#a76feca10fe5d3e085f01c73a59b38424", null ] +]; \ No newline at end of file diff --git a/doc/html/pearl-vector-operations_8ipf_source.html b/doc/html/pearl-vector-operations_8ipf_source.html new file mode 100644 index 0000000..738ccd8 --- /dev/null +++ b/doc/html/pearl-vector-operations_8ipf_source.html @@ -0,0 +1,134 @@ + + + + + + +PEARL Procedures: pearl-vector-operations.ipf Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
pearl-vector-operations.ipf
+
+
+Go to the documentation of this file.
1 #pragma rtGlobals=3
2 #pragma version = 2.0
3 #pragma IgorVersion = 6.1
4 #pragma ModuleName = PearlVectorOperations
5 
6 // author: matthias.muntwiler@psi.ch
7 // Copyright (c) 2011-13 Paul Scherrer Institut
8 // $Id$
9 
10 variable rotate2d_x(variable xx, variable yy, variable angle){
11  // rotates a 2D cartesian vector and returns its x component
12  variable xx, yy
13  variable angle// rotation angle in degrees
14 
15  return xx * cos(angle * pi / 180) - yy * sin(angle * pi / 180)
16 };
17 
18 variable rotate2d_y(variable xx, variable yy, variable angle){
19  // rotates a 2D cartesian vector and returns its y component
20  variable xx, yy
21  variable angle// rotation angle in degrees
22 
23  return xx * sin(angle * pi / 180) + yy * cos(angle * pi / 180)
24 };
25 
27  // creates a matrix which represents a 3-vector rotation
28  // the matrix is initialized as identity
29 
30  make /n=(3,3)/free matrix
31  matrix = p == q// identity
32  return matrix
33 };
34 
35 wave set_rotation_x(wave matrix, variable angle){
36  // calculates a matrix representing a 3-vector rotation around the x axis
37  wave matrix// rotation matrix
38  variable angle// rotation angle in degrees
39 
40  variable si = sin(angle * pi / 180)
41  variable co = cos(angle * pi / 180)
42 
43  matrix[1][1] = co
44  matrix[2][2] = co
45  matrix[2][1] = si
46  matrix[1][2] = -si
47 
48  return matrix
49 };
50 
51 wave set_rotation_y(wave matrix, variable angle){
52  // calculates a matrix representing a 3-vector rotation around the y axis
53  wave matrix// rotation matrix
54  variable angle// rotation angle in degrees
55 
56  variable si = sin(angle * pi / 180)
57  variable co = cos(angle * pi / 180)
58 
59  matrix[0][0] = co
60  matrix[2][2] = co
61  matrix[0][2] = si
62  matrix[2][0] = -si
63 
64  return matrix
65 };
66 
67 wave set_rotation_z(wave matrix, variable angle){
68  // calculates a matrix representing a 3-vector rotation around the z axis
69  wave matrix// rotation matrix
70  variable angle// rotation angle in degrees
71 
72  variable si = sin(angle * pi / 180)
73  variable co = cos(angle * pi / 180)
74 
75  matrix[0][0] = co
76  matrix[1][1] = co
77  matrix[1][0] = si
78  matrix[0][1] = -si
79 
80  return matrix
81 };
82 
83 variable rotate_x_wave(wave inout, variable angle){
84  // rotates a wave of 3-vectors about the x axis
85  wave inout// wave with dimensions (3, N), N >= 1, (x, y, z)
86  // result will be in same wave
87  variable angle// rotation angle in degrees
88 
89  wave m_rotation_x = create_rotation_matrix_free()
90  make /n=3/d/free w_temp_rotate_x
91  variable ivec, nvec
92  nvec = max(DimSize(inout, 1), 1)
93  for (ivec = 0; ivec < nvec; ivec += 1)
94  set_rotation_x(m_rotation_x, angle)
95  w_temp_rotate_x = inout[p][ivec]
96  matrixop /free w_temp_rotate_x_result = m_rotation_x x w_temp_rotate_x
97  inout[][ivec] = w_temp_rotate_x_result[p]
98  endfor
99 };
100 
101 variable rotate_y_wave(wave inout, variable angle){
102  // rotates a wave of 3-vectors about the y axis
103  wave inout// wave with dimensions (3, N), N >= 1, (x, y, z)
104  // result will be in same wave
105  variable angle// rotation angle in degrees
106 
107  wave m_rotation_y = create_rotation_matrix_free()
108  make /n=3/d/free w_temp_rotate_y
109  variable ivec, nvec
110  nvec = max(DimSize(inout, 1), 1)
111  for (ivec = 0; ivec < nvec; ivec += 1)
112  set_rotation_y(m_rotation_y, angle)
113  w_temp_rotate_y = inout[p][ivec]
114  matrixop /free w_temp_rotate_y_result = m_rotation_y x w_temp_rotate_y
115  inout[][ivec] = w_temp_rotate_y_result[p]
116  endfor
117 };
118 
119 variable rotate_z_wave(wave inout, variable angle){
120  // rotates a wave of 3-vectors about the z axis
121  wave inout// wave with dimensions (3, N), N >= 1, (x, y, z)
122  // result will be in same wave
123  variable angle// rotation angle in degrees
124 
125  wave m_rotation_z = create_rotation_matrix_free()
126  make /n=3/d/free w_temp_rotate_z
127  variable ivec, nvec
128  nvec = max(DimSize(inout, 1), 1)
129  for (ivec = 0; ivec < nvec; ivec += 1)
130  set_rotation_z(m_rotation_z, angle)
131  w_temp_rotate_z = inout[p][ivec]
132  matrixop /free w_temp_rotate_z_result = m_rotation_z x w_temp_rotate_z
133  inout[][ivec] = w_temp_rotate_z_result[p]
134  endfor
135 };
136 
wave set_rotation_x(wave matrix, variable angle)
+
variable rotate_x_wave(wave inout, variable angle)
+
variable rotate2d_x(variable xx, variable yy, variable angle)
+
wave set_rotation_z(wave matrix, variable angle)
+
variable rotate_y_wave(wave inout, variable angle)
+
variable rotate2d_y(variable xx, variable yy, variable angle)
+
variable rotate_z_wave(wave inout, variable angle)
+
wave create_rotation_matrix_free()
+
wave set_rotation_y(wave matrix, variable angle)
+
+
+ + + + diff --git a/doc/html/resize.js b/doc/html/resize.js new file mode 100644 index 0000000..2b86c36 --- /dev/null +++ b/doc/html/resize.js @@ -0,0 +1,97 @@ +var cookie_namespace = 'doxygen'; +var sidenav,navtree,content,header; + +function readCookie(cookie) +{ + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) + { + var index = document.cookie.indexOf(myCookie); + if (index != -1) + { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) + { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; +} + +function writeCookie(cookie, val, expiration) +{ + if (val==undefined) return; + if (expiration == null) + { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; +} + +function resizeWidth() +{ + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth, null); +} + +function restoreWidth(navWidth) +{ + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+6+"px"}); + sidenav.css({width:navWidth + "px"}); +} + +function resizeHeight() +{ + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px"}); +} + +function initResizable() +{ + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(window).resize(function() { resizeHeight(); }); + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(document).bind('touchmove',function(e){ + var device = navigator.userAgent.toLowerCase(); + var ios = device.match(/(iphone|ipod|ipad)/); + if (ios) { + try { + var target = e.target; + while (target) { + if ($(target).css('-webkit-overflow-scrolling')=='touch') return; + target = target.parentNode; + } + e.preventDefault(); + } catch(err) { + e.preventDefault(); + } + } + }); +} + + diff --git a/doc/html/search/all_0.html b/doc/html/search/all_0.html new file mode 100644 index 0000000..d54e0bd --- /dev/null +++ b/doc/html/search/all_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_0.js b/doc/html/search/all_0.js new file mode 100644 index 0000000..f9f7fae --- /dev/null +++ b/doc/html/search/all_0.js @@ -0,0 +1,83 @@ +var searchData= +[ + ['ad_5fbox_5ffilter',['ad_box_filter',['../pearl-area-display_8ipf.html#a27f0957d61f3c2d30a4854911b460c36',1,'pearl-area-display.ipf']]], + ['ad_5fbrick_5fslicer',['ad_brick_slicer',['../pearl-area-display_8ipf.html#ae3b4756cdc12a4a4b15a770ba0069823',1,'pearl-area-display.ipf']]], + ['ad_5fcalc_5fcursor_5fprofiles',['ad_calc_cursor_profiles',['../pearl-area-display_8ipf.html#a72b57037abd27f65986034c0b4cc191e',1,'pearl-area-display.ipf']]], + ['ad_5fcalc_5fhistogram',['ad_calc_histogram',['../pearl-area-display_8ipf.html#a48b08ab53729d9d0477deaceedef2769',1,'pearl-area-display.ipf']]], + ['ad_5fcalc_5fprofiles',['ad_calc_profiles',['../pearl-area-display_8ipf.html#a48044f9ee518d47770e33ee9f381f204',1,'pearl-area-display.ipf']]], + ['ad_5fcollect_5fmultiscan_5fy',['ad_collect_multiscan_y',['../pearl-area-profiles_8ipf.html#a3cadf0b28d1fd84e9922610c20868283',1,'pearl-area-profiles.ipf']]], + ['ad_5fdefault_5fimage_5ffilter',['ad_default_image_filter',['../pearl-area-display_8ipf.html#a6418a1b2d18b82cb71c0fecbd513a934',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay',['ad_display',['../pearl-area-display_8ipf.html#ae2b11295d2715e9af019513923c64570',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fbrick',['ad_display_brick',['../pearl-area-display_8ipf.html#a65b07e355df20cfb692dfb32f472b478',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fhistogram',['ad_display_histogram',['../pearl-area-display_8ipf.html#a8cc3ea3bea4e851e4144140a2da42a03',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fprofiles',['ad_display_profiles',['../pearl-area-display_8ipf.html#a8fad5aebaca72887d5898b4c421bcdae',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fslice',['ad_display_slice',['../pearl-area-display_8ipf.html#af8d5e003fcff1f750685ed6f94717730',1,'pearl-area-display.ipf']]], + ['ad_5fexport_5fprofile',['ad_export_profile',['../pearl-area-display_8ipf.html#ad3e190d1ec1b82ebef00c9f9ac44b50a',1,'pearl-area-display.ipf']]], + ['ad_5fextract_5frod',['ad_extract_rod',['../pearl-area-profiles_8ipf.html#a8de5d4f1bcca91df5bbff568ab7b582d',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5frod_5fx',['ad_extract_rod_x',['../pearl-area-profiles_8ipf.html#a83700e2faf844e2480c89b6ca4c66a79',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5frod_5fy',['ad_extract_rod_y',['../pearl-area-profiles_8ipf.html#a363af257a04d51fff2a8d5b282f65f21',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5frod_5fz',['ad_extract_rod_z',['../pearl-area-profiles_8ipf.html#a3483707fbdbfdbaec069591a5d3b07a6',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab',['ad_extract_slab',['../pearl-area-profiles_8ipf.html#a65bb359c057a9d900c486e186c9974df',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab_5fx',['ad_extract_slab_x',['../pearl-area-profiles_8ipf.html#af612340d1d132cacda9de7bb77c2e0aa',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab_5fy',['ad_extract_slab_y',['../pearl-area-profiles_8ipf.html#a2eb6a0bcced893e827cfa4e1236e8460',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab_5fz',['ad_extract_slab_z',['../pearl-area-profiles_8ipf.html#a71f02613c4a4d21c014493e906dbe922',1,'pearl-area-profiles.ipf']]], + ['ad_5fgizmo_5fset_5fplane',['ad_gizmo_set_plane',['../pearl-area-display_8ipf.html#aee051acfe6a3c8214118b78dfe4854fd',1,'pearl-area-display.ipf']]], + ['ad_5fload_5fdialog',['ad_load_dialog',['../pearl-area-import_8ipf.html#aedff2e67d2e1bac907f2eaf24a6e5c3c',1,'pearl-area-import.ipf']]], + ['ad_5fprofile_5fx',['ad_profile_x',['../pearl-area-profiles_8ipf.html#ab1a65cf82f6933db3dd7b564582e8ed1',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofile_5fx_5fw',['ad_profile_x_w',['../pearl-area-profiles_8ipf.html#aa40fd5049f993e72fd52a66a6cdde7cc',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofile_5fy',['ad_profile_y',['../pearl-area-profiles_8ipf.html#abb1eed32a982037ebab00f5c3ea95e62',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofile_5fy_5fw',['ad_profile_y_w',['../pearl-area-profiles_8ipf.html#a8b09e13162fa47cc076e1e661e80b002',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofiles_5fcrosshairs',['ad_profiles_crosshairs',['../pearl-area-display_8ipf.html#a6d20a8c6bf5ed143d375dee71fb3a6d5',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fcursor_5fmode',['ad_profiles_cursor_mode',['../pearl-area-display_8ipf.html#a5657fc4dcd395aef637c19e8df57a418',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fhook',['ad_profiles_hook',['../pearl-area-display_8ipf.html#a89a5e3e29a0cd09951dcdf13aa28d941',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fset_5fcursor',['ad_profiles_set_cursor',['../pearl-area-display_8ipf.html#ad2a84495ddac89bc8f4203fca56babfd',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fset_5fslice',['ad_profiles_set_slice',['../pearl-area-display_8ipf.html#abaf229d75d9d579a559295795a6bc2e1',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5finit_5fbg',['ad_slicer_init_bg',['../pearl-area-display_8ipf.html#a7334815c60e2c11e2754c07489a62f4b',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5fmove_5fbg',['ad_slicer_move_bg',['../pearl-area-display_8ipf.html#a4af98ec7af48a653c6fac716ea8fa505',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5fstart_5fbg',['ad_slicer_start_bg',['../pearl-area-display_8ipf.html#ad79b37ab4fcf2cbdad6874813d93d4b1',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5fstop_5fbg',['ad_slicer_stop_bg',['../pearl-area-display_8ipf.html#a77a71985e716a300e0b61c233cd93f40',1,'pearl-area-display.ipf']]], + ['ad_5fsuggest_5ffoldername',['ad_suggest_foldername',['../pearl-area-import_8ipf.html#ad28dbbba73e553f7b5dcf8baf1c86786',1,'pearl-area-import.ipf']]], + ['ad_5ftranspose_5ffilter',['ad_transpose_filter',['../pearl-area-display_8ipf.html#a8411f0cfec3515f1ae4f0140efc14318',1,'pearl-area-display.ipf']]], + ['ad_5fupdate_5fprofiles',['ad_update_profiles',['../pearl-area-display_8ipf.html#afa2546f9cb03dfa8bf0cc9966f0b7a45',1,'pearl-area-display.ipf']]], + ['add_5fimage_5fdata',['add_image_data',['../pearl-anglescan-tracker_8ipf.html#a35a5cd8a21b48be8d726c69eb5fca134',1,'pearl-anglescan-tracker.ipf']]], + ['adh5_5fdefault_5freduction',['adh5_default_reduction',['../pearl-area-import_8ipf.html#a245034d7a94536a24c78a7bfe22725b7',1,'pearl-area-import.ipf']]], + ['adh5_5flist_5freduction_5ffuncs',['adh5_list_reduction_funcs',['../pearl-area-import_8ipf.html#aa5e29dc1a380311d00a5f85be867e47b',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fcomplete',['adh5_load_complete',['../pearl-area-import_8ipf.html#ab1040bf272c69dc69777b2f91df41fab',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fdetector',['adh5_load_detector',['../pearl-area-import_8ipf.html#a84dc7f466b42dde5d96c49827b2122cf',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fdetector_5fimage',['adh5_load_detector_image',['../pearl-area-import_8ipf.html#a931a7bfaaf75d308a0ce3c74ffc751bc',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fdetector_5fslabs',['adh5_load_detector_slabs',['../pearl-area-import_8ipf.html#a4a9741d1c19b10bb98b73bd5163a497b',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5finfo',['adh5_load_info',['../pearl-area-import_8ipf.html#ac76d5ba94a3d7c864437420d80c77064',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fpreview',['adh5_load_preview',['../pearl-area-import_8ipf.html#a98f29671bdce6a5981e8865de8b9d483',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5freduced',['adh5_load_reduced',['../pearl-area-import_8ipf.html#a98f9339cd2fae80d0d92451df88395aa',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5freduced_5fdetector',['adh5_load_reduced_detector',['../pearl-area-import_8ipf.html#a3f2ac36f961941e46e80a775de8300e5',1,'pearl-area-import.ipf']]], + ['adh5_5floadattr_5fall',['adh5_loadattr_all',['../pearl-area-import_8ipf.html#acde16dc7a393250b17165344f865f7b5',1,'pearl-area-import.ipf']]], + ['adh5_5fredim',['adh5_redim',['../pearl-area-import_8ipf.html#acfa6d2675e63f4f686289ef853b262a9',1,'pearl-area-import.ipf']]], + ['adh5_5fscale',['adh5_scale',['../pearl-area-import_8ipf.html#a774751d1857ea6946a942448dc913128',1,'pearl-area-import.ipf']]], + ['adh5_5fscale_5fscan',['adh5_scale_scan',['../pearl-area-import_8ipf.html#a1fdcc02340375afe8d8cd7537c6e9cfb',1,'pearl-area-import.ipf']]], + ['adh5_5fscale_5fscienta',['adh5_scale_scienta',['../pearl-area-import_8ipf.html#a227e4db1c51a910dcf86d355473fe74e',1,'pearl-area-import.ipf']]], + ['adh5_5fsetup_5fprofile',['adh5_setup_profile',['../pearl-area-import_8ipf.html#a9439de3b676e686eeca4e6b2588c01a6',1,'pearl-area-import.ipf']]], + ['adh5_5ftest_5freduction_5ffunc',['adh5_test_reduction_func',['../pearl-area-import_8ipf.html#a706fb32ee79b589366dec1cf9f7e9d02',1,'pearl-area-import.ipf']]], + ['aftercompiledhook',['AfterCompiledHook',['../pearl-anglescan-tracker_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed',1,'AfterCompiledHook(): pearl-anglescan-tracker.ipf'],['../pearl-arpes_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed',1,'AfterCompiledHook(): pearl-arpes.ipf']]], + ['afterfileopenhook',['AfterFileOpenHook',['../pearl-elog_8ipf.html#a3f524f5190341d2accc8cb8c3ed2ceb5',1,'AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#a3f524f5190341d2accc8cb8c3ed2ceb5',1,'AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind): pearl-matrix-import.ipf']]], + ['already_5ffile_5fopen',['ALREADY_FILE_OPEN',['../structerror_code.html#a19dc49bdfb4bd9601f17f907da158026',1,'errorCode']]], + ['analyse_5fcurved_5fedge',['analyse_curved_edge',['../fermi-edge-analysis_8ipf.html#a1c4a805435a1d43c2b6dfb6deb633894',1,'fermi-edge-analysis.ipf']]], + ['analyser_5fenergy_5fresolution',['analyser_energy_resolution',['../fermi-edge-analysis_8ipf.html#ad23de34bb698589e2576ce2836b89d55',1,'fermi-edge-analysis.ipf']]], + ['appendtographiterator',['AppendToGraphIterator',['../pearl-tools_8ipf.html#a90c62bdfc186e2482ccb18113a591d5e',1,'pearl-tools.ipf']]], + ['arpes_20package',['ARPES package',['../group___arpes_package.html',1,'']]], + ['ast_5fadd_5fimage',['ast_add_image',['../pearl-anglescan-tracker_8ipf.html#a43d85b93bb42a67b8e8afb9afc8d8eae',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fcallback_5fdata',['ast_callback_data',['../pearl-anglescan-tracker_8ipf.html#a4cf5ad2fdf771ffc157a3924a03f5a46',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fcallback_5fdetector',['ast_callback_detector',['../pearl-anglescan-tracker_8ipf.html#ac953a75b45d65adf37ce5560bf441876',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fcallback_5fmanip',['ast_callback_manip',['../pearl-anglescan-tracker_8ipf.html#a9b4acc299c5e698695baf0b4817ff7eb',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fclose',['ast_close',['../pearl-anglescan-tracker_8ipf.html#a8a74ddd33e286105a45a89105de72621',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fexport',['ast_export',['../pearl-anglescan-tracker_8ipf.html#ac9c92805f39c7a5c68d4c017d14ee178',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fimport',['ast_import',['../pearl-anglescan-tracker_8ipf.html#ae4ece97352b85ced47e954c025e3b69b',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fprepare',['ast_prepare',['../pearl-anglescan-tracker_8ipf.html#a766f90a9dad70d9deb4272ba480ee84a',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fset_5fprocessing',['ast_set_processing',['../pearl-anglescan-tracker_8ipf.html#a02271bf812a3e3f87c958f4c58e9f71b',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fsetup',['ast_setup',['../pearl-anglescan-tracker_8ipf.html#a5fb1f1abddb56b129f053605035d3281',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fupdate_5fdetector',['ast_update_detector',['../pearl-anglescan-tracker_8ipf.html#a150243e26e8adf8b354b8afde064136d',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fwindow_5fhook',['ast_window_hook',['../pearl-anglescan-tracker_8ipf.html#a33e84ae8e13f405d466b28e83f608cb9',1,'pearl-anglescan-tracker.ipf']]], + ['attributes_5fnotebook',['attributes_notebook',['../pearl-data-explorer_8ipf.html#ad6cfb2c00d5112add84542a25eb68b19',1,'pearl-data-explorer.ipf']]], + ['au4f',['Au4f',['../pearl-fitfuncs_8ipf.html#a13a5ee22049d9a3379cd6e55654e70a3',1,'pearl-fitfuncs.ipf']]], + ['au4f_5f2p2',['Au4f_2p2',['../pearl-fitfuncs_8ipf.html#a24cd6a0c96ef8c720e371bb31ac0a479',1,'pearl-fitfuncs.ipf']]], + ['au4f_5f2p3',['Au4f_2p3',['../pearl-fitfuncs_8ipf.html#a709f7c4585b1d850ea8aae1885ac18cb',1,'pearl-fitfuncs.ipf']]] +]; diff --git a/doc/html/search/all_1.html b/doc/html/search/all_1.html new file mode 100644 index 0000000..8cc6a1d --- /dev/null +++ b/doc/html/search/all_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_1.js b/doc/html/search/all_1.js new file mode 100644 index 0000000..2269d3b --- /dev/null +++ b/doc/html/search/all_1.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['beforefileopenhook',['BeforeFileOpenHook',['../pearl-area-import_8ipf.html#ae2cfa1ac6651cfc3fb0dfce03494995b',1,'BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind): pearl-area-import.ipf'],['../pearl-matrix-import_8ipf.html#ae2cfa1ac6651cfc3fb0dfce03494995b',1,'BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind): pearl-matrix-import.ipf']]], + ['bp_5fattach',['bp_attach',['../pearl-elog_8ipf.html#acbba78d869a543edf7c2b80d7a8d2344',1,'pearl-elog.ipf']]], + ['bp_5fattach_5fallnone',['bp_attach_allnone',['../pearl-elog_8ipf.html#a4040736819edadf4b26982bcfdb9c7b9',1,'pearl-elog.ipf']]], + ['bp_5fattach_5ftop',['bp_attach_top',['../pearl-elog_8ipf.html#a91b5f51982d23a36d1760b8874b5736a',1,'pearl-elog.ipf']]], + ['bp_5fattach_5fupdown',['bp_attach_updown',['../pearl-elog_8ipf.html#aa1dfae6d78a367d50ee8fc1ffe9cb69b',1,'pearl-elog.ipf']]], + ['bp_5fattr_5fnotebook',['bp_attr_notebook',['../pearl-data-explorer_8ipf.html#a4ef196f752bb5780ed4f4a588f9ebc81',1,'pearl-data-explorer.ipf']]], + ['bp_5fbrowse_5ffilepath',['bp_browse_filepath',['../pearl-data-explorer_8ipf.html#a02a64144b7ed2c1bc230e265c55e81a1',1,'pearl-data-explorer.ipf']]], + ['bp_5fcapture',['bp_capture',['../pearl-anglescan-tracker_8ipf.html#afaec8443094530fd1e723251e04c5dc9',1,'pearl-anglescan-tracker.ipf']]], + ['bp_5fclear',['bp_clear',['../pearl-elog_8ipf.html#ab39637298c93b7aefd67febf3a4e7672',1,'pearl-elog.ipf']]], + ['bp_5fdataset_5fdisplay',['bp_dataset_display',['../pearl-data-explorer_8ipf.html#a5660c6f5f78d880b0805bad4eefed1d5',1,'pearl-data-explorer.ipf']]], + ['bp_5fdataset_5ffolder',['bp_dataset_folder',['../pearl-data-explorer_8ipf.html#a6b642da731bde1029e0fa2ff69d5fb06',1,'pearl-data-explorer.ipf']]], + ['bp_5fdataset_5fnext',['bp_dataset_next',['../pearl-data-explorer_8ipf.html#a3bbb332e319ef7ec5f0fe2d16afaf005',1,'pearl-data-explorer.ipf']]], + ['bp_5fdataset_5fprev',['bp_dataset_prev',['../pearl-data-explorer_8ipf.html#add62ff5193206c9f207952bcd72dac88',1,'pearl-data-explorer.ipf']]], + ['bp_5fextract_5fslice',['bp_extract_slice',['../pearl-area-display_8ipf.html#a31461b664ec651a39442e9a46ffd88c9',1,'pearl-area-display.ipf']]], + ['bp_5ffile_5fnext',['bp_file_next',['../pearl-data-explorer_8ipf.html#a9cefcdc49b2169e99c743b0a683ed3a6',1,'pearl-data-explorer.ipf']]], + ['bp_5ffile_5fprev',['bp_file_prev',['../pearl-data-explorer_8ipf.html#a6aa44ff12b8530adbaaaf7405b1a68ba',1,'pearl-data-explorer.ipf']]], + ['bp_5fload_5ffiles',['bp_load_files',['../pearl-data-explorer_8ipf.html#a742902dfaf2246f10b70f52805c6df1f',1,'pearl-data-explorer.ipf']]], + ['bp_5fload_5ffiles_5fopt',['bp_load_files_opt',['../pearl-data-explorer_8ipf.html#ad61aa85dcf24dbf7e093dac3d0bf6f19',1,'pearl-data-explorer.ipf']]], + ['bp_5fload_5fprefs',['bp_load_prefs',['../pearl-data-explorer_8ipf.html#a1868754e64cb1448e564c0936e78574d',1,'pearl-data-explorer.ipf']]], + ['bp_5flogin',['bp_login',['../pearl-elog_8ipf.html#a14f8376a0485aa654ccf3d2f30ab4d01',1,'pearl-elog.ipf']]], + ['bp_5flogout',['bp_logout',['../pearl-elog_8ipf.html#ad4472ea917691c41ad0b4ea6f36010a5',1,'pearl-elog.ipf']]], + ['bp_5fmove_5fslice',['bp_move_slice',['../pearl-area-display_8ipf.html#ab8c9979c6f3ab95f983c2a525a69c035',1,'pearl-area-display.ipf']]], + ['bp_5fmove_5fslice_5fcenter',['bp_move_slice_center',['../pearl-area-display_8ipf.html#abe702d40071e3c5e662eb8d47dd6d885',1,'pearl-area-display.ipf']]], + ['bp_5freset_5fcursors',['bp_reset_cursors',['../pearl-area-display_8ipf.html#a24b17f99fafd8043ed3e4502000da316',1,'pearl-area-display.ipf']]], + ['bp_5fsave_5fgraphs',['bp_save_graphs',['../pearl-elog_8ipf.html#a8251cea45c8d1f1993a4051a6d0760c4',1,'pearl-elog.ipf']]], + ['bp_5fsave_5fprefs',['bp_save_prefs',['../pearl-data-explorer_8ipf.html#ad8a01428a137278a31d4f1f4f9c634c5',1,'pearl-data-explorer.ipf']]], + ['bp_5fsubmit',['bp_submit',['../pearl-elog_8ipf.html#adeff6678e57313cb218824f06d32b5ec',1,'pearl-elog.ipf']]], + ['bp_5fupdate_5fdatasets',['bp_update_datasets',['../pearl-data-explorer_8ipf.html#af9f8769ca2989f152f23d976d1467a48',1,'pearl-data-explorer.ipf']]], + ['bp_5fupdate_5ffilelist',['bp_update_filelist',['../pearl-data-explorer_8ipf.html#a45be265789a5260e3daa05eca0ec309e',1,'pearl-data-explorer.ipf']]], + ['broadening',['broadening',['../struct_doniach_sunjic_struct.html#ac9b18c8b44b43c2ee438f37f8d002a66',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/all_10.html b/doc/html/search/all_10.html new file mode 100644 index 0000000..c25484f --- /dev/null +++ b/doc/html/search/all_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_10.js b/doc/html/search/all_10.js new file mode 100644 index 0000000..350d8d5 --- /dev/null +++ b/doc/html/search/all_10.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['read_5fattribute_5finfo',['read_attribute_info',['../pearl-area-import_8ipf.html#ac98a5f2d12b559aba4e53192c49a7743',1,'pearl-area-import.ipf']]], + ['record_5fresults',['record_results',['../fermi-edge-analysis_8ipf.html#aac6bac1ee0582caa0676bdc9c2d254f0',1,'fermi-edge-analysis.ipf']]], + ['redim_5flinbg_5freduction',['redim_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a9b3321b9ed876ff50e260fa311ebf4be',1,'pearl-scienta-preprocess.ipf']]], + ['reduce_5fslab_5fimage',['reduce_slab_image',['../pearl-area-import_8ipf.html#acf0315ec8a3e927ef161a35cb05adb8b',1,'reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param): pearl-area-import.ipf'],['../pearl-pshell-import_8ipf.html#acf0315ec8a3e927ef161a35cb05adb8b',1,'reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param): pearl-pshell-import.ipf']]], + ['reduce_5fslab_5fworker',['reduce_slab_worker',['../pearl-area-import_8ipf.html#a33f8faf117450af1d6dae9ef48786cd6',1,'reduce_slab_worker(funcref reduction_func): pearl-area-import.ipf'],['../pearl-pshell-import_8ipf.html#a33f8faf117450af1d6dae9ef48786cd6',1,'reduce_slab_worker(funcref reduction_func): pearl-pshell-import.ipf']]], + ['rotate2d_5fx',['rotate2d_x',['../pearl-vector-operations_8ipf.html#ac579a92f012f0d0ef7b8f097e1c8b3c7',1,'pearl-vector-operations.ipf']]], + ['rotate2d_5fy',['rotate2d_y',['../pearl-vector-operations_8ipf.html#a355150c423ab975fe7f1832917118ea3',1,'pearl-vector-operations.ipf']]], + ['rotate_5fhemi_5fscan',['rotate_hemi_scan',['../pearl-anglescan-process_8ipf.html#a5162488b366e217195d8f8bd7cdde0ce',1,'pearl-anglescan-process.ipf']]], + ['rotate_5fx_5fwave',['rotate_x_wave',['../pearl-vector-operations_8ipf.html#ada80428496dc748b960bd9c65df7da8b',1,'pearl-vector-operations.ipf']]], + ['rotate_5fy_5fwave',['rotate_y_wave',['../pearl-vector-operations_8ipf.html#adfd1d68e739694982fbd00b76568c1c0',1,'pearl-vector-operations.ipf']]], + ['rotate_5fz_5fwave',['rotate_z_wave',['../pearl-vector-operations_8ipf.html#a0030e927980581d57781ad391f2d872a',1,'pearl-vector-operations.ipf']]] +]; diff --git a/doc/html/search/all_11.html b/doc/html/search/all_11.html new file mode 100644 index 0000000..3615c28 --- /dev/null +++ b/doc/html/search/all_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_11.js b/doc/html/search/all_11.js new file mode 100644 index 0000000..a21b41a --- /dev/null +++ b/doc/html/search/all_11.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['save_5fhemi_5fscan',['save_hemi_scan',['../pearl-anglescan-process_8ipf.html#a48cbd596656bc6d849c53afb4c58b90d',1,'pearl-anglescan-process.ipf']]], + ['save_5fprefs',['save_prefs',['../pearl-anglescan-tracker_8ipf.html#ac729557a307bddd2f2ad298199976c01',1,'save_prefs(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#ac729557a307bddd2f2ad298199976c01',1,'save_prefs(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#ac729557a307bddd2f2ad298199976c01',1,'save_prefs(): pearl-elog.ipf']]], + ['save_5ftracker_5fdata',['save_tracker_data',['../pearl-anglescan-tracker_8ipf.html#a8d6e9058f2b0b4978f56e892ce199e6a',1,'pearl-anglescan-tracker.ipf']]], + ['scienta_5fang_5ftransm',['scienta_ang_transm',['../pearl-scienta-preprocess_8ipf.html#a26f46acd339fb483ce9792e06170c189',1,'pearl-scienta-preprocess.ipf']]], + ['scienta_5fnorm',['scienta_norm',['../pearl-scienta-preprocess_8ipf.html#a09ae6058d39d76a59c862e945d512fa8',1,'pearl-scienta-preprocess.ipf']]], + ['scienta_5fpoly_5fbg',['scienta_poly_bg',['../pearl-scienta-preprocess_8ipf.html#a26e51aa77d5f416d613f1c5df82b6f5c',1,'pearl-scienta-preprocess.ipf']]], + ['select_5fdataset',['select_dataset',['../pearl-pshell-import_8ipf.html#abb4afdef6ae4476c25a1ff77b17266c3',1,'pearl-pshell-import.ipf']]], + ['set_5fpanel_5fattributes',['set_panel_attributes',['../pearl-elog_8ipf.html#a39a1f418c8a2f9a5e4ab976827d8efca',1,'pearl-elog.ipf']]], + ['set_5fpanel_5fgraphs',['set_panel_graphs',['../pearl-elog_8ipf.html#a6eca5f4fab999984df32b50dd669c0b1',1,'pearl-elog.ipf']]], + ['set_5fpanel_5fmessage',['set_panel_message',['../pearl-elog_8ipf.html#aa7a3988440bb6d73573b50a4698a0e75',1,'pearl-elog.ipf']]], + ['set_5fpolar_5fgraph_5fcursor',['set_polar_graph_cursor',['../pearl-anglescan-process_8ipf.html#a70b0e243bcbd549e2b1da74aab605629',1,'pearl-anglescan-process.ipf']]], + ['set_5frotation_5fx',['set_rotation_x',['../pearl-vector-operations_8ipf.html#a8a8dff94d9f7b992c2c2c0744001e74b',1,'pearl-vector-operations.ipf']]], + ['set_5frotation_5fy',['set_rotation_y',['../pearl-vector-operations_8ipf.html#adfdf1cfe8812d8d0006228f6c14c9582',1,'pearl-vector-operations.ipf']]], + ['set_5frotation_5fz',['set_rotation_z',['../pearl-vector-operations_8ipf.html#a76feca10fe5d3e085f01c73a59b38424',1,'pearl-vector-operations.ipf']]], + ['set_5ftrace_5fcolors',['set_trace_colors',['../pearl-area-display_8ipf.html#abafc4f012b04592724109f4757cbe271',1,'pearl-area-display.ipf']]], + ['setup_5fdata',['setup_data',['../pearl-anglescan-tracker_8ipf.html#a6bfd8b6eba0b206df6ec56c7b6489e0b',1,'pearl-anglescan-tracker.ipf']]], + ['setup_5fdetector',['setup_detector',['../pearl-anglescan-tracker_8ipf.html#aa79c1d1584eb2322adae328bf1437f34',1,'pearl-anglescan-tracker.ipf']]], + ['setup_5fgraph',['setup_graph',['../pearl-anglescan-tracker_8ipf.html#aa7c4e3e0ed255e61bc80f8b27b78fce6',1,'pearl-anglescan-tracker.ipf']]], + ['shockley_5fanglefit',['Shockley_anglefit',['../pearl-scienta-preprocess_8ipf.html#adc472d56286afd855109d561fbf633bd',1,'pearl-scienta-preprocess.ipf']]], + ['show_5fanalyser_5fline',['show_analyser_line',['../pearl-anglescan-process_8ipf.html#a01bac9e7d4ba743c3c34177a05070466',1,'pearl-anglescan-process.ipf']]], + ['show_5fpreview_5fgraph',['show_preview_graph',['../pearl-data-explorer_8ipf.html#a4db79d04c74beb1af71b72916f8f0362',1,'pearl-data-explorer.ipf']]], + ['show_5fshift',['show_shift',['../fermi-edge-analysis_8ipf.html#acf72d644b8d37b6c26b1e070edba4e30',1,'fermi-edge-analysis.ipf']]], + ['showcomponents_5fau4f_5f2p2',['ShowComponents_Au4f_2p2',['../pearl-fitfuncs_8ipf.html#a84a0278284332631682ce032018d1716',1,'pearl-fitfuncs.ipf']]], + ['showcomponents_5fau4f_5f2p3',['ShowComponents_Au4f_2p3',['../pearl-fitfuncs_8ipf.html#a02368cc4adfbd746cd2f1e7d73884a61',1,'pearl-fitfuncs.ipf']]], + ['slit_5fcorrection',['slit_correction',['../fermi-edge-analysis_8ipf.html#a4cec596c8fd2b21953cb45d6d347211d',1,'fermi-edge-analysis.ipf']]], + ['slit_5fshift',['slit_shift',['../fermi-edge-analysis_8ipf.html#a27f000c3a3ea74c49db31716be3396d4',1,'fermi-edge-analysis.ipf']]], + ['slp_5fslice_5fposition',['slp_slice_position',['../pearl-area-display_8ipf.html#ace169e0824e6bddbd646972946edccbe',1,'pearl-area-display.ipf']]], + ['strip_5fdelete_5fframes',['strip_delete_frames',['../pearl-anglescan-process_8ipf.html#a13e0d37ae23f68cdc5da3d84cb4beed8',1,'pearl-anglescan-process.ipf']]], + ['subtract_5fline_5fbg',['subtract_line_bg',['../pearl-matrix-import_8ipf.html#ab80101bc780dcbe94200e2446bce51d9',1,'pearl-matrix-import.ipf']]], + ['success',['SUCCESS',['../structerror_code.html#a36a53ca508600b841a54cfd3a3fd5402',1,'errorCode']]], + ['sumwavesiterator',['SumWavesIterator',['../pearl-tools_8ipf.html#aea193a1b5fbdbb2a5dec9f25f3c05c45',1,'pearl-tools.ipf']]], + ['svp_5fslice_5fposition',['svp_slice_position',['../pearl-area-display_8ipf.html#a174177742fdce7f37027de8fa832b3bd',1,'pearl-area-display.ipf']]], + ['svp_5fsmoothing',['svp_smoothing',['../pearl-area-display_8ipf.html#ab10a0d94991b9cd958557dbc48d70624',1,'pearl-area-display.ipf']]] +]; diff --git a/doc/html/search/all_12.html b/doc/html/search/all_12.html new file mode 100644 index 0000000..abd082a --- /dev/null +++ b/doc/html/search/all_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_12.js b/doc/html/search/all_12.js new file mode 100644 index 0000000..c4c2be0 --- /dev/null +++ b/doc/html/search/all_12.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['test_5fattributes_5fnotebook',['test_attributes_notebook',['../pearl-data-explorer_8ipf.html#a71f9c277d310c3f4e7739be69dad0ab5',1,'pearl-data-explorer.ipf']]], + ['test_5fint_5flinbg',['test_int_linbg',['../pearl-scienta-preprocess_8ipf.html#a01fdc27931518dc988500b3cba409e57',1,'pearl-scienta-preprocess.ipf']]], + ['test_5fint_5fquadbg',['test_int_quadbg',['../pearl-scienta-preprocess_8ipf.html#a1b1f473b96119afa602759a51e0c5b4c',1,'pearl-scienta-preprocess.ipf']]], + ['test_5fshockley_5fanglefit',['test_shockley_anglefit',['../pearl-scienta-preprocess_8ipf.html#ad9c09259aaaf32246fe9391dfb3e2c93',1,'pearl-scienta-preprocess.ipf']]], + ['todo_20list',['Todo List',['../todo.html',1,'']]], + ['toggle_5fcapture',['toggle_capture',['../pearl-anglescan-tracker_8ipf.html#a02987fe03ea914a53c52d58219979d65',1,'pearl-anglescan-tracker.ipf']]], + ['trim_5fhemi_5fscan',['trim_hemi_scan',['../pearl-anglescan-process_8ipf.html#a5dc0cc7db9d3d7a6b3fa3f1b04d84a5e',1,'pearl-anglescan-process.ipf']]], + ['twave2list',['twave2list',['../pearl-pshell-import_8ipf.html#a92a18d6e81c3f521ba3bb240eaf578a9',1,'pearl-pshell-import.ipf']]] +]; diff --git a/doc/html/search/all_13.html b/doc/html/search/all_13.html new file mode 100644 index 0000000..88fa653 --- /dev/null +++ b/doc/html/search/all_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_13.js b/doc/html/search/all_13.js new file mode 100644 index 0000000..58bcb35 --- /dev/null +++ b/doc/html/search/all_13.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['unknown_5ferror',['UNKNOWN_ERROR',['../structerror_code.html#a11b729058e2f4a2698ddaecf4e61c846',1,'errorCode']]], + ['unloadpearlarpespackage',['UnloadPearlArpesPackage',['../pearl-arpes_8ipf.html#ac41f24572943dac2b40c255797a6c7a8',1,'pearl-arpes.ipf']]], + ['update_5fattach_5fitems',['update_attach_items',['../pearl-elog_8ipf.html#a9c1cfd320e88e84dcf4f84bbcf3f46a5',1,'pearl-elog.ipf']]], + ['update_5fcapture',['update_capture',['../pearl-anglescan-tracker_8ipf.html#a9751db419b4c0de884450c09ff5822a7',1,'pearl-anglescan-tracker.ipf']]], + ['update_5fdata_5fgraph',['update_data_graph',['../pearl-anglescan-tracker_8ipf.html#a0b8ff36cf3c20b1c0db3217d9065f7cf',1,'pearl-anglescan-tracker.ipf']]], + ['update_5fdatasets',['update_datasets',['../pearl-data-explorer_8ipf.html#ad50f4c430d8bfe0fb5a1356cd9b84bf4',1,'pearl-data-explorer.ipf']]], + ['update_5fdetector',['update_detector',['../pearl-anglescan-tracker_8ipf.html#ab961340af09fed4d2006bca8c0f2edd5',1,'pearl-anglescan-tracker.ipf']]], + ['update_5fdetector_5fgraph',['update_detector_graph',['../pearl-anglescan-tracker_8ipf.html#af5a2960c49626f267fbd2873b27c8e42',1,'pearl-anglescan-tracker.ipf']]], + ['update_5ffilelist',['update_filelist',['../pearl-data-explorer_8ipf.html#a04cc0b9d5e3a649ba3514fcbf126eefe',1,'pearl-data-explorer.ipf']]], + ['update_5fpolar_5finfo',['update_polar_info',['../pearl-anglescan-process_8ipf.html#a1baaa3ffd9495ed427b43cbfe6e1edf8',1,'pearl-anglescan-process.ipf']]], + ['update_5fprogress_5fpanel',['update_progress_panel',['../pearl-gui-tools_8ipf.html#a97ad19d83cf0007c4bcf97a32164610f',1,'pearl-gui-tools.ipf']]], + ['update_5fslice_5finfo',['update_slice_info',['../pearl-area-display_8ipf.html#a2442bc044aaa12ab817a5f9fa300d1f8',1,'pearl-area-display.ipf']]] +]; diff --git a/doc/html/search/all_14.html b/doc/html/search/all_14.html new file mode 100644 index 0000000..518db1d --- /dev/null +++ b/doc/html/search/all_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_14.js b/doc/html/search/all_14.js new file mode 100644 index 0000000..2e90f28 --- /dev/null +++ b/doc/html/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version',['version',['../pearl-anglescan-tracker_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab',1,'version(): pearl-anglescan-tracker.ipf'],['../pearl-fitfuncs_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab',1,'version(): pearl-fitfuncs.ipf']]] +]; diff --git a/doc/html/search/all_15.html b/doc/html/search/all_15.html new file mode 100644 index 0000000..1331c0d --- /dev/null +++ b/doc/html/search/all_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_15.js b/doc/html/search/all_15.js new file mode 100644 index 0000000..1ceb671 --- /dev/null +++ b/doc/html/search/all_15.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['wave2list',['wave2list',['../pearl-pshell-import_8ipf.html#aa6dc3e3f7dc1ca4346132635a90fc447',1,'pearl-pshell-import.ipf']]], + ['wave_5fexist',['WAVE_EXIST',['../structerror_code.html#aa91bd8ef7a635f4575161813ebb09f3b',1,'errorCode']]], + ['wrong_5fparameter',['WRONG_PARAMETER',['../structerror_code.html#aa4279dfdaceed3bd57336cd4e38ed739',1,'errorCode']]] +]; diff --git a/doc/html/search/all_16.html b/doc/html/search/all_16.html new file mode 100644 index 0000000..bec9d5d --- /dev/null +++ b/doc/html/search/all_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_16.js b/doc/html/search/all_16.js new file mode 100644 index 0000000..7ff7b6f --- /dev/null +++ b/doc/html/search/all_16.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xdw',['xdw',['../struct_doniach_sunjic_struct.html#a750e7260bf5d4c936dadde714fb2db52',1,'DoniachSunjicStruct']]], + ['xw',['xw',['../struct_doniach_sunjic_struct.html#a45c3a3fa68850032e545907ca65ab982',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/all_17.html b/doc/html/search/all_17.html new file mode 100644 index 0000000..6d010fd --- /dev/null +++ b/doc/html/search/all_17.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_17.js b/doc/html/search/all_17.js new file mode 100644 index 0000000..246bc4f --- /dev/null +++ b/doc/html/search/all_17.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['yw',['yw',['../struct_doniach_sunjic_struct.html#a6cef648ad0cf4be1dd9fbe33ff5df1eb',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/all_2.html b/doc/html/search/all_2.html new file mode 100644 index 0000000..d15ac65 --- /dev/null +++ b/doc/html/search/all_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_2.js b/doc/html/search/all_2.js new file mode 100644 index 0000000..3f64e91 --- /dev/null +++ b/doc/html/search/all_2.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['calc_5fdoniachsunjicbroad',['Calc_DoniachSunjicBroad',['../pearl-fitfuncs_8ipf.html#aff8e8b103c32c8e723b57ce7ad5ef0f5',1,'pearl-fitfuncs.ipf']]], + ['calc_5fgraph_5fazi',['calc_graph_azi',['../pearl-anglescan-process_8ipf.html#a4fc744e24e3e9c5efb17f14ab622bcae',1,'pearl-anglescan-process.ipf']]], + ['calc_5fgraph_5fpolar',['calc_graph_polar',['../pearl-anglescan-process_8ipf.html#ae2b036a06ffac8d2bb292a65401f8a9a',1,'pearl-anglescan-process.ipf']]], + ['calc_5fgraph_5fradius',['calc_graph_radius',['../pearl-anglescan-process_8ipf.html#a75219b38ea58012abcffc848d536faa4',1,'pearl-anglescan-process.ipf']]], + ['calc_5fnth',['calc_nth',['../pearl-anglescan-process_8ipf.html#a9624070f3e938378631432430d47a389',1,'pearl-anglescan-process.ipf']]], + ['calc_5fphi_5fstep',['calc_phi_step',['../pearl-anglescan-process_8ipf.html#a999a9cd7d00d3e1ec8e768228a664ad1',1,'pearl-anglescan-process.ipf']]], + ['calc_5fthe_5fstep',['Calc_The_step',['../pearl-anglescan-process_8ipf.html#a1fb6aa7870dfbf0ed92660b7aae579e0',1,'pearl-anglescan-process.ipf']]], + ['calc_5fy_5fprofile_5fmins',['calc_y_profile_mins',['../pearl-area-profiles_8ipf.html#ab58b7c0a88743ecbcb0fc8296577a792',1,'pearl-area-profiles.ipf']]], + ['calcn_5ftheta',['CalcN_Theta',['../pearl-anglescan-process_8ipf.html#ac0def1ded61f9cd758df0c99f4ff9470',1,'pearl-anglescan-process.ipf']]], + ['capture_5fint_5flinbg_5fcursors',['capture_int_linbg_cursors',['../pearl-scienta-preprocess_8ipf.html#ae6877c51ad15c2ba8a69c65356cb34b8',1,'pearl-scienta-preprocess.ipf']]], + ['cart2polar',['cart2polar',['../pearl-polar-coordinates_8ipf.html#aca0a5aaa4854d83ef667c53007312fb8',1,'pearl-polar-coordinates.ipf']]], + ['cart2polar_5fwave',['cart2polar_wave',['../pearl-polar-coordinates_8ipf.html#adfc1f0b3cddf672b0ccdb6a22b97ba9e',1,'pearl-polar-coordinates.ipf']]], + ['check_5fpackage_5ffolder',['check_package_folder',['../pearl-matrix-import_8ipf.html#ac7790f06151821678a65ab0065a5323e',1,'pearl-matrix-import.ipf']]], + ['cleanup_5ftemp_5ffiles',['cleanup_temp_files',['../pearl-elog_8ipf.html#ad7640d06f004ecd4a8980ea29d24dcbe',1,'pearl-elog.ipf']]], + ['clear_5fhemi_5fgrid',['clear_hemi_grid',['../pearl-anglescan-process_8ipf.html#a3ec6935a5903d0974c93a2072d743013',1,'pearl-anglescan-process.ipf']]], + ['convert_5fangles_5fttpa2polar',['convert_angles_ttpa2polar',['../pearl-anglescan-process_8ipf.html#a3cc7eddf5c6b0658260cfb32dd2c026d',1,'pearl-anglescan-process.ipf']]], + ['convert_5fangles_5fttpd2polar',['convert_angles_ttpd2polar',['../pearl-anglescan-process_8ipf.html#a2b38c6c9b6e60593ba69d3773b6bc779',1,'pearl-anglescan-process.ipf']]], + ['convolution',['convolution',['../struct_doniach_sunjic_struct.html#a7f05f7827435fea3c986a8d538496955',1,'DoniachSunjicStruct']]], + ['create_5fcmd_5ffile',['create_cmd_file',['../pearl-elog_8ipf.html#ac8b61eefed231018cc36d47e95bd8c22',1,'pearl-elog.ipf']]], + ['create_5fgraph_5ffile',['create_graph_file',['../pearl-elog_8ipf.html#a2417d079483f773f8231c5f2caba6cf0',1,'pearl-elog.ipf']]], + ['create_5fmessage_5ffile',['create_message_file',['../pearl-elog_8ipf.html#af652f6f257be1ee749fe788d1b03f75f',1,'pearl-elog.ipf']]], + ['create_5frotation_5fmatrix_5ffree',['create_rotation_matrix_free',['../pearl-vector-operations_8ipf.html#a72c3200a7344c708ea76e20cc2c19c43',1,'pearl-vector-operations.ipf']]], + ['crop_5fstrip',['crop_strip',['../pearl-anglescan-process_8ipf.html#ab65d25af7476ed18f7bf7359614a912b',1,'pearl-anglescan-process.ipf']]], + ['csr_5fint_5flinbg_5freduction',['csr_int_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a95fbd22f52f61d2bff0625b7b8e159d1',1,'pearl-scienta-preprocess.ipf']]] +]; diff --git a/doc/html/search/all_3.html b/doc/html/search/all_3.html new file mode 100644 index 0000000..9f526c6 --- /dev/null +++ b/doc/html/search/all_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_3.js b/doc/html/search/all_3.js new file mode 100644 index 0000000..0ce78c2 --- /dev/null +++ b/doc/html/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['defaultfolderiterator',['DefaultFolderIterator',['../pearl-tools_8ipf.html#a3fb8c06030dc41a599380150807caeb0',1,'pearl-tools.ipf']]], + ['defaultwaveiterator',['DefaultWaveIterator',['../pearl-tools_8ipf.html#a6bdd1c0b269f1d7d99843ce0cb218cc7',1,'pearl-tools.ipf']]], + ['display2dprofiles',['Display2dProfiles',['../pearl-menu_8ipf.html#aad7d768680c6d8a9b8a7025c7e1ec75d',1,'pearl-menu.ipf']]], + ['display3dslicer',['Display3dSlicer',['../pearl-menu_8ipf.html#ac73a94f760455f19294a9f917b43f145',1,'pearl-menu.ipf']]], + ['display_5fdataset',['display_dataset',['../pearl-data-explorer_8ipf.html#ae79a57a41c734ce8836f427b81011b5d',1,'pearl-data-explorer.ipf']]], + ['display_5fhemi_5fscan',['display_hemi_scan',['../pearl-anglescan-process_8ipf.html#ae57302acfc822c4817f2b7eef55efea2',1,'pearl-anglescan-process.ipf']]], + ['display_5fpolar_5fgraph',['display_polar_graph',['../pearl-anglescan-process_8ipf.html#a46fd99d35a43601c39af6096d4e4f770',1,'pearl-anglescan-process.ipf']]], + ['display_5fpreview_5ftrace',['display_preview_trace',['../pearl-data-explorer_8ipf.html#a001074020ad32b290d390a450a389c69',1,'pearl-data-explorer.ipf']]], + ['display_5fprogress_5fpanel',['display_progress_panel',['../pearl-gui-tools_8ipf.html#aaf29d090c81e00cf44af295193b24c5a',1,'pearl-gui-tools.ipf']]], + ['display_5fscanlines',['display_scanlines',['../pearl-anglescan-process_8ipf.html#a1f4f74a8ae557c56e1e3aacd0b45f3f1',1,'pearl-anglescan-process.ipf']]], + ['displaygizmoslicer',['DisplayGizmoSlicer',['../pearl-menu_8ipf.html#aab34952c2f3b36f9ee8619eb901ff581',1,'pearl-menu.ipf']]], + ['doniachsunjicbroad',['DoniachSunjicBroad',['../pearl-fitfuncs_8ipf.html#ae2d138beb7cb39e8042487893095b461',1,'pearl-fitfuncs.ipf']]], + ['doniachsunjicbroads',['DoniachSunjicBroadS',['../pearl-fitfuncs_8ipf.html#a9d110819fa3cd2173f3103724e394fdf',1,'pearl-fitfuncs.ipf']]], + ['doniachsunjicstruct',['DoniachSunjicStruct',['../struct_doniach_sunjic_struct.html',1,'']]], + ['draw_5fdiffraction_5fcone',['draw_diffraction_cone',['../pearl-anglescan-process_8ipf.html#afedad38a418cee5d1fb9e08aae2160a0',1,'pearl-anglescan-process.ipf']]], + ['draw_5fhemi_5faxes',['draw_hemi_axes',['../pearl-anglescan-process_8ipf.html#af00d9061e410ad033a9fd1f0ca561e0d',1,'pearl-anglescan-process.ipf']]], + ['ds1_5fbg',['ds1_bg',['../pearl-fitfuncs_8ipf.html#af62cb65b7444ff60e956a45bd5d0ec27',1,'pearl-fitfuncs.ipf']]], + ['ds2_5fbg',['ds2_bg',['../pearl-fitfuncs_8ipf.html#a1e729418252bf0d05ea6ec5cbd65b834',1,'pearl-fitfuncs.ipf']]], + ['ds4_5fbg',['ds4_bg',['../pearl-fitfuncs_8ipf.html#ab32134566b2573672ac674565deebd36',1,'pearl-fitfuncs.ipf']]], + ['ds6_5fbg',['ds6_bg',['../pearl-fitfuncs_8ipf.html#a5a2a03026b88f3dd99214ab1b26e6f80',1,'pearl-fitfuncs.ipf']]], + ['duplicate_5fhemi_5fscan',['duplicate_hemi_scan',['../pearl-anglescan-process_8ipf.html#aa5b1e2ab1dd43a73b7157406b803887e',1,'pearl-anglescan-process.ipf']]] +]; diff --git a/doc/html/search/all_4.html b/doc/html/search/all_4.html new file mode 100644 index 0000000..7b814aa --- /dev/null +++ b/doc/html/search/all_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_4.js b/doc/html/search/all_4.js new file mode 100644 index 0000000..931ed3c --- /dev/null +++ b/doc/html/search/all_4.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['edit_5foffsets',['edit_offsets',['../pearl-anglescan-tracker_8ipf.html#a37aaf2f08c3910bed554a10dd82616ec',1,'pearl-anglescan-tracker.ipf']]], + ['edit_5freduction_5fparams',['edit_reduction_params',['../pearl-anglescan-tracker_8ipf.html#a3844e7fd93b4f54aa52f084687c2106c',1,'pearl-anglescan-tracker.ipf']]], + ['elog_5fadd_5fattachment',['elog_add_attachment',['../pearl-elog_8ipf.html#ac2f76abed8cfaa7ac02a46c0b89004f0',1,'pearl-elog.ipf']]], + ['elog_5fconfig',['elog_config',['../pearl-elog_8ipf.html#a424460442afd5f6f853e68cd665ed785',1,'pearl-elog.ipf']]], + ['elog_5fcreate_5fentry',['elog_create_entry',['../pearl-elog_8ipf.html#a05301d497e4796e5fb5adde3728ba971',1,'pearl-elog.ipf']]], + ['elog_5fcreate_5flogbook',['elog_create_logbook',['../pearl-elog_8ipf.html#ab6d97edbf33e8ec039b34ff756e7ab93',1,'pearl-elog.ipf']]], + ['elog_5finit_5fpearl_5ftemplates',['elog_init_pearl_templates',['../pearl-elog_8ipf.html#aaca820a0149ce6a0e843ca72b9c9e7ab',1,'pearl-elog.ipf']]], + ['elog_5flogin',['elog_login',['../pearl-elog_8ipf.html#a3eac4012891c2813e401aee2c1134763',1,'pearl-elog.ipf']]], + ['elog_5flogout',['elog_logout',['../pearl-elog_8ipf.html#a96e4cbbdb0fd8c58d87b502dc1883664',1,'pearl-elog.ipf']]], + ['elog_5fpanel_5fhook',['elog_panel_hook',['../pearl-elog_8ipf.html#af8b1ea711208bcc2cd1647abe04131dc',1,'pearl-elog.ipf']]], + ['elog_5fparse_5fid',['elog_parse_id',['../pearl-elog_8ipf.html#a6a9923c6465c91b1f9d1d97b090f424b',1,'pearl-elog.ipf']]], + ['elog_5fprompt_5flogbook',['elog_prompt_logbook',['../pearl-elog_8ipf.html#acedf0c8ae34e9ebadd6fa0d9d1353aa4',1,'pearl-elog.ipf']]], + ['elog_5fprompt_5flogin',['elog_prompt_login',['../pearl-elog_8ipf.html#afbace5ffc3167b42b09657ce6cc854ca',1,'pearl-elog.ipf']]], + ['elog_5fsuccess_5fmsg',['elog_success_msg',['../pearl-elog_8ipf.html#a63aa38b624b66fe502505040c25bc0c3',1,'pearl-elog.ipf']]], + ['elog_5fvalidate_5fattributes',['elog_validate_attributes',['../pearl-elog_8ipf.html#ab2558ef5cd5e5dfba410bd58ed258b64',1,'pearl-elog.ipf']]], + ['empty_5fresultfile',['EMPTY_RESULTFILE',['../structerror_code.html#ab7f29ef2ba8497c55f2bc55c4b9fc186',1,'errorCode']]], + ['epics_5fconnect',['epics_connect',['../pearl-anglescan-tracker_8ipf.html#a306b168cab2f9c4146cee87009e69f6d',1,'pearl-anglescan-tracker.ipf']]], + ['epics_5fdisconnect',['epics_disconnect',['../pearl-anglescan-tracker_8ipf.html#a4619cb98a75adb3c39ea3a62e524b793',1,'pearl-anglescan-tracker.ipf']]], + ['epics_5fdisconnect_5fchid',['epics_disconnect_chid',['../pearl-anglescan-tracker_8ipf.html#acfe94a64ff3e8c4cb32e34ffb9cae594',1,'pearl-anglescan-tracker.ipf']]], + ['errorcode',['errorCode',['../structerror_code.html',1,'']]], + ['export_5ftracker_5fdata',['export_tracker_data',['../pearl-anglescan-tracker_8ipf.html#a09e95dbf1582fcf2e6f71baddb147f86',1,'pearl-anglescan-tracker.ipf']]], + ['extend_5fdata',['extend_data',['../pearl-anglescan-tracker_8ipf.html#a4bde8b2fc39c61c0d5a6879f1d0ae115',1,'pearl-anglescan-tracker.ipf']]], + ['extract_5fpreview_5fimage',['extract_preview_image',['../pearl-data-explorer_8ipf.html#a0adc1b370fd3bf230b61b094b3c0accb',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/all_5.html b/doc/html/search/all_5.html new file mode 100644 index 0000000..d8de556 --- /dev/null +++ b/doc/html/search/all_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_5.js b/doc/html/search/all_5.js new file mode 100644 index 0000000..11d144f --- /dev/null +++ b/doc/html/search/all_5.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['fermi_2dedge_2danalysis_2eipf',['fermi-edge-analysis.ipf',['../fermi-edge-analysis_8ipf.html',1,'']]], + ['fermifunclindos2d_5fcorr',['FermiFuncLinDOS2D_corr',['../fermi-edge-analysis_8ipf.html#a520d8de9fbc4276c19fb417861f05b0d',1,'fermi-edge-analysis.ipf']]], + ['fermigaussconv',['FermiGaussConv',['../pearl-fitfuncs_8ipf.html#a4d20215153c0e0cee3870dfceded8bc9',1,'pearl-fitfuncs.ipf']]], + ['file_5fnot_5freadable',['FILE_NOT_READABLE',['../structerror_code.html#a71ce7c0413c44515d9570dab1ffd5ffd',1,'errorCode']]], + ['find_5fattr_5ffolder',['find_attr_folder',['../pearl-pshell-import_8ipf.html#a41bf534983b0662ec2609b136c395f14',1,'pearl-pshell-import.ipf']]], + ['find_5fhemi_5fdata',['find_hemi_data',['../pearl-anglescan-process_8ipf.html#aa26c9ed4c4d703e07788d980edc2406d',1,'pearl-anglescan-process.ipf']]], + ['find_5fscale_5fwave',['find_scale_wave',['../pearl-pshell-import_8ipf.html#acfb01ee360b66f286225f6e9c7220ba2',1,'pearl-pshell-import.ipf']]], + ['find_5fscan_5ffolder',['find_scan_folder',['../pearl-pshell-import_8ipf.html#a79b968d7439dfbfbc38c05f933071489',1,'pearl-pshell-import.ipf']]], + ['fit_5fdoniachsunjicbroad',['Fit_DoniachSunjicBroad',['../pearl-fitfuncs_8ipf.html#a819902ab9f541b75a0fd33a7b52465d0',1,'pearl-fitfuncs.ipf']]], + ['fit_5fscienta_5fang_5ftransm',['fit_scienta_ang_transm',['../pearl-scienta-preprocess_8ipf.html#a8536a1da8aa85e34370f384ad2ee0d5e',1,'pearl-scienta-preprocess.ipf']]], + ['fit_5fscienta_5fpoly_5fbg',['fit_scienta_poly_bg',['../pearl-scienta-preprocess_8ipf.html#a4f850a816852a1d0e22deaf894765c2c',1,'pearl-scienta-preprocess.ipf']]], + ['format_5furl',['format_url',['../pearl-elog_8ipf.html#a3cc9074c84d684d207dfdf2045755df4',1,'pearl-elog.ipf']]] +]; diff --git a/doc/html/search/all_6.html b/doc/html/search/all_6.html new file mode 100644 index 0000000..9ba0cc2 --- /dev/null +++ b/doc/html/search/all_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_6.js b/doc/html/search/all_6.js new file mode 100644 index 0000000..eb49752 --- /dev/null +++ b/doc/html/search/all_6.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['gather_5fbatch',['gather_batch',['../pearl-otf-import_8ipf.html#ae2640256d7d07c11b41621430279cef6',1,'pearl-otf-import.ipf']]], + ['get_5fdefault_5fpanel_5fname',['get_default_panel_name',['../pearl-elog_8ipf.html#a1376b5c9e6b1180a09961bc3296849ae',1,'pearl-elog.ipf']]], + ['get_5felog_5fdf',['get_elog_df',['../pearl-elog_8ipf.html#ac45196cb9ce8b43b76c9daf67689c49a',1,'pearl-elog.ipf']]], + ['get_5fhemi_5fnickname',['get_hemi_nickname',['../pearl-anglescan-process_8ipf.html#a987811346894d8d81fc590b2f5ccec49',1,'pearl-anglescan-process.ipf']]], + ['get_5fhemi_5fprefix',['get_hemi_prefix',['../pearl-anglescan-process_8ipf.html#a1442bc23122d52ba9c77e0f9baaad1da',1,'pearl-anglescan-process.ipf']]], + ['get_5flog_5fpath',['get_log_path',['../pearl-elog_8ipf.html#ad1a72c63f269b2e22b21a72d1ef3b279',1,'pearl-elog.ipf']]], + ['get_5fpanel_5fattributes',['get_panel_attributes',['../pearl-elog_8ipf.html#a66e1200515eff8cd5c961572eccd7220',1,'pearl-elog.ipf']]], + ['get_5fpanel_5fgraphs',['get_panel_graphs',['../pearl-elog_8ipf.html#ace94356f691cbe343761aabd67ced23c',1,'pearl-elog.ipf']]], + ['get_5fpanel_5fmessage',['get_panel_message',['../pearl-elog_8ipf.html#a7ce92b03b6a786129959d44bf1112efa',1,'pearl-elog.ipf']]], + ['get_5fsource_5fimage',['get_source_image',['../pearl-area-display_8ipf.html#a4b76a98582f5997d3810f969dbb6c4ed',1,'pearl-area-display.ipf']]], + ['get_5ftimestamp',['get_timestamp',['../pearl-elog_8ipf.html#a6b2d6cf641c61120332ac1983b2f3846',1,'pearl-elog.ipf']]], + ['get_5fview_5ffolder',['get_view_folder',['../pearl-area-display_8ipf.html#a1bf20e37ed3e9c76be8ebe448c68a048',1,'pearl-area-display.ipf']]], + ['get_5fview_5fimage',['get_view_image',['../pearl-area-display_8ipf.html#a6cc0970b41ca197fa47263556fa2686a',1,'pearl-area-display.ipf']]], + ['getattrdatafolderdfr',['GetAttrDataFolderDFR',['../pearl-area-import_8ipf.html#aa3cdc56096a6a1bf2a2d80a6245a36d2',1,'pearl-area-import.ipf']]], + ['graphname_5ffrom_5fdfref',['graphname_from_dfref',['../pearl-area-display_8ipf.html#a195b12857685c4e535a840c5db324b4a',1,'pearl-area-display.ipf']]] +]; diff --git a/doc/html/search/all_7.html b/doc/html/search/all_7.html new file mode 100644 index 0000000..9384ec9 --- /dev/null +++ b/doc/html/search/all_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_7.js b/doc/html/search/all_7.js new file mode 100644 index 0000000..ff8d65b --- /dev/null +++ b/doc/html/search/all_7.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['hemi_5fadd_5fanglescan',['hemi_add_anglescan',['../pearl-anglescan-process_8ipf.html#a4952bc53e3d6d272d25b5e35e91696b5',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fadd_5faziscan',['hemi_add_aziscan',['../pearl-anglescan-process_8ipf.html#a4641c716180d737700c6df87f5f8974e',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fazi_5fcut',['hemi_azi_cut',['../pearl-anglescan-process_8ipf.html#ab6ac1268de338040028dca8d0ddc967c',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fpolar_5fcut',['hemi_polar_cut',['../pearl-anglescan-process_8ipf.html#aa486e16909d01e2251eeb4d635b972b1',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fradius_5fmm',['hemi_radius_mm',['../fermi-edge-analysis_8ipf.html#a0cb8da36beae05c79fe5b1da918d3897',1,'fermi-edge-analysis.ipf']]] +]; diff --git a/doc/html/search/all_8.html b/doc/html/search/all_8.html new file mode 100644 index 0000000..37566c5 --- /dev/null +++ b/doc/html/search/all_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_8.js b/doc/html/search/all_8.js new file mode 100644 index 0000000..bde6f88 --- /dev/null +++ b/doc/html/search/all_8.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['igorbeforenewhook',['IgorBeforeNewHook',['../pearl-elog_8ipf.html#ae824bbf81f8b7d16b36b53e3f3d85f69',1,'pearl-elog.ipf']]], + ['igorquithook',['IgorQuitHook',['../pearl-anglescan-tracker_8ipf.html#a0852e59e9018cf3f7e176aa2355b18e3',1,'IgorQuitHook(string app): pearl-anglescan-tracker.ipf'],['../pearl-elog_8ipf.html#a6fcae5eafc97bca9a637bd7800b13e25',1,'IgorQuitHook(string igorApplicationNameStr): pearl-elog.ipf']]], + ['import_5ftpi_5fscan',['import_tpi_scan',['../pearl-anglescan-process_8ipf.html#a5265fd61f86eb72dd877e4190bfb4adf',1,'pearl-anglescan-process.ipf']]], + ['import_5ftracker_5fdata',['import_tracker_data',['../pearl-anglescan-tracker_8ipf.html#ae53e615892fbc39f831b6bd7a0ae242e',1,'pearl-anglescan-tracker.ipf']]], + ['introduction',['Introduction',['../index.html',1,'']]], + ['init_5fpackage',['init_package',['../pearl-anglescan-tracker_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725',1,'init_package(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725',1,'init_package(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#a7a4572f4f861f7eb46c932508d1164f9',1,'init_package(variable clean=defaultValue): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725',1,'init_package(): pearl-matrix-import.ipf']]], + ['init_5fvolatile_5fvars',['init_volatile_vars',['../pearl-elog_8ipf.html#a85cf9d39ea917860b463b1b4111705f2',1,'pearl-elog.ipf']]], + ['initstruct',['initStruct',['../pearl-matrix-import_8ipf.html#af0eaec901e06ce59250eb434539a0f6c',1,'pearl-matrix-import.ipf']]], + ['int_5flinbg_5freduction',['int_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a4e5ae4a68d9caa4710db477d71e2b9e0',1,'pearl-scienta-preprocess.ipf']]], + ['int_5fquadbg_5freduction',['int_quadbg_reduction',['../pearl-scienta-preprocess_8ipf.html#aa5ac074dd3e405d13d3c4401d96e4743',1,'pearl-scienta-preprocess.ipf']]], + ['integrate_5fcurved_5fedge',['integrate_curved_edge',['../fermi-edge-analysis_8ipf.html#a2a1d7b49c1f88f29ee6d49f6a6f4fbf8',1,'fermi-edge-analysis.ipf']]], + ['internal_5ferror_5fconverting_5fdata',['INTERNAL_ERROR_CONVERTING_DATA',['../structerror_code.html#afb49d1cffe8e7590892b018ac9e648cc',1,'errorCode']]], + ['interpolate_5fhemi_5fscan',['interpolate_hemi_scan',['../pearl-anglescan-process_8ipf.html#a5491cdee24910f6bad0d3af3c70f888b',1,'pearl-anglescan-process.ipf']]], + ['invalid_5frange',['INVALID_RANGE',['../structerror_code.html#a5477920df1edcc7a1af0513d9120947a',1,'errorCode']]], + ['iteratedatafolders',['IterateDataFolders',['../pearl-tools_8ipf.html#a7c5307e5e7c0202d2b088fdc11887069',1,'pearl-tools.ipf']]], + ['iteratewaves',['IterateWaves',['../pearl-tools_8ipf.html#aabc250f68dd85ca58d7be5077255af99',1,'pearl-tools.ipf']]], + ['itx_5fsuggest_5ffoldername',['itx_suggest_foldername',['../pearl-data-explorer_8ipf.html#a6b5e9729ee6dedbb217c741639a168ed',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/all_9.html b/doc/html/search/all_9.html new file mode 100644 index 0000000..c8c5102 --- /dev/null +++ b/doc/html/search/all_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_9.js b/doc/html/search/all_9.js new file mode 100644 index 0000000..08db1e7 --- /dev/null +++ b/doc/html/search/all_9.js @@ -0,0 +1,32 @@ +var searchData= +[ + ['kangledimlabel',['kAngleDimLabel',['../pearl-pshell-import_8ipf.html#a83930d4384b0238fc8416ba03dbc0386',1,'pearl-pshell-import.ipf']]], + ['kattachcolname',['kAttachColName',['../pearl-elog_8ipf.html#addbdec64930e9c1e417b16b25df8c723',1,'pearl-elog.ipf']]], + ['kattachcolsel',['kAttachColSel',['../pearl-elog_8ipf.html#aae61ff4d4a4d83dfc55af45d9ed1cbc3',1,'pearl-elog.ipf']]], + ['kattachcoltitle',['kAttachColTitle',['../pearl-elog_8ipf.html#a5afeb893f92034532341ae51471dc2d2',1,'pearl-elog.ipf']]], + ['kdatadimlabel',['kDataDimLabel',['../pearl-pshell-import_8ipf.html#a277cd450cca7832aa44f8097934e6acb',1,'pearl-pshell-import.ipf']]], + ['kdfpersistent',['kdfPersistent',['../pearl-elog_8ipf.html#a3498e65d04de046481170b49d4e3d0d6',1,'pearl-elog.ipf']]], + ['kdfroot',['kdfRoot',['../pearl-elog_8ipf.html#af34e46263aa50843f98f755988f9ab5c',1,'pearl-elog.ipf']]], + ['kdftemplates',['kdfTemplates',['../pearl-elog_8ipf.html#a28eb44739e7d5c7f9899a69afa231b8e',1,'pearl-elog.ipf']]], + ['kdfvolatile',['kdfVolatile',['../pearl-elog_8ipf.html#a915905f2e57d0d9a25c75f39fcce485f',1,'pearl-elog.ipf']]], + ['kenergydimlabel',['kEnergyDimLabel',['../pearl-pshell-import_8ipf.html#a5ad52cb10171572c454f9426d3a9be21',1,'pearl-pshell-import.ipf']]], + ['kill_5fprogress_5fpanel',['kill_progress_panel',['../pearl-gui-tools_8ipf.html#aca0a41a0f28a35ac7535df30ddbd79fe',1,'pearl-gui-tools.ipf']]], + ['kpreviewdatasets',['kPreviewDatasets',['../pearl-pshell-import_8ipf.html#a3c72087695969f42ea91c000de47b26e',1,'pearl-pshell-import.ipf']]], + ['kprojarea',['kProjArea',['../pearl-anglescan-process_8ipf.html#a207c56ac03cc18bf1bfde88dbfe2666f',1,'pearl-anglescan-process.ipf']]], + ['kprojdist',['kProjDist',['../pearl-anglescan-process_8ipf.html#aae45cc49d67f79dcedc4420f82acea4c',1,'pearl-anglescan-process.ipf']]], + ['kprojgnom',['kProjGnom',['../pearl-anglescan-process_8ipf.html#a4a40c73c0e03545e0050ea370e9c57d3',1,'pearl-anglescan-process.ipf']]], + ['kprojortho',['kProjOrtho',['../pearl-anglescan-process_8ipf.html#a3b3bd11c35d5f850b34937ab6c45f659',1,'pearl-anglescan-process.ipf']]], + ['kprojscalearea',['kProjScaleArea',['../pearl-anglescan-process_8ipf.html#afa14187803f5b428a96c8234e04ab217',1,'pearl-anglescan-process.ipf']]], + ['kprojscaledist',['kProjScaleDist',['../pearl-anglescan-process_8ipf.html#a04e75675884236b6ed8244d7575d3a13',1,'pearl-anglescan-process.ipf']]], + ['kprojscalegnom',['kProjScaleGnom',['../pearl-anglescan-process_8ipf.html#ab6670abb621d01994c0b9974f58be843',1,'pearl-anglescan-process.ipf']]], + ['kprojscaleortho',['kProjScaleOrtho',['../pearl-anglescan-process_8ipf.html#aa5487fdee22e0da61a511c14239262f5',1,'pearl-anglescan-process.ipf']]], + ['kprojscalestereo',['kProjScaleStereo',['../pearl-anglescan-process_8ipf.html#aed66bda9701d8a69b2174fac974aa665',1,'pearl-anglescan-process.ipf']]], + ['kprojstereo',['kProjStereo',['../pearl-anglescan-process_8ipf.html#ac151c6f989d6a568fdef0acb791f84db',1,'pearl-anglescan-process.ipf']]], + ['ks_5ffilematch_5fadh5',['ks_filematch_adh5',['../pearl-data-explorer_8ipf.html#a181ccce237172811baf3de5a7a06370d',1,'pearl-data-explorer.ipf']]], + ['ks_5ffilematch_5fitx',['ks_filematch_itx',['../pearl-data-explorer_8ipf.html#a53af8689144e3aeb27ca177db5dd0c22',1,'pearl-data-explorer.ipf']]], + ['ks_5ffilematch_5fmtrx',['ks_filematch_mtrx',['../pearl-data-explorer_8ipf.html#ad720655ff881ddecae2e1b8afed58fa0',1,'ks_filematch_mtrx(): pearl-data-explorer.ipf'],['../pearl-matrix-import_8ipf.html#ad720655ff881ddecae2e1b8afed58fa0',1,'ks_filematch_mtrx(): pearl-matrix-import.ipf']]], + ['ks_5ffilematch_5fpshell',['ks_filematch_pshell',['../pearl-data-explorer_8ipf.html#a00bf5267a40b2b3d760c64d73e139878',1,'pearl-data-explorer.ipf']]], + ['kscandimlabel',['kScanDimLabel',['../pearl-pshell-import_8ipf.html#a412b4753ceb753d705a113a26c018b22',1,'pearl-pshell-import.ipf']]], + ['kscientascalingdatasets',['kScientaScalingDatasets',['../pearl-pshell-import_8ipf.html#a03f00b3299bc3df671fcc239f7dd5418',1,'pearl-pshell-import.ipf']]], + ['ktransposeddatasets',['kTransposedDatasets',['../pearl-pshell-import_8ipf.html#a0f2c168c04d075734edb995361aefb82',1,'pearl-pshell-import.ipf']]] +]; diff --git a/doc/html/search/all_a.html b/doc/html/search/all_a.html new file mode 100644 index 0000000..4cb31f0 --- /dev/null +++ b/doc/html/search/all_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_a.js b/doc/html/search/all_a.js new file mode 100644 index 0000000..a5fb344 --- /dev/null +++ b/doc/html/search/all_a.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['lbp_5fdatasets',['lbp_datasets',['../pearl-data-explorer_8ipf.html#a8ec37ab6c651003957d7e1ba728de89e',1,'pearl-data-explorer.ipf']]], + ['lbp_5ffilelist',['lbp_filelist',['../pearl-data-explorer_8ipf.html#a614e89b9c06511144ccb380e61cc7bd6',1,'pearl-data-explorer.ipf']]], + ['line_5faverage',['line_average',['../pearl-anglescan-process_8ipf.html#aa54a550eccad2c8ccd82d2b4167f7a92',1,'pearl-anglescan-process.ipf']]], + ['list_5flogbooks',['list_logbooks',['../pearl-elog_8ipf.html#a356bebea8eb41c9ac3ea2148af22707f',1,'pearl-elog.ipf']]], + ['load_5ffile',['load_file',['../pearl-data-explorer_8ipf.html#a1bbf3e1592f3344f3628526fa549dfdf',1,'pearl-data-explorer.ipf']]], + ['load_5fhdf_5ffile',['load_hdf_file',['../pearl-data-explorer_8ipf.html#a0c839d5f8f49e6937a6532bba3ef3714',1,'pearl-data-explorer.ipf']]], + ['load_5fhemi_5fscan',['load_hemi_scan',['../pearl-anglescan-process_8ipf.html#a89f73edcd51a675f4c3933cd0242484e',1,'pearl-anglescan-process.ipf']]], + ['load_5fitx_5ffile',['load_itx_file',['../pearl-data-explorer_8ipf.html#a26f2f2bf5efc39dabb2a01abcc559e3e',1,'pearl-data-explorer.ipf']]], + ['load_5fmtrx_5ffile',['load_mtrx_file',['../pearl-data-explorer_8ipf.html#a98e327fa65bbcb3cd7c97545f7201afe',1,'pearl-data-explorer.ipf']]], + ['load_5fprefs',['load_prefs',['../pearl-anglescan-tracker_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3',1,'load_prefs(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3',1,'load_prefs(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3',1,'load_prefs(): pearl-elog.ipf']]], + ['load_5fpshell_5ffile',['load_pshell_file',['../pearl-data-explorer_8ipf.html#a74c69e870329c5dd3b08f92bdeb21d87',1,'pearl-data-explorer.ipf']]], + ['load_5fselected_5ffiles',['load_selected_files',['../pearl-data-explorer_8ipf.html#a2178d5acf21fe4372ecc06224bec28ba',1,'pearl-data-explorer.ipf']]], + ['load_5ftracker_5fdata',['load_tracker_data',['../pearl-anglescan-tracker_8ipf.html#a3882038c0ad82396b6591fd756817535',1,'pearl-anglescan-tracker.ipf']]], + ['loadpearlarpes',['LoadPearlArpes',['../pearl-menu_8ipf.html#aa70ef420d6fe0f6a433cd2371fc4a03d',1,'pearl-menu.ipf']]], + ['loadpearloptics',['LoadPearlOptics',['../pearl-menu_8ipf.html#af6c9740540c6242eb7bf57fc49de82ab',1,'pearl-menu.ipf']]], + ['loadpearlpreparation',['LoadPearlPreparation',['../pearl-menu_8ipf.html#a3658ae687e12987fa1d70636849a060f',1,'pearl-menu.ipf']]] +]; diff --git a/doc/html/search/all_b.html b/doc/html/search/all_b.html new file mode 100644 index 0000000..d34a612 --- /dev/null +++ b/doc/html/search/all_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_b.js b/doc/html/search/all_b.js new file mode 100644 index 0000000..d257de0 --- /dev/null +++ b/doc/html/search/all_b.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['mainpage_2edox',['mainpage.dox',['../mainpage_8dox.html',1,'']]], + ['make_5fhemi_5fgrid',['make_hemi_grid',['../pearl-anglescan-process_8ipf.html#a902ac3a24e33f651e83ee03d31707da7',1,'pearl-anglescan-process.ipf']]], + ['make_5fview_5ffolder',['make_view_folder',['../pearl-area-display_8ipf.html#a2b183a27ec795b0ec1f8efabe3068369',1,'pearl-area-display.ipf']]], + ['matrix_5fformat_5felog_5fmessage',['matrix_format_elog_message',['../pearl-matrix-import_8ipf.html#a81b1d81261a32d0ed4cf79b81487f1b4',1,'pearl-matrix-import.ipf']]], + ['matrix_5fpreview_5f2d',['matrix_preview_2d',['../pearl-matrix-import_8ipf.html#a856478705a78e8105ea5d91a2228975b',1,'pearl-matrix-import.ipf']]], + ['mcp_5fradius_5fepass',['mcp_radius_epass',['../fermi-edge-analysis_8ipf.html#a4749b9bce3e1d0381bd9daeb97c9754c',1,'fermi-edge-analysis.ipf']]], + ['mcp_5fradius_5fmm',['mcp_radius_mm',['../fermi-edge-analysis_8ipf.html#a4dcc00b93822f1663be2908b10d2ad3e',1,'fermi-edge-analysis.ipf']]], + ['mcp_5fradius_5fpix',['mcp_radius_pix',['../fermi-edge-analysis_8ipf.html#a09f26b0a0fd940a3d8c6f92aa769c8bc',1,'fermi-edge-analysis.ipf']]], + ['model',['model',['../struct_doniach_sunjic_struct.html#a02c13fdcf15e9adfee13464701bb7de2',1,'DoniachSunjicStruct']]], + ['move_5fattach_5fitem',['move_attach_item',['../pearl-elog_8ipf.html#a7990f2948d48aefe990271d1961df833',1,'pearl-elog.ipf']]], + ['mtrx_5fcreate_5ffolder',['mtrx_create_folder',['../pearl-matrix-import_8ipf.html#a893405a122fdf70429f4f75b8877ed7d',1,'pearl-matrix-import.ipf']]], + ['mtrx_5ffile_5fbrickletid',['mtrx_file_brickletID',['../pearl-matrix-import_8ipf.html#ad74d5afa71179728a9237d1ec5884482',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fget_5fcycle_5ffolder',['mtrx_get_cycle_folder',['../pearl-matrix-import_8ipf.html#a1a46b042e41daffee61706ab2cf54351',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5fall',['mtrx_load_all',['../pearl-matrix-import_8ipf.html#a6ac0c685976b0e0c1944fb616a4f3a3c',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5ffile',['mtrx_load_file',['../pearl-matrix-import_8ipf.html#a6aeef317fd468c88c99a274338c70ae3',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5finfo',['mtrx_load_info',['../pearl-matrix-import_8ipf.html#a3a0ba4a7ad64739303b705d92be53267',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5fpreview',['mtrx_load_preview',['../pearl-matrix-import_8ipf.html#abd09594d22038853e1e8021e0f36363d',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fopen_5ffile',['mtrx_open_file',['../pearl-matrix-import_8ipf.html#a59e72c849f4314aaa8339fd899665d85',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fparse_5ffilename',['mtrx_parse_filename',['../pearl-matrix-import_8ipf.html#a4bfeaf81ac483df0a38b26b6a8cf74a6',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fscale_5fdataset',['mtrx_scale_dataset',['../pearl-matrix-import_8ipf.html#ad8532f1473f92539fe88217d5d6e3368',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fsplit_5ffilename',['mtrx_split_filename',['../pearl-matrix-import_8ipf.html#a0dc1efa23739e10b7558543b166e95b9',1,'pearl-matrix-import.ipf']]] +]; diff --git a/doc/html/search/all_c.html b/doc/html/search/all_c.html new file mode 100644 index 0000000..c1ae2ca --- /dev/null +++ b/doc/html/search/all_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_c.js b/doc/html/search/all_c.js new file mode 100644 index 0000000..1184970 --- /dev/null +++ b/doc/html/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['no_5ffile_5fopen',['NO_FILE_OPEN',['../structerror_code.html#affc9a8a46877373b0212d82d867ca5fa',1,'errorCode']]], + ['no_5fnew_5fbricklets',['NO_NEW_BRICKLETS',['../structerror_code.html#a4ec3cbf922809b99b04d324d3a0bbb22',1,'errorCode']]], + ['normalize_5fstrip_5f2d',['normalize_strip_2d',['../pearl-anglescan-process_8ipf.html#ac617c3b400488b656493af8ca08f1791',1,'pearl-anglescan-process.ipf']]], + ['normalize_5fstrip_5ftheta',['normalize_strip_theta',['../pearl-anglescan-process_8ipf.html#a9b56897bd92d926d65f4c67bef1d41bb',1,'pearl-anglescan-process.ipf']]], + ['normalize_5fstrip_5fx',['normalize_strip_x',['../pearl-anglescan-process_8ipf.html#a48b7d774ed8d3f4329e9923e18e580e8',1,'pearl-anglescan-process.ipf']]], + ['notebook_5fadd_5fattributes',['notebook_add_attributes',['../pearl-data-explorer_8ipf.html#a0c162346b59b0f66d34ee26ce5fe1e52',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/all_d.html b/doc/html/search/all_d.html new file mode 100644 index 0000000..712223c --- /dev/null +++ b/doc/html/search/all_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_d.js b/doc/html/search/all_d.js new file mode 100644 index 0000000..ba9be49 --- /dev/null +++ b/doc/html/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['otf_5fgather_5fbatch',['otf_gather_batch',['../pearl-otf-import_8ipf.html#ad2a83b85030a7d7769d434d6e2e9e557',1,'pearl-otf-import.ipf']]], + ['otf_5fgather_5fiterator',['otf_gather_iterator',['../pearl-otf-import_8ipf.html#a44078e1d8f26e515539acb96973fc630',1,'pearl-otf-import.ipf']]], + ['otf_5finterp',['otf_interp',['../pearl-otf-import_8ipf.html#abd8897317366046dfb97c6ca53813d18',1,'pearl-otf-import.ipf']]], + ['otf_5fload_5fitx',['otf_load_itx',['../pearl-otf-import_8ipf.html#a3632f8a5c0ee32a14a3e589b74a0c496',1,'pearl-otf-import.ipf']]], + ['otf_5fload_5fitx_5fall',['otf_load_itx_all',['../pearl-otf-import_8ipf.html#a603b71176ed838713ec555c440082e22',1,'pearl-otf-import.ipf']]], + ['otf_5fload_5fitx_5fmatch',['otf_load_itx_match',['../pearl-otf-import_8ipf.html#aa47fc4b956ee84a993b6d285b628fe20',1,'pearl-otf-import.ipf']]], + ['otf_5frename_5ffolders',['otf_rename_folders',['../pearl-otf-import_8ipf.html#a715f9cf2d2b1ffb04f2f9a0e344a80ee',1,'pearl-otf-import.ipf']]], + ['otf_5frename_5ffolders_5fiterator',['otf_rename_folders_iterator',['../pearl-otf-import_8ipf.html#a882da254075e8d89f0117e491af90df0',1,'pearl-otf-import.ipf']]], + ['otf_5fsmo_5fint',['otf_smo_int',['../pearl-otf-import_8ipf.html#aba965b854836658aa00e3ec2b361d7c9',1,'pearl-otf-import.ipf']]], + ['oversampling',['oversampling',['../struct_doniach_sunjic_struct.html#ab5a630be50286c3cf04e40d5880506e6',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/all_e.html b/doc/html/search/all_e.html new file mode 100644 index 0000000..d553ffa --- /dev/null +++ b/doc/html/search/all_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_e.js b/doc/html/search/all_e.js new file mode 100644 index 0000000..edeccbe --- /dev/null +++ b/doc/html/search/all_e.js @@ -0,0 +1,103 @@ +var searchData= +[ + ['package_5fname',['package_name',['../pearl-data-explorer_8ipf.html#aca457d1f4414d20a911254b1de13ebbb',1,'package_name(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#aca457d1f4414d20a911254b1de13ebbb',1,'package_name(): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#aca457d1f4414d20a911254b1de13ebbb',1,'package_name(): pearl-matrix-import.ipf']]], + ['package_5fpath',['package_path',['../pearl-anglescan-tracker_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-matrix-import.ipf']]], + ['projections',['Projections',['../PageProjections.html',1,'']]], + ['parse_5fresult',['parse_result',['../pearl-elog_8ipf.html#a5306514bf7d1a582aec146256ae45a12',1,'pearl-elog.ipf']]], + ['pearl_2danglescan_2dprocess_2eipf',['pearl-anglescan-process.ipf',['../pearl-anglescan-process_8ipf.html',1,'']]], + ['pearl_2danglescan_2dtracker_2eipf',['pearl-anglescan-tracker.ipf',['../pearl-anglescan-tracker_8ipf.html',1,'']]], + ['pearl_2darea_2ddisplay_2eipf',['pearl-area-display.ipf',['../pearl-area-display_8ipf.html',1,'']]], + ['pearl_2darea_2dimport_2eipf',['pearl-area-import.ipf',['../pearl-area-import_8ipf.html',1,'']]], + ['pearl_2darea_2dprofiles_2eipf',['pearl-area-profiles.ipf',['../pearl-area-profiles_8ipf.html',1,'']]], + ['pearl_2darpes_2eipf',['pearl-arpes.ipf',['../pearl-arpes_8ipf.html',1,'']]], + ['pearl_2ddata_2dexplorer_2eipf',['pearl-data-explorer.ipf',['../pearl-data-explorer_8ipf.html',1,'']]], + ['pearl_2delog_2eipf',['pearl-elog.ipf',['../pearl-elog_8ipf.html',1,'']]], + ['pearl_2dfitfuncs_2eipf',['pearl-fitfuncs.ipf',['../pearl-fitfuncs_8ipf.html',1,'']]], + ['pearl_2dgui_2dtools_2eipf',['pearl-gui-tools.ipf',['../pearl-gui-tools_8ipf.html',1,'']]], + ['pearl_2dmatrix_2dimport_2eipf',['pearl-matrix-import.ipf',['../pearl-matrix-import_8ipf.html',1,'']]], + ['pearl_2dmenu_2eipf',['pearl-menu.ipf',['../pearl-menu_8ipf.html',1,'']]], + ['pearl_2dotf_2dimport_2eipf',['pearl-otf-import.ipf',['../pearl-otf-import_8ipf.html',1,'']]], + ['pearl_2dpolar_2dcoordinates_2eipf',['pearl-polar-coordinates.ipf',['../pearl-polar-coordinates_8ipf.html',1,'']]], + ['pearl_2dpshell_2dimport_2eipf',['pearl-pshell-import.ipf',['../pearl-pshell-import_8ipf.html',1,'']]], + ['pearl_2dscienta_2dpreprocess_2eipf',['pearl-scienta-preprocess.ipf',['../pearl-scienta-preprocess_8ipf.html',1,'']]], + ['pearl_2dtools_2eipf',['pearl-tools.ipf',['../pearl-tools_8ipf.html',1,'']]], + ['pearl_2dvector_2doperations_2eipf',['pearl-vector-operations.ipf',['../pearl-vector-operations_8ipf.html',1,'']]], + ['pearl_5fdata_5fexplorer',['pearl_data_explorer',['../pearl-data-explorer_8ipf.html#ab7e3b3a0a901f7559ee9f5affb9a6fca',1,'pearl-data-explorer.ipf']]], + ['pearl_5felog',['pearl_elog',['../pearl-elog_8ipf.html#a4088a48a8428629f120c08a419af62d6',1,'pearl-elog.ipf']]], + ['pearl_5ffile_5ftype',['pearl_file_type',['../pearl-data-explorer_8ipf.html#a8a923d7095071e7e6f99018379807732',1,'pearl-data-explorer.ipf']]], + ['pearlanglescanprocess',['PearlAnglescanProcess',['../namespace_pearl_anglescan_process.html',1,'']]], + ['pearlanglescantracker',['PearlAnglescanTracker',['../pearl-menu_8ipf.html#a74bc5da7843ee6c25f2d9c93d22a6ffa',1,'pearl-menu.ipf']]], + ['pearlareadisplay',['PearlAreaDisplay',['../namespace_pearl_area_display.html',1,'']]], + ['pearlareaimport',['PearlAreaImport',['../namespace_pearl_area_import.html',1,'']]], + ['pearlareaprofiles',['PearlAreaProfiles',['../namespace_pearl_area_profiles.html',1,'']]], + ['pearlarpes',['PearlArpes',['../namespace_pearl_arpes.html',1,'']]], + ['pearldataexplorer',['PearlDataExplorer',['../namespace_pearl_data_explorer.html',1,'PearlDataExplorer'],['../pearl-data-explorer_8ipf.html#a5b824531904179a94e0eaa3ffa09172e',1,'PearlDataExplorer(): pearl-data-explorer.ipf']]], + ['pearlelog',['PearlElog',['../namespace_pearl_elog.html',1,'']]], + ['pearlelogpanel',['PearlElogPanel',['../pearl-elog_8ipf.html#a6da33f1bb2639cb912e9b25af25bf663',1,'pearl-elog.ipf']]], + ['pearllivedisplay',['PearlLiveDisplay',['../pearl-menu_8ipf.html#a61ded60be72959b00f22842afa37c56f',1,'pearl-menu.ipf']]], + ['pearlmatriximport',['PearlMatrixImport',['../namespace_pearl_matrix_import.html',1,'']]], + ['pearlmenuenablefunc',['PearlMenuEnableFunc',['../pearl-menu_8ipf.html#a3404a53bf13a01c1e811d1af6c35b726',1,'pearl-menu.ipf']]], + ['pearlpshellimport',['PearlPShellImport',['../namespace_pearl_p_shell_import.html',1,'']]], + ['pearlscientapreprocess',['PearlScientaPreprocess',['../namespace_pearl_scienta_preprocess.html',1,'']]], + ['pizza_5fservice',['pizza_service',['../pearl-anglescan-process_8ipf.html#afed227ae79873fd32c96afbf606d1965',1,'pearl-anglescan-process.ipf']]], + ['pizza_5fservice_5f2',['pizza_service_2',['../pearl-anglescan-process_8ipf.html#a229770447193d4fd12032b235aab4d28',1,'pearl-anglescan-process.ipf']]], + ['pmp_5fdata',['pmp_data',['../pearl-anglescan-tracker_8ipf.html#a07efc5d6a7121540cc185c251353677c',1,'pearl-anglescan-tracker.ipf']]], + ['pmp_5fdata_5fmouseup',['pmp_data_mouseup',['../pearl-anglescan-tracker_8ipf.html#a4dad34b0481be20234fa5e8d25b262c4',1,'pearl-anglescan-tracker.ipf']]], + ['pmp_5fexport',['pmp_export',['../pearl-area-display_8ipf.html#ac5c7a25e9a8c0b001a429bae23639da9',1,'pearl-area-display.ipf']]], + ['pmp_5fparameters',['pmp_parameters',['../pearl-anglescan-tracker_8ipf.html#a6d484e3bb5f8c18d3b2910e8346b2c17',1,'pearl-anglescan-tracker.ipf']]], + ['pmp_5fparameters_5fmouseup',['pmp_parameters_mouseup',['../pearl-anglescan-tracker_8ipf.html#ad06e1354226f4f617ad0a8d6d7572dca',1,'pearl-anglescan-tracker.ipf']]], + ['polar2cart',['polar2cart',['../pearl-polar-coordinates_8ipf.html#a94ccfa9cf52c55eb1f66c2704478c396',1,'pearl-polar-coordinates.ipf']]], + ['polar2cart_5fwave',['polar2cart_wave',['../pearl-polar-coordinates_8ipf.html#a6a0ffb6b9160413d9694b1fd8e10c858',1,'pearl-polar-coordinates.ipf']]], + ['polar_5fdistance',['polar_distance',['../pearl-polar-coordinates_8ipf.html#a58139e6ebfba242b6b2ba3533b865a9a',1,'pearl-polar-coordinates.ipf']]], + ['polar_5fgraph_5fhook',['polar_graph_hook',['../pearl-anglescan-process_8ipf.html#ac4dbd1ece37b2cf22fa976a153977288',1,'pearl-anglescan-process.ipf']]], + ['precision',['precision',['../struct_doniach_sunjic_struct.html#a906e214875392bc470dbd4bb4bdda2db',1,'DoniachSunjicStruct']]], + ['prefs_5fobjects',['prefs_objects',['../pearl-anglescan-tracker_8ipf.html#a20720748c82a7eaa4b02d4084a4219b2',1,'pearl-anglescan-tracker.ipf']]], + ['prepare_5fcommand_5fline',['prepare_command_line',['../pearl-elog_8ipf.html#abd15431defaec6d770cc8cab2a40e6b0',1,'pearl-elog.ipf']]], + ['prepare_5fgraph_5fattachments',['prepare_graph_attachments',['../pearl-elog_8ipf.html#a4986de01085dc5481500240ef7667419',1,'pearl-elog.ipf']]], + ['preview_5fattributes',['preview_attributes',['../pearl-data-explorer_8ipf.html#a415e4867be1ee37d84fd609b06f6dcb8',1,'pearl-data-explorer.ipf']]], + ['preview_5fdatafolder',['preview_datafolder',['../pearl-data-explorer_8ipf.html#a6e8eaf8c092f5da60bd425f9bd8bf178',1,'pearl-data-explorer.ipf']]], + ['preview_5fdataset',['preview_dataset',['../pearl-data-explorer_8ipf.html#a68d38e9464f7d13520ec040cffdf5c3b',1,'pearl-data-explorer.ipf']]], + ['preview_5ffile',['preview_file',['../pearl-data-explorer_8ipf.html#a3232c51a8c19eaf86b9bc67352967a9f',1,'pearl-data-explorer.ipf']]], + ['preview_5fhdf_5ffile',['preview_hdf_file',['../pearl-data-explorer_8ipf.html#a1731f8e1507d90e285885723ae32ba13',1,'pearl-data-explorer.ipf']]], + ['preview_5fitx_5ffile',['preview_itx_file',['../pearl-data-explorer_8ipf.html#a4633885afab755fbc5d262178b9ddcb8',1,'pearl-data-explorer.ipf']]], + ['preview_5fmatrix_5ffile',['preview_matrix_file',['../pearl-matrix-import_8ipf.html#a8acd2b03343ef9bdfecaa75e831392d1',1,'pearl-matrix-import.ipf']]], + ['preview_5fmtrx_5ffile',['preview_mtrx_file',['../pearl-data-explorer_8ipf.html#a340f334c6caa966ee1eb891614e57b5b',1,'pearl-data-explorer.ipf']]], + ['preview_5fpshell_5ffile',['preview_pshell_file',['../pearl-data-explorer_8ipf.html#a457d2257ffd5880ab858fa583a5d1c99',1,'pearl-data-explorer.ipf']]], + ['preview_5fsetscale_5fx',['preview_setscale_x',['../pearl-data-explorer_8ipf.html#a5a7d3c00360944c00f236900b992694d',1,'pearl-data-explorer.ipf']]], + ['process_5fimage_5fdata',['process_image_data',['../pearl-anglescan-tracker_8ipf.html#a4bc40cded4d4d7676b084f7200ca5e0d',1,'pearl-anglescan-tracker.ipf']]], + ['prompt_5fdefault_5fprocess',['prompt_default_process',['../pearl-data-explorer_8ipf.html#a505ebda6bdecc4120e01766d7aedaf5d',1,'pearl-data-explorer.ipf']]], + ['prompt_5ffunc_5fparams',['prompt_func_params',['../pearl-data-explorer_8ipf.html#a1d7f4ad59b81ecd84bb63cfabd9f24dc',1,'pearl-data-explorer.ipf']]], + ['prompt_5fhdf_5foptions',['prompt_hdf_options',['../pearl-data-explorer_8ipf.html#a200e7ba052fbce4614fb4254701646ab',1,'pearl-data-explorer.ipf']]], + ['prompt_5fint_5flinbg_5freduction',['prompt_int_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a145c7275b8809c5e789b932ef46e4811',1,'pearl-scienta-preprocess.ipf']]], + ['prompt_5fint_5fquadbg_5freduction',['prompt_int_quadbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a6d06ea5a11ba79160efeea7fe673af8c',1,'pearl-scienta-preprocess.ipf']]], + ['prompt_5fredim_5flinbg_5freduction',['prompt_redim_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a6e7de6441bbcba217760448babaca827',1,'pearl-scienta-preprocess.ipf']]], + ['prompt_5fshockley_5fanglefit',['prompt_Shockley_anglefit',['../pearl-scienta-preprocess_8ipf.html#ab3e0823a6ec7d85e08276cd32d0ffd21',1,'pearl-scienta-preprocess.ipf']]], + ['ps_5fdetect_5fscale',['ps_detect_scale',['../pearl-pshell-import_8ipf.html#acba7f4b98f67cc112c02dfeefe3e5acd',1,'pearl-pshell-import.ipf']]], + ['ps_5fscale_5fdataset',['ps_scale_dataset',['../pearl-pshell-import_8ipf.html#adc11ea797562b3d99c247f4866618d39',1,'pearl-pshell-import.ipf']]], + ['ps_5fscale_5fdataset_5f2',['ps_scale_dataset_2',['../pearl-pshell-import_8ipf.html#a2c456397c36d4116bfddca452eff5954',1,'pearl-pshell-import.ipf']]], + ['ps_5fscale_5fdatasets',['ps_scale_datasets',['../pearl-pshell-import_8ipf.html#af08a467036c64f70ca3dfe644fcc457c',1,'pearl-pshell-import.ipf']]], + ['ps_5fset_5fdimlabels',['ps_set_dimlabels',['../pearl-pshell-import_8ipf.html#aba25eb98e4c6cc9066c46ef6be1cde15',1,'pearl-pshell-import.ipf']]], + ['ps_5fset_5fdimlabels2',['ps_set_dimlabels2',['../pearl-pshell-import_8ipf.html#a8704627410409bcd27a1adeda4082c47',1,'pearl-pshell-import.ipf']]], + ['psh5_5fclose_5ffile',['psh5_close_file',['../pearl-pshell-import_8ipf.html#a2fc497747287d6fe40c6de997ed4a90d',1,'pearl-pshell-import.ipf']]], + ['psh5_5flist_5fscan_5fdatasets',['psh5_list_scan_datasets',['../pearl-pshell-import_8ipf.html#a4508bd507c4c935bd8463d9b2b84c6fc',1,'pearl-pshell-import.ipf']]], + ['psh5_5flist_5fscan_5fregions',['psh5_list_scan_regions',['../pearl-pshell-import_8ipf.html#acb317b57ef137d4d5da5938013dbe442',1,'pearl-pshell-import.ipf']]], + ['psh5_5flist_5fscans',['psh5_list_scans',['../pearl-pshell-import_8ipf.html#a2152f7c39a187b740cf9890767ffac3f',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fcomplete',['psh5_load_complete',['../pearl-pshell-import_8ipf.html#a8a5ce6c2767607de194b4c148ee98c27',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset',['psh5_load_dataset',['../pearl-pshell-import_8ipf.html#ac4dfb90b951d29b56501e904f5cc38aa',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5fmeta',['psh5_load_dataset_meta',['../pearl-pshell-import_8ipf.html#afde787a00a18dc8c63b100d8ac7d992f',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5freduced',['psh5_load_dataset_reduced',['../pearl-pshell-import_8ipf.html#a13a45e8618c1ab7406e1aa5e608e21fe',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5fslab',['psh5_load_dataset_slab',['../pearl-pshell-import_8ipf.html#a035a4df9f4508144149abdb0b46c87d1',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5fslabs',['psh5_load_dataset_slabs',['../pearl-pshell-import_8ipf.html#a2972587ec82cc2a261b8119a582b4215',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5finfo',['psh5_load_info',['../pearl-pshell-import_8ipf.html#aa14b28120a07a8213e5a692930704a4b',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fpreview',['psh5_load_preview',['../pearl-pshell-import_8ipf.html#a8ab28d3f4ef308e33b8701e44172dbf8',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5freduced',['psh5_load_reduced',['../pearl-pshell-import_8ipf.html#a1444648f9a49e7d7aeef5b5fb55594aa',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fattrs',['psh5_load_scan_attrs',['../pearl-pshell-import_8ipf.html#aec191d0167bbf606d24396f4658104b5',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fcomplete',['psh5_load_scan_complete',['../pearl-pshell-import_8ipf.html#a0a02f87e19e825964aa17c46ed51df8c',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fdata',['psh5_load_scan_data',['../pearl-pshell-import_8ipf.html#ad26b0b56d7ccd23547535091c9430569',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5finfo',['psh5_load_scan_info',['../pearl-pshell-import_8ipf.html#a79ac37bb666b42c3332e9984196ccfe7',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fmeta',['psh5_load_scan_meta',['../pearl-pshell-import_8ipf.html#aa56c25d64b3e59f74d6dd92a599cce4f',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fpreview',['psh5_load_scan_preview',['../pearl-pshell-import_8ipf.html#ad3b9354b137ba4f1bc3ed2e74f24dc88',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fsection',['psh5_load_scan_section',['../pearl-pshell-import_8ipf.html#a83804ba9637debed6ef8b13e7b9b19e0',1,'pearl-pshell-import.ipf']]], + ['psh5_5fopen_5ffile',['psh5_open_file',['../pearl-pshell-import_8ipf.html#accc20b0fc6bda95ba0cd0aea6633086f',1,'pearl-pshell-import.ipf']]], + ['pw',['pw',['../struct_doniach_sunjic_struct.html#a92bbb374f66840510e7cb8b316057610',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/all_f.html b/doc/html/search/all_f.html new file mode 100644 index 0000000..c77391a --- /dev/null +++ b/doc/html/search/all_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/all_f.js b/doc/html/search/all_f.js new file mode 100644 index 0000000..676dec0 --- /dev/null +++ b/doc/html/search/all_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['quick_5fpizza_5fimage',['quick_pizza_image',['../pearl-anglescan-process_8ipf.html#a0b9e2b025e1d55d2a064edccf6c1c3e3',1,'pearl-anglescan-process.ipf']]] +]; diff --git a/doc/html/search/classes_0.html b/doc/html/search/classes_0.html new file mode 100644 index 0000000..025587a --- /dev/null +++ b/doc/html/search/classes_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/classes_0.js b/doc/html/search/classes_0.js new file mode 100644 index 0000000..9852cae --- /dev/null +++ b/doc/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['doniachsunjicstruct',['DoniachSunjicStruct',['../struct_doniach_sunjic_struct.html',1,'']]] +]; diff --git a/doc/html/search/classes_1.html b/doc/html/search/classes_1.html new file mode 100644 index 0000000..86dc4ff --- /dev/null +++ b/doc/html/search/classes_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/classes_1.js b/doc/html/search/classes_1.js new file mode 100644 index 0000000..dd18681 --- /dev/null +++ b/doc/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['errorcode',['errorCode',['../structerror_code.html',1,'']]] +]; diff --git a/doc/html/search/close.png b/doc/html/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/doc/html/search/files_0.html b/doc/html/search/files_0.html new file mode 100644 index 0000000..0b637cf --- /dev/null +++ b/doc/html/search/files_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/files_0.js b/doc/html/search/files_0.js new file mode 100644 index 0000000..e89aa0a --- /dev/null +++ b/doc/html/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fermi_2dedge_2danalysis_2eipf',['fermi-edge-analysis.ipf',['../fermi-edge-analysis_8ipf.html',1,'']]] +]; diff --git a/doc/html/search/files_1.html b/doc/html/search/files_1.html new file mode 100644 index 0000000..1094e74 --- /dev/null +++ b/doc/html/search/files_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/files_1.js b/doc/html/search/files_1.js new file mode 100644 index 0000000..a490ea9 --- /dev/null +++ b/doc/html/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mainpage_2edox',['mainpage.dox',['../mainpage_8dox.html',1,'']]] +]; diff --git a/doc/html/search/files_2.html b/doc/html/search/files_2.html new file mode 100644 index 0000000..a08dbd3 --- /dev/null +++ b/doc/html/search/files_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/files_2.js b/doc/html/search/files_2.js new file mode 100644 index 0000000..cae3c87 --- /dev/null +++ b/doc/html/search/files_2.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['pearl_2danglescan_2dprocess_2eipf',['pearl-anglescan-process.ipf',['../pearl-anglescan-process_8ipf.html',1,'']]], + ['pearl_2danglescan_2dtracker_2eipf',['pearl-anglescan-tracker.ipf',['../pearl-anglescan-tracker_8ipf.html',1,'']]], + ['pearl_2darea_2ddisplay_2eipf',['pearl-area-display.ipf',['../pearl-area-display_8ipf.html',1,'']]], + ['pearl_2darea_2dimport_2eipf',['pearl-area-import.ipf',['../pearl-area-import_8ipf.html',1,'']]], + ['pearl_2darea_2dprofiles_2eipf',['pearl-area-profiles.ipf',['../pearl-area-profiles_8ipf.html',1,'']]], + ['pearl_2darpes_2eipf',['pearl-arpes.ipf',['../pearl-arpes_8ipf.html',1,'']]], + ['pearl_2ddata_2dexplorer_2eipf',['pearl-data-explorer.ipf',['../pearl-data-explorer_8ipf.html',1,'']]], + ['pearl_2delog_2eipf',['pearl-elog.ipf',['../pearl-elog_8ipf.html',1,'']]], + ['pearl_2dfitfuncs_2eipf',['pearl-fitfuncs.ipf',['../pearl-fitfuncs_8ipf.html',1,'']]], + ['pearl_2dgui_2dtools_2eipf',['pearl-gui-tools.ipf',['../pearl-gui-tools_8ipf.html',1,'']]], + ['pearl_2dmatrix_2dimport_2eipf',['pearl-matrix-import.ipf',['../pearl-matrix-import_8ipf.html',1,'']]], + ['pearl_2dmenu_2eipf',['pearl-menu.ipf',['../pearl-menu_8ipf.html',1,'']]], + ['pearl_2dotf_2dimport_2eipf',['pearl-otf-import.ipf',['../pearl-otf-import_8ipf.html',1,'']]], + ['pearl_2dpolar_2dcoordinates_2eipf',['pearl-polar-coordinates.ipf',['../pearl-polar-coordinates_8ipf.html',1,'']]], + ['pearl_2dpshell_2dimport_2eipf',['pearl-pshell-import.ipf',['../pearl-pshell-import_8ipf.html',1,'']]], + ['pearl_2dscienta_2dpreprocess_2eipf',['pearl-scienta-preprocess.ipf',['../pearl-scienta-preprocess_8ipf.html',1,'']]], + ['pearl_2dtools_2eipf',['pearl-tools.ipf',['../pearl-tools_8ipf.html',1,'']]], + ['pearl_2dvector_2doperations_2eipf',['pearl-vector-operations.ipf',['../pearl-vector-operations_8ipf.html',1,'']]] +]; diff --git a/doc/html/search/functions_0.html b/doc/html/search/functions_0.html new file mode 100644 index 0000000..6bc52b6 --- /dev/null +++ b/doc/html/search/functions_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_0.js b/doc/html/search/functions_0.js new file mode 100644 index 0000000..f19e6ac --- /dev/null +++ b/doc/html/search/functions_0.js @@ -0,0 +1,81 @@ +var searchData= +[ + ['ad_5fbox_5ffilter',['ad_box_filter',['../pearl-area-display_8ipf.html#a27f0957d61f3c2d30a4854911b460c36',1,'pearl-area-display.ipf']]], + ['ad_5fbrick_5fslicer',['ad_brick_slicer',['../pearl-area-display_8ipf.html#ae3b4756cdc12a4a4b15a770ba0069823',1,'pearl-area-display.ipf']]], + ['ad_5fcalc_5fcursor_5fprofiles',['ad_calc_cursor_profiles',['../pearl-area-display_8ipf.html#a72b57037abd27f65986034c0b4cc191e',1,'pearl-area-display.ipf']]], + ['ad_5fcalc_5fhistogram',['ad_calc_histogram',['../pearl-area-display_8ipf.html#a48b08ab53729d9d0477deaceedef2769',1,'pearl-area-display.ipf']]], + ['ad_5fcalc_5fprofiles',['ad_calc_profiles',['../pearl-area-display_8ipf.html#a48044f9ee518d47770e33ee9f381f204',1,'pearl-area-display.ipf']]], + ['ad_5fcollect_5fmultiscan_5fy',['ad_collect_multiscan_y',['../pearl-area-profiles_8ipf.html#a3cadf0b28d1fd84e9922610c20868283',1,'pearl-area-profiles.ipf']]], + ['ad_5fdefault_5fimage_5ffilter',['ad_default_image_filter',['../pearl-area-display_8ipf.html#a6418a1b2d18b82cb71c0fecbd513a934',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay',['ad_display',['../pearl-area-display_8ipf.html#ae2b11295d2715e9af019513923c64570',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fbrick',['ad_display_brick',['../pearl-area-display_8ipf.html#a65b07e355df20cfb692dfb32f472b478',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fhistogram',['ad_display_histogram',['../pearl-area-display_8ipf.html#a8cc3ea3bea4e851e4144140a2da42a03',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fprofiles',['ad_display_profiles',['../pearl-area-display_8ipf.html#a8fad5aebaca72887d5898b4c421bcdae',1,'pearl-area-display.ipf']]], + ['ad_5fdisplay_5fslice',['ad_display_slice',['../pearl-area-display_8ipf.html#af8d5e003fcff1f750685ed6f94717730',1,'pearl-area-display.ipf']]], + ['ad_5fexport_5fprofile',['ad_export_profile',['../pearl-area-display_8ipf.html#ad3e190d1ec1b82ebef00c9f9ac44b50a',1,'pearl-area-display.ipf']]], + ['ad_5fextract_5frod',['ad_extract_rod',['../pearl-area-profiles_8ipf.html#a8de5d4f1bcca91df5bbff568ab7b582d',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5frod_5fx',['ad_extract_rod_x',['../pearl-area-profiles_8ipf.html#a83700e2faf844e2480c89b6ca4c66a79',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5frod_5fy',['ad_extract_rod_y',['../pearl-area-profiles_8ipf.html#a363af257a04d51fff2a8d5b282f65f21',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5frod_5fz',['ad_extract_rod_z',['../pearl-area-profiles_8ipf.html#a3483707fbdbfdbaec069591a5d3b07a6',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab',['ad_extract_slab',['../pearl-area-profiles_8ipf.html#a65bb359c057a9d900c486e186c9974df',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab_5fx',['ad_extract_slab_x',['../pearl-area-profiles_8ipf.html#af612340d1d132cacda9de7bb77c2e0aa',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab_5fy',['ad_extract_slab_y',['../pearl-area-profiles_8ipf.html#a2eb6a0bcced893e827cfa4e1236e8460',1,'pearl-area-profiles.ipf']]], + ['ad_5fextract_5fslab_5fz',['ad_extract_slab_z',['../pearl-area-profiles_8ipf.html#a71f02613c4a4d21c014493e906dbe922',1,'pearl-area-profiles.ipf']]], + ['ad_5fgizmo_5fset_5fplane',['ad_gizmo_set_plane',['../pearl-area-display_8ipf.html#aee051acfe6a3c8214118b78dfe4854fd',1,'pearl-area-display.ipf']]], + ['ad_5fload_5fdialog',['ad_load_dialog',['../pearl-area-import_8ipf.html#aedff2e67d2e1bac907f2eaf24a6e5c3c',1,'pearl-area-import.ipf']]], + ['ad_5fprofile_5fx',['ad_profile_x',['../pearl-area-profiles_8ipf.html#ab1a65cf82f6933db3dd7b564582e8ed1',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofile_5fx_5fw',['ad_profile_x_w',['../pearl-area-profiles_8ipf.html#aa40fd5049f993e72fd52a66a6cdde7cc',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofile_5fy',['ad_profile_y',['../pearl-area-profiles_8ipf.html#abb1eed32a982037ebab00f5c3ea95e62',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofile_5fy_5fw',['ad_profile_y_w',['../pearl-area-profiles_8ipf.html#a8b09e13162fa47cc076e1e661e80b002',1,'pearl-area-profiles.ipf']]], + ['ad_5fprofiles_5fcrosshairs',['ad_profiles_crosshairs',['../pearl-area-display_8ipf.html#a6d20a8c6bf5ed143d375dee71fb3a6d5',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fcursor_5fmode',['ad_profiles_cursor_mode',['../pearl-area-display_8ipf.html#a5657fc4dcd395aef637c19e8df57a418',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fhook',['ad_profiles_hook',['../pearl-area-display_8ipf.html#a89a5e3e29a0cd09951dcdf13aa28d941',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fset_5fcursor',['ad_profiles_set_cursor',['../pearl-area-display_8ipf.html#ad2a84495ddac89bc8f4203fca56babfd',1,'pearl-area-display.ipf']]], + ['ad_5fprofiles_5fset_5fslice',['ad_profiles_set_slice',['../pearl-area-display_8ipf.html#abaf229d75d9d579a559295795a6bc2e1',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5finit_5fbg',['ad_slicer_init_bg',['../pearl-area-display_8ipf.html#a7334815c60e2c11e2754c07489a62f4b',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5fmove_5fbg',['ad_slicer_move_bg',['../pearl-area-display_8ipf.html#a4af98ec7af48a653c6fac716ea8fa505',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5fstart_5fbg',['ad_slicer_start_bg',['../pearl-area-display_8ipf.html#ad79b37ab4fcf2cbdad6874813d93d4b1',1,'pearl-area-display.ipf']]], + ['ad_5fslicer_5fstop_5fbg',['ad_slicer_stop_bg',['../pearl-area-display_8ipf.html#a77a71985e716a300e0b61c233cd93f40',1,'pearl-area-display.ipf']]], + ['ad_5fsuggest_5ffoldername',['ad_suggest_foldername',['../pearl-area-import_8ipf.html#ad28dbbba73e553f7b5dcf8baf1c86786',1,'pearl-area-import.ipf']]], + ['ad_5ftranspose_5ffilter',['ad_transpose_filter',['../pearl-area-display_8ipf.html#a8411f0cfec3515f1ae4f0140efc14318',1,'pearl-area-display.ipf']]], + ['ad_5fupdate_5fprofiles',['ad_update_profiles',['../pearl-area-display_8ipf.html#afa2546f9cb03dfa8bf0cc9966f0b7a45',1,'pearl-area-display.ipf']]], + ['add_5fimage_5fdata',['add_image_data',['../pearl-anglescan-tracker_8ipf.html#a35a5cd8a21b48be8d726c69eb5fca134',1,'pearl-anglescan-tracker.ipf']]], + ['adh5_5fdefault_5freduction',['adh5_default_reduction',['../pearl-area-import_8ipf.html#a245034d7a94536a24c78a7bfe22725b7',1,'pearl-area-import.ipf']]], + ['adh5_5flist_5freduction_5ffuncs',['adh5_list_reduction_funcs',['../pearl-area-import_8ipf.html#aa5e29dc1a380311d00a5f85be867e47b',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fcomplete',['adh5_load_complete',['../pearl-area-import_8ipf.html#ab1040bf272c69dc69777b2f91df41fab',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fdetector',['adh5_load_detector',['../pearl-area-import_8ipf.html#a84dc7f466b42dde5d96c49827b2122cf',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fdetector_5fimage',['adh5_load_detector_image',['../pearl-area-import_8ipf.html#a931a7bfaaf75d308a0ce3c74ffc751bc',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fdetector_5fslabs',['adh5_load_detector_slabs',['../pearl-area-import_8ipf.html#a4a9741d1c19b10bb98b73bd5163a497b',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5finfo',['adh5_load_info',['../pearl-area-import_8ipf.html#ac76d5ba94a3d7c864437420d80c77064',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5fpreview',['adh5_load_preview',['../pearl-area-import_8ipf.html#a98f29671bdce6a5981e8865de8b9d483',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5freduced',['adh5_load_reduced',['../pearl-area-import_8ipf.html#a98f9339cd2fae80d0d92451df88395aa',1,'pearl-area-import.ipf']]], + ['adh5_5fload_5freduced_5fdetector',['adh5_load_reduced_detector',['../pearl-area-import_8ipf.html#a3f2ac36f961941e46e80a775de8300e5',1,'pearl-area-import.ipf']]], + ['adh5_5floadattr_5fall',['adh5_loadattr_all',['../pearl-area-import_8ipf.html#acde16dc7a393250b17165344f865f7b5',1,'pearl-area-import.ipf']]], + ['adh5_5fredim',['adh5_redim',['../pearl-area-import_8ipf.html#acfa6d2675e63f4f686289ef853b262a9',1,'pearl-area-import.ipf']]], + ['adh5_5fscale',['adh5_scale',['../pearl-area-import_8ipf.html#a774751d1857ea6946a942448dc913128',1,'pearl-area-import.ipf']]], + ['adh5_5fscale_5fscan',['adh5_scale_scan',['../pearl-area-import_8ipf.html#a1fdcc02340375afe8d8cd7537c6e9cfb',1,'pearl-area-import.ipf']]], + ['adh5_5fscale_5fscienta',['adh5_scale_scienta',['../pearl-area-import_8ipf.html#a227e4db1c51a910dcf86d355473fe74e',1,'pearl-area-import.ipf']]], + ['adh5_5fsetup_5fprofile',['adh5_setup_profile',['../pearl-area-import_8ipf.html#a9439de3b676e686eeca4e6b2588c01a6',1,'pearl-area-import.ipf']]], + ['adh5_5ftest_5freduction_5ffunc',['adh5_test_reduction_func',['../pearl-area-import_8ipf.html#a706fb32ee79b589366dec1cf9f7e9d02',1,'pearl-area-import.ipf']]], + ['aftercompiledhook',['AfterCompiledHook',['../pearl-anglescan-tracker_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed',1,'AfterCompiledHook(): pearl-anglescan-tracker.ipf'],['../pearl-arpes_8ipf.html#a8e4eacc6efacf2c65615c1ea72d722ed',1,'AfterCompiledHook(): pearl-arpes.ipf']]], + ['afterfileopenhook',['AfterFileOpenHook',['../pearl-elog_8ipf.html#a3f524f5190341d2accc8cb8c3ed2ceb5',1,'AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#a3f524f5190341d2accc8cb8c3ed2ceb5',1,'AfterFileOpenHook(variable refNum, string file, string pathName, string type, string creator, variable kind): pearl-matrix-import.ipf']]], + ['analyse_5fcurved_5fedge',['analyse_curved_edge',['../fermi-edge-analysis_8ipf.html#a1c4a805435a1d43c2b6dfb6deb633894',1,'fermi-edge-analysis.ipf']]], + ['analyser_5fenergy_5fresolution',['analyser_energy_resolution',['../fermi-edge-analysis_8ipf.html#ad23de34bb698589e2576ce2836b89d55',1,'fermi-edge-analysis.ipf']]], + ['appendtographiterator',['AppendToGraphIterator',['../pearl-tools_8ipf.html#a90c62bdfc186e2482ccb18113a591d5e',1,'pearl-tools.ipf']]], + ['ast_5fadd_5fimage',['ast_add_image',['../pearl-anglescan-tracker_8ipf.html#a43d85b93bb42a67b8e8afb9afc8d8eae',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fcallback_5fdata',['ast_callback_data',['../pearl-anglescan-tracker_8ipf.html#a4cf5ad2fdf771ffc157a3924a03f5a46',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fcallback_5fdetector',['ast_callback_detector',['../pearl-anglescan-tracker_8ipf.html#ac953a75b45d65adf37ce5560bf441876',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fcallback_5fmanip',['ast_callback_manip',['../pearl-anglescan-tracker_8ipf.html#a9b4acc299c5e698695baf0b4817ff7eb',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fclose',['ast_close',['../pearl-anglescan-tracker_8ipf.html#a8a74ddd33e286105a45a89105de72621',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fexport',['ast_export',['../pearl-anglescan-tracker_8ipf.html#ac9c92805f39c7a5c68d4c017d14ee178',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fimport',['ast_import',['../pearl-anglescan-tracker_8ipf.html#ae4ece97352b85ced47e954c025e3b69b',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fprepare',['ast_prepare',['../pearl-anglescan-tracker_8ipf.html#a766f90a9dad70d9deb4272ba480ee84a',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fset_5fprocessing',['ast_set_processing',['../pearl-anglescan-tracker_8ipf.html#a02271bf812a3e3f87c958f4c58e9f71b',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fsetup',['ast_setup',['../pearl-anglescan-tracker_8ipf.html#a5fb1f1abddb56b129f053605035d3281',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fupdate_5fdetector',['ast_update_detector',['../pearl-anglescan-tracker_8ipf.html#a150243e26e8adf8b354b8afde064136d',1,'pearl-anglescan-tracker.ipf']]], + ['ast_5fwindow_5fhook',['ast_window_hook',['../pearl-anglescan-tracker_8ipf.html#a33e84ae8e13f405d466b28e83f608cb9',1,'pearl-anglescan-tracker.ipf']]], + ['attributes_5fnotebook',['attributes_notebook',['../pearl-data-explorer_8ipf.html#ad6cfb2c00d5112add84542a25eb68b19',1,'pearl-data-explorer.ipf']]], + ['au4f',['Au4f',['../pearl-fitfuncs_8ipf.html#a13a5ee22049d9a3379cd6e55654e70a3',1,'pearl-fitfuncs.ipf']]], + ['au4f_5f2p2',['Au4f_2p2',['../pearl-fitfuncs_8ipf.html#a24cd6a0c96ef8c720e371bb31ac0a479',1,'pearl-fitfuncs.ipf']]], + ['au4f_5f2p3',['Au4f_2p3',['../pearl-fitfuncs_8ipf.html#a709f7c4585b1d850ea8aae1885ac18cb',1,'pearl-fitfuncs.ipf']]] +]; diff --git a/doc/html/search/functions_1.html b/doc/html/search/functions_1.html new file mode 100644 index 0000000..648831f --- /dev/null +++ b/doc/html/search/functions_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_1.js b/doc/html/search/functions_1.js new file mode 100644 index 0000000..32c1f07 --- /dev/null +++ b/doc/html/search/functions_1.js @@ -0,0 +1,32 @@ +var searchData= +[ + ['beforefileopenhook',['BeforeFileOpenHook',['../pearl-area-import_8ipf.html#ae2cfa1ac6651cfc3fb0dfce03494995b',1,'BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind): pearl-area-import.ipf'],['../pearl-matrix-import_8ipf.html#ae2cfa1ac6651cfc3fb0dfce03494995b',1,'BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind): pearl-matrix-import.ipf']]], + ['bp_5fattach',['bp_attach',['../pearl-elog_8ipf.html#acbba78d869a543edf7c2b80d7a8d2344',1,'pearl-elog.ipf']]], + ['bp_5fattach_5fallnone',['bp_attach_allnone',['../pearl-elog_8ipf.html#a4040736819edadf4b26982bcfdb9c7b9',1,'pearl-elog.ipf']]], + ['bp_5fattach_5ftop',['bp_attach_top',['../pearl-elog_8ipf.html#a91b5f51982d23a36d1760b8874b5736a',1,'pearl-elog.ipf']]], + ['bp_5fattach_5fupdown',['bp_attach_updown',['../pearl-elog_8ipf.html#aa1dfae6d78a367d50ee8fc1ffe9cb69b',1,'pearl-elog.ipf']]], + ['bp_5fattr_5fnotebook',['bp_attr_notebook',['../pearl-data-explorer_8ipf.html#a4ef196f752bb5780ed4f4a588f9ebc81',1,'pearl-data-explorer.ipf']]], + ['bp_5fbrowse_5ffilepath',['bp_browse_filepath',['../pearl-data-explorer_8ipf.html#a02a64144b7ed2c1bc230e265c55e81a1',1,'pearl-data-explorer.ipf']]], + ['bp_5fcapture',['bp_capture',['../pearl-anglescan-tracker_8ipf.html#afaec8443094530fd1e723251e04c5dc9',1,'pearl-anglescan-tracker.ipf']]], + ['bp_5fclear',['bp_clear',['../pearl-elog_8ipf.html#ab39637298c93b7aefd67febf3a4e7672',1,'pearl-elog.ipf']]], + ['bp_5fdataset_5fdisplay',['bp_dataset_display',['../pearl-data-explorer_8ipf.html#a5660c6f5f78d880b0805bad4eefed1d5',1,'pearl-data-explorer.ipf']]], + ['bp_5fdataset_5ffolder',['bp_dataset_folder',['../pearl-data-explorer_8ipf.html#a6b642da731bde1029e0fa2ff69d5fb06',1,'pearl-data-explorer.ipf']]], + ['bp_5fdataset_5fnext',['bp_dataset_next',['../pearl-data-explorer_8ipf.html#a3bbb332e319ef7ec5f0fe2d16afaf005',1,'pearl-data-explorer.ipf']]], + ['bp_5fdataset_5fprev',['bp_dataset_prev',['../pearl-data-explorer_8ipf.html#add62ff5193206c9f207952bcd72dac88',1,'pearl-data-explorer.ipf']]], + ['bp_5fextract_5fslice',['bp_extract_slice',['../pearl-area-display_8ipf.html#a31461b664ec651a39442e9a46ffd88c9',1,'pearl-area-display.ipf']]], + ['bp_5ffile_5fnext',['bp_file_next',['../pearl-data-explorer_8ipf.html#a9cefcdc49b2169e99c743b0a683ed3a6',1,'pearl-data-explorer.ipf']]], + ['bp_5ffile_5fprev',['bp_file_prev',['../pearl-data-explorer_8ipf.html#a6aa44ff12b8530adbaaaf7405b1a68ba',1,'pearl-data-explorer.ipf']]], + ['bp_5fload_5ffiles',['bp_load_files',['../pearl-data-explorer_8ipf.html#a742902dfaf2246f10b70f52805c6df1f',1,'pearl-data-explorer.ipf']]], + ['bp_5fload_5ffiles_5fopt',['bp_load_files_opt',['../pearl-data-explorer_8ipf.html#ad61aa85dcf24dbf7e093dac3d0bf6f19',1,'pearl-data-explorer.ipf']]], + ['bp_5fload_5fprefs',['bp_load_prefs',['../pearl-data-explorer_8ipf.html#a1868754e64cb1448e564c0936e78574d',1,'pearl-data-explorer.ipf']]], + ['bp_5flogin',['bp_login',['../pearl-elog_8ipf.html#a14f8376a0485aa654ccf3d2f30ab4d01',1,'pearl-elog.ipf']]], + ['bp_5flogout',['bp_logout',['../pearl-elog_8ipf.html#ad4472ea917691c41ad0b4ea6f36010a5',1,'pearl-elog.ipf']]], + ['bp_5fmove_5fslice',['bp_move_slice',['../pearl-area-display_8ipf.html#ab8c9979c6f3ab95f983c2a525a69c035',1,'pearl-area-display.ipf']]], + ['bp_5fmove_5fslice_5fcenter',['bp_move_slice_center',['../pearl-area-display_8ipf.html#abe702d40071e3c5e662eb8d47dd6d885',1,'pearl-area-display.ipf']]], + ['bp_5freset_5fcursors',['bp_reset_cursors',['../pearl-area-display_8ipf.html#a24b17f99fafd8043ed3e4502000da316',1,'pearl-area-display.ipf']]], + ['bp_5fsave_5fgraphs',['bp_save_graphs',['../pearl-elog_8ipf.html#a8251cea45c8d1f1993a4051a6d0760c4',1,'pearl-elog.ipf']]], + ['bp_5fsave_5fprefs',['bp_save_prefs',['../pearl-data-explorer_8ipf.html#ad8a01428a137278a31d4f1f4f9c634c5',1,'pearl-data-explorer.ipf']]], + ['bp_5fsubmit',['bp_submit',['../pearl-elog_8ipf.html#adeff6678e57313cb218824f06d32b5ec',1,'pearl-elog.ipf']]], + ['bp_5fupdate_5fdatasets',['bp_update_datasets',['../pearl-data-explorer_8ipf.html#af9f8769ca2989f152f23d976d1467a48',1,'pearl-data-explorer.ipf']]], + ['bp_5fupdate_5ffilelist',['bp_update_filelist',['../pearl-data-explorer_8ipf.html#a45be265789a5260e3daa05eca0ec309e',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/functions_10.html b/doc/html/search/functions_10.html new file mode 100644 index 0000000..8bc4de4 --- /dev/null +++ b/doc/html/search/functions_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_10.js b/doc/html/search/functions_10.js new file mode 100644 index 0000000..350d8d5 --- /dev/null +++ b/doc/html/search/functions_10.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['read_5fattribute_5finfo',['read_attribute_info',['../pearl-area-import_8ipf.html#ac98a5f2d12b559aba4e53192c49a7743',1,'pearl-area-import.ipf']]], + ['record_5fresults',['record_results',['../fermi-edge-analysis_8ipf.html#aac6bac1ee0582caa0676bdc9c2d254f0',1,'fermi-edge-analysis.ipf']]], + ['redim_5flinbg_5freduction',['redim_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a9b3321b9ed876ff50e260fa311ebf4be',1,'pearl-scienta-preprocess.ipf']]], + ['reduce_5fslab_5fimage',['reduce_slab_image',['../pearl-area-import_8ipf.html#acf0315ec8a3e927ef161a35cb05adb8b',1,'reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param): pearl-area-import.ipf'],['../pearl-pshell-import_8ipf.html#acf0315ec8a3e927ef161a35cb05adb8b',1,'reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param): pearl-pshell-import.ipf']]], + ['reduce_5fslab_5fworker',['reduce_slab_worker',['../pearl-area-import_8ipf.html#a33f8faf117450af1d6dae9ef48786cd6',1,'reduce_slab_worker(funcref reduction_func): pearl-area-import.ipf'],['../pearl-pshell-import_8ipf.html#a33f8faf117450af1d6dae9ef48786cd6',1,'reduce_slab_worker(funcref reduction_func): pearl-pshell-import.ipf']]], + ['rotate2d_5fx',['rotate2d_x',['../pearl-vector-operations_8ipf.html#ac579a92f012f0d0ef7b8f097e1c8b3c7',1,'pearl-vector-operations.ipf']]], + ['rotate2d_5fy',['rotate2d_y',['../pearl-vector-operations_8ipf.html#a355150c423ab975fe7f1832917118ea3',1,'pearl-vector-operations.ipf']]], + ['rotate_5fhemi_5fscan',['rotate_hemi_scan',['../pearl-anglescan-process_8ipf.html#a5162488b366e217195d8f8bd7cdde0ce',1,'pearl-anglescan-process.ipf']]], + ['rotate_5fx_5fwave',['rotate_x_wave',['../pearl-vector-operations_8ipf.html#ada80428496dc748b960bd9c65df7da8b',1,'pearl-vector-operations.ipf']]], + ['rotate_5fy_5fwave',['rotate_y_wave',['../pearl-vector-operations_8ipf.html#adfd1d68e739694982fbd00b76568c1c0',1,'pearl-vector-operations.ipf']]], + ['rotate_5fz_5fwave',['rotate_z_wave',['../pearl-vector-operations_8ipf.html#a0030e927980581d57781ad391f2d872a',1,'pearl-vector-operations.ipf']]] +]; diff --git a/doc/html/search/functions_11.html b/doc/html/search/functions_11.html new file mode 100644 index 0000000..e1e427c --- /dev/null +++ b/doc/html/search/functions_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_11.js b/doc/html/search/functions_11.js new file mode 100644 index 0000000..c87efae --- /dev/null +++ b/doc/html/search/functions_11.js @@ -0,0 +1,35 @@ +var searchData= +[ + ['save_5fhemi_5fscan',['save_hemi_scan',['../pearl-anglescan-process_8ipf.html#a48cbd596656bc6d849c53afb4c58b90d',1,'pearl-anglescan-process.ipf']]], + ['save_5fprefs',['save_prefs',['../pearl-anglescan-tracker_8ipf.html#ac729557a307bddd2f2ad298199976c01',1,'save_prefs(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#ac729557a307bddd2f2ad298199976c01',1,'save_prefs(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#ac729557a307bddd2f2ad298199976c01',1,'save_prefs(): pearl-elog.ipf']]], + ['save_5ftracker_5fdata',['save_tracker_data',['../pearl-anglescan-tracker_8ipf.html#a8d6e9058f2b0b4978f56e892ce199e6a',1,'pearl-anglescan-tracker.ipf']]], + ['scienta_5fang_5ftransm',['scienta_ang_transm',['../pearl-scienta-preprocess_8ipf.html#a26f46acd339fb483ce9792e06170c189',1,'pearl-scienta-preprocess.ipf']]], + ['scienta_5fnorm',['scienta_norm',['../pearl-scienta-preprocess_8ipf.html#a09ae6058d39d76a59c862e945d512fa8',1,'pearl-scienta-preprocess.ipf']]], + ['scienta_5fpoly_5fbg',['scienta_poly_bg',['../pearl-scienta-preprocess_8ipf.html#a26e51aa77d5f416d613f1c5df82b6f5c',1,'pearl-scienta-preprocess.ipf']]], + ['select_5fdataset',['select_dataset',['../pearl-pshell-import_8ipf.html#abb4afdef6ae4476c25a1ff77b17266c3',1,'pearl-pshell-import.ipf']]], + ['set_5fpanel_5fattributes',['set_panel_attributes',['../pearl-elog_8ipf.html#a39a1f418c8a2f9a5e4ab976827d8efca',1,'pearl-elog.ipf']]], + ['set_5fpanel_5fgraphs',['set_panel_graphs',['../pearl-elog_8ipf.html#a6eca5f4fab999984df32b50dd669c0b1',1,'pearl-elog.ipf']]], + ['set_5fpanel_5fmessage',['set_panel_message',['../pearl-elog_8ipf.html#aa7a3988440bb6d73573b50a4698a0e75',1,'pearl-elog.ipf']]], + ['set_5fpolar_5fgraph_5fcursor',['set_polar_graph_cursor',['../pearl-anglescan-process_8ipf.html#a70b0e243bcbd549e2b1da74aab605629',1,'pearl-anglescan-process.ipf']]], + ['set_5frotation_5fx',['set_rotation_x',['../pearl-vector-operations_8ipf.html#a8a8dff94d9f7b992c2c2c0744001e74b',1,'pearl-vector-operations.ipf']]], + ['set_5frotation_5fy',['set_rotation_y',['../pearl-vector-operations_8ipf.html#adfdf1cfe8812d8d0006228f6c14c9582',1,'pearl-vector-operations.ipf']]], + ['set_5frotation_5fz',['set_rotation_z',['../pearl-vector-operations_8ipf.html#a76feca10fe5d3e085f01c73a59b38424',1,'pearl-vector-operations.ipf']]], + ['set_5ftrace_5fcolors',['set_trace_colors',['../pearl-area-display_8ipf.html#abafc4f012b04592724109f4757cbe271',1,'pearl-area-display.ipf']]], + ['setup_5fdata',['setup_data',['../pearl-anglescan-tracker_8ipf.html#a6bfd8b6eba0b206df6ec56c7b6489e0b',1,'pearl-anglescan-tracker.ipf']]], + ['setup_5fdetector',['setup_detector',['../pearl-anglescan-tracker_8ipf.html#aa79c1d1584eb2322adae328bf1437f34',1,'pearl-anglescan-tracker.ipf']]], + ['setup_5fgraph',['setup_graph',['../pearl-anglescan-tracker_8ipf.html#aa7c4e3e0ed255e61bc80f8b27b78fce6',1,'pearl-anglescan-tracker.ipf']]], + ['shockley_5fanglefit',['Shockley_anglefit',['../pearl-scienta-preprocess_8ipf.html#adc472d56286afd855109d561fbf633bd',1,'pearl-scienta-preprocess.ipf']]], + ['show_5fanalyser_5fline',['show_analyser_line',['../pearl-anglescan-process_8ipf.html#a01bac9e7d4ba743c3c34177a05070466',1,'pearl-anglescan-process.ipf']]], + ['show_5fpreview_5fgraph',['show_preview_graph',['../pearl-data-explorer_8ipf.html#a4db79d04c74beb1af71b72916f8f0362',1,'pearl-data-explorer.ipf']]], + ['show_5fshift',['show_shift',['../fermi-edge-analysis_8ipf.html#acf72d644b8d37b6c26b1e070edba4e30',1,'fermi-edge-analysis.ipf']]], + ['showcomponents_5fau4f_5f2p2',['ShowComponents_Au4f_2p2',['../pearl-fitfuncs_8ipf.html#a84a0278284332631682ce032018d1716',1,'pearl-fitfuncs.ipf']]], + ['showcomponents_5fau4f_5f2p3',['ShowComponents_Au4f_2p3',['../pearl-fitfuncs_8ipf.html#a02368cc4adfbd746cd2f1e7d73884a61',1,'pearl-fitfuncs.ipf']]], + ['slit_5fcorrection',['slit_correction',['../fermi-edge-analysis_8ipf.html#a4cec596c8fd2b21953cb45d6d347211d',1,'fermi-edge-analysis.ipf']]], + ['slit_5fshift',['slit_shift',['../fermi-edge-analysis_8ipf.html#a27f000c3a3ea74c49db31716be3396d4',1,'fermi-edge-analysis.ipf']]], + ['slp_5fslice_5fposition',['slp_slice_position',['../pearl-area-display_8ipf.html#ace169e0824e6bddbd646972946edccbe',1,'pearl-area-display.ipf']]], + ['strip_5fdelete_5fframes',['strip_delete_frames',['../pearl-anglescan-process_8ipf.html#a13e0d37ae23f68cdc5da3d84cb4beed8',1,'pearl-anglescan-process.ipf']]], + ['subtract_5fline_5fbg',['subtract_line_bg',['../pearl-matrix-import_8ipf.html#ab80101bc780dcbe94200e2446bce51d9',1,'pearl-matrix-import.ipf']]], + ['sumwavesiterator',['SumWavesIterator',['../pearl-tools_8ipf.html#aea193a1b5fbdbb2a5dec9f25f3c05c45',1,'pearl-tools.ipf']]], + ['svp_5fslice_5fposition',['svp_slice_position',['../pearl-area-display_8ipf.html#a174177742fdce7f37027de8fa832b3bd',1,'pearl-area-display.ipf']]], + ['svp_5fsmoothing',['svp_smoothing',['../pearl-area-display_8ipf.html#ab10a0d94991b9cd958557dbc48d70624',1,'pearl-area-display.ipf']]] +]; diff --git a/doc/html/search/functions_12.html b/doc/html/search/functions_12.html new file mode 100644 index 0000000..8dac9d2 --- /dev/null +++ b/doc/html/search/functions_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_12.js b/doc/html/search/functions_12.js new file mode 100644 index 0000000..c6099b7 --- /dev/null +++ b/doc/html/search/functions_12.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['test_5fattributes_5fnotebook',['test_attributes_notebook',['../pearl-data-explorer_8ipf.html#a71f9c277d310c3f4e7739be69dad0ab5',1,'pearl-data-explorer.ipf']]], + ['test_5fint_5flinbg',['test_int_linbg',['../pearl-scienta-preprocess_8ipf.html#a01fdc27931518dc988500b3cba409e57',1,'pearl-scienta-preprocess.ipf']]], + ['test_5fint_5fquadbg',['test_int_quadbg',['../pearl-scienta-preprocess_8ipf.html#a1b1f473b96119afa602759a51e0c5b4c',1,'pearl-scienta-preprocess.ipf']]], + ['test_5fshockley_5fanglefit',['test_shockley_anglefit',['../pearl-scienta-preprocess_8ipf.html#ad9c09259aaaf32246fe9391dfb3e2c93',1,'pearl-scienta-preprocess.ipf']]], + ['toggle_5fcapture',['toggle_capture',['../pearl-anglescan-tracker_8ipf.html#a02987fe03ea914a53c52d58219979d65',1,'pearl-anglescan-tracker.ipf']]], + ['trim_5fhemi_5fscan',['trim_hemi_scan',['../pearl-anglescan-process_8ipf.html#a5dc0cc7db9d3d7a6b3fa3f1b04d84a5e',1,'pearl-anglescan-process.ipf']]], + ['twave2list',['twave2list',['../pearl-pshell-import_8ipf.html#a92a18d6e81c3f521ba3bb240eaf578a9',1,'pearl-pshell-import.ipf']]] +]; diff --git a/doc/html/search/functions_13.html b/doc/html/search/functions_13.html new file mode 100644 index 0000000..5422011 --- /dev/null +++ b/doc/html/search/functions_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_13.js b/doc/html/search/functions_13.js new file mode 100644 index 0000000..3efe99b --- /dev/null +++ b/doc/html/search/functions_13.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['unloadpearlarpespackage',['UnloadPearlArpesPackage',['../pearl-arpes_8ipf.html#ac41f24572943dac2b40c255797a6c7a8',1,'pearl-arpes.ipf']]], + ['update_5fattach_5fitems',['update_attach_items',['../pearl-elog_8ipf.html#a9c1cfd320e88e84dcf4f84bbcf3f46a5',1,'pearl-elog.ipf']]], + ['update_5fcapture',['update_capture',['../pearl-anglescan-tracker_8ipf.html#a9751db419b4c0de884450c09ff5822a7',1,'pearl-anglescan-tracker.ipf']]], + ['update_5fdata_5fgraph',['update_data_graph',['../pearl-anglescan-tracker_8ipf.html#a0b8ff36cf3c20b1c0db3217d9065f7cf',1,'pearl-anglescan-tracker.ipf']]], + ['update_5fdatasets',['update_datasets',['../pearl-data-explorer_8ipf.html#ad50f4c430d8bfe0fb5a1356cd9b84bf4',1,'pearl-data-explorer.ipf']]], + ['update_5fdetector',['update_detector',['../pearl-anglescan-tracker_8ipf.html#ab961340af09fed4d2006bca8c0f2edd5',1,'pearl-anglescan-tracker.ipf']]], + ['update_5fdetector_5fgraph',['update_detector_graph',['../pearl-anglescan-tracker_8ipf.html#af5a2960c49626f267fbd2873b27c8e42',1,'pearl-anglescan-tracker.ipf']]], + ['update_5ffilelist',['update_filelist',['../pearl-data-explorer_8ipf.html#a04cc0b9d5e3a649ba3514fcbf126eefe',1,'pearl-data-explorer.ipf']]], + ['update_5fpolar_5finfo',['update_polar_info',['../pearl-anglescan-process_8ipf.html#a1baaa3ffd9495ed427b43cbfe6e1edf8',1,'pearl-anglescan-process.ipf']]], + ['update_5fprogress_5fpanel',['update_progress_panel',['../pearl-gui-tools_8ipf.html#a97ad19d83cf0007c4bcf97a32164610f',1,'pearl-gui-tools.ipf']]], + ['update_5fslice_5finfo',['update_slice_info',['../pearl-area-display_8ipf.html#a2442bc044aaa12ab817a5f9fa300d1f8',1,'pearl-area-display.ipf']]] +]; diff --git a/doc/html/search/functions_14.html b/doc/html/search/functions_14.html new file mode 100644 index 0000000..cb681fe --- /dev/null +++ b/doc/html/search/functions_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_14.js b/doc/html/search/functions_14.js new file mode 100644 index 0000000..d62da80 --- /dev/null +++ b/doc/html/search/functions_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wave2list',['wave2list',['../pearl-pshell-import_8ipf.html#aa6dc3e3f7dc1ca4346132635a90fc447',1,'pearl-pshell-import.ipf']]] +]; diff --git a/doc/html/search/functions_2.html b/doc/html/search/functions_2.html new file mode 100644 index 0000000..c93d089 --- /dev/null +++ b/doc/html/search/functions_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_2.js b/doc/html/search/functions_2.js new file mode 100644 index 0000000..ead846a --- /dev/null +++ b/doc/html/search/functions_2.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['calc_5fdoniachsunjicbroad',['Calc_DoniachSunjicBroad',['../pearl-fitfuncs_8ipf.html#aff8e8b103c32c8e723b57ce7ad5ef0f5',1,'pearl-fitfuncs.ipf']]], + ['calc_5fgraph_5fazi',['calc_graph_azi',['../pearl-anglescan-process_8ipf.html#a4fc744e24e3e9c5efb17f14ab622bcae',1,'pearl-anglescan-process.ipf']]], + ['calc_5fgraph_5fpolar',['calc_graph_polar',['../pearl-anglescan-process_8ipf.html#ae2b036a06ffac8d2bb292a65401f8a9a',1,'pearl-anglescan-process.ipf']]], + ['calc_5fgraph_5fradius',['calc_graph_radius',['../pearl-anglescan-process_8ipf.html#a75219b38ea58012abcffc848d536faa4',1,'pearl-anglescan-process.ipf']]], + ['calc_5fnth',['calc_nth',['../pearl-anglescan-process_8ipf.html#a9624070f3e938378631432430d47a389',1,'pearl-anglescan-process.ipf']]], + ['calc_5fphi_5fstep',['calc_phi_step',['../pearl-anglescan-process_8ipf.html#a999a9cd7d00d3e1ec8e768228a664ad1',1,'pearl-anglescan-process.ipf']]], + ['calc_5fthe_5fstep',['Calc_The_step',['../pearl-anglescan-process_8ipf.html#a1fb6aa7870dfbf0ed92660b7aae579e0',1,'pearl-anglescan-process.ipf']]], + ['calc_5fy_5fprofile_5fmins',['calc_y_profile_mins',['../pearl-area-profiles_8ipf.html#ab58b7c0a88743ecbcb0fc8296577a792',1,'pearl-area-profiles.ipf']]], + ['calcn_5ftheta',['CalcN_Theta',['../pearl-anglescan-process_8ipf.html#ac0def1ded61f9cd758df0c99f4ff9470',1,'pearl-anglescan-process.ipf']]], + ['capture_5fint_5flinbg_5fcursors',['capture_int_linbg_cursors',['../pearl-scienta-preprocess_8ipf.html#ae6877c51ad15c2ba8a69c65356cb34b8',1,'pearl-scienta-preprocess.ipf']]], + ['cart2polar',['cart2polar',['../pearl-polar-coordinates_8ipf.html#aca0a5aaa4854d83ef667c53007312fb8',1,'pearl-polar-coordinates.ipf']]], + ['cart2polar_5fwave',['cart2polar_wave',['../pearl-polar-coordinates_8ipf.html#adfc1f0b3cddf672b0ccdb6a22b97ba9e',1,'pearl-polar-coordinates.ipf']]], + ['check_5fpackage_5ffolder',['check_package_folder',['../pearl-matrix-import_8ipf.html#ac7790f06151821678a65ab0065a5323e',1,'pearl-matrix-import.ipf']]], + ['cleanup_5ftemp_5ffiles',['cleanup_temp_files',['../pearl-elog_8ipf.html#ad7640d06f004ecd4a8980ea29d24dcbe',1,'pearl-elog.ipf']]], + ['clear_5fhemi_5fgrid',['clear_hemi_grid',['../pearl-anglescan-process_8ipf.html#a3ec6935a5903d0974c93a2072d743013',1,'pearl-anglescan-process.ipf']]], + ['convert_5fangles_5fttpa2polar',['convert_angles_ttpa2polar',['../pearl-anglescan-process_8ipf.html#a3cc7eddf5c6b0658260cfb32dd2c026d',1,'pearl-anglescan-process.ipf']]], + ['convert_5fangles_5fttpd2polar',['convert_angles_ttpd2polar',['../pearl-anglescan-process_8ipf.html#a2b38c6c9b6e60593ba69d3773b6bc779',1,'pearl-anglescan-process.ipf']]], + ['create_5fcmd_5ffile',['create_cmd_file',['../pearl-elog_8ipf.html#ac8b61eefed231018cc36d47e95bd8c22',1,'pearl-elog.ipf']]], + ['create_5fgraph_5ffile',['create_graph_file',['../pearl-elog_8ipf.html#a2417d079483f773f8231c5f2caba6cf0',1,'pearl-elog.ipf']]], + ['create_5fmessage_5ffile',['create_message_file',['../pearl-elog_8ipf.html#af652f6f257be1ee749fe788d1b03f75f',1,'pearl-elog.ipf']]], + ['create_5frotation_5fmatrix_5ffree',['create_rotation_matrix_free',['../pearl-vector-operations_8ipf.html#a72c3200a7344c708ea76e20cc2c19c43',1,'pearl-vector-operations.ipf']]], + ['crop_5fstrip',['crop_strip',['../pearl-anglescan-process_8ipf.html#ab65d25af7476ed18f7bf7359614a912b',1,'pearl-anglescan-process.ipf']]], + ['csr_5fint_5flinbg_5freduction',['csr_int_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a95fbd22f52f61d2bff0625b7b8e159d1',1,'pearl-scienta-preprocess.ipf']]] +]; diff --git a/doc/html/search/functions_3.html b/doc/html/search/functions_3.html new file mode 100644 index 0000000..caa48ea --- /dev/null +++ b/doc/html/search/functions_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_3.js b/doc/html/search/functions_3.js new file mode 100644 index 0000000..4890379 --- /dev/null +++ b/doc/html/search/functions_3.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['defaultfolderiterator',['DefaultFolderIterator',['../pearl-tools_8ipf.html#a3fb8c06030dc41a599380150807caeb0',1,'pearl-tools.ipf']]], + ['defaultwaveiterator',['DefaultWaveIterator',['../pearl-tools_8ipf.html#a6bdd1c0b269f1d7d99843ce0cb218cc7',1,'pearl-tools.ipf']]], + ['display2dprofiles',['Display2dProfiles',['../pearl-menu_8ipf.html#aad7d768680c6d8a9b8a7025c7e1ec75d',1,'pearl-menu.ipf']]], + ['display3dslicer',['Display3dSlicer',['../pearl-menu_8ipf.html#ac73a94f760455f19294a9f917b43f145',1,'pearl-menu.ipf']]], + ['display_5fdataset',['display_dataset',['../pearl-data-explorer_8ipf.html#ae79a57a41c734ce8836f427b81011b5d',1,'pearl-data-explorer.ipf']]], + ['display_5fhemi_5fscan',['display_hemi_scan',['../pearl-anglescan-process_8ipf.html#ae57302acfc822c4817f2b7eef55efea2',1,'pearl-anglescan-process.ipf']]], + ['display_5fpolar_5fgraph',['display_polar_graph',['../pearl-anglescan-process_8ipf.html#a46fd99d35a43601c39af6096d4e4f770',1,'pearl-anglescan-process.ipf']]], + ['display_5fpreview_5ftrace',['display_preview_trace',['../pearl-data-explorer_8ipf.html#a001074020ad32b290d390a450a389c69',1,'pearl-data-explorer.ipf']]], + ['display_5fprogress_5fpanel',['display_progress_panel',['../pearl-gui-tools_8ipf.html#aaf29d090c81e00cf44af295193b24c5a',1,'pearl-gui-tools.ipf']]], + ['display_5fscanlines',['display_scanlines',['../pearl-anglescan-process_8ipf.html#a1f4f74a8ae557c56e1e3aacd0b45f3f1',1,'pearl-anglescan-process.ipf']]], + ['displaygizmoslicer',['DisplayGizmoSlicer',['../pearl-menu_8ipf.html#aab34952c2f3b36f9ee8619eb901ff581',1,'pearl-menu.ipf']]], + ['doniachsunjicbroad',['DoniachSunjicBroad',['../pearl-fitfuncs_8ipf.html#ae2d138beb7cb39e8042487893095b461',1,'pearl-fitfuncs.ipf']]], + ['doniachsunjicbroads',['DoniachSunjicBroadS',['../pearl-fitfuncs_8ipf.html#a9d110819fa3cd2173f3103724e394fdf',1,'pearl-fitfuncs.ipf']]], + ['draw_5fdiffraction_5fcone',['draw_diffraction_cone',['../pearl-anglescan-process_8ipf.html#afedad38a418cee5d1fb9e08aae2160a0',1,'pearl-anglescan-process.ipf']]], + ['draw_5fhemi_5faxes',['draw_hemi_axes',['../pearl-anglescan-process_8ipf.html#af00d9061e410ad033a9fd1f0ca561e0d',1,'pearl-anglescan-process.ipf']]], + ['ds1_5fbg',['ds1_bg',['../pearl-fitfuncs_8ipf.html#af62cb65b7444ff60e956a45bd5d0ec27',1,'pearl-fitfuncs.ipf']]], + ['ds2_5fbg',['ds2_bg',['../pearl-fitfuncs_8ipf.html#a1e729418252bf0d05ea6ec5cbd65b834',1,'pearl-fitfuncs.ipf']]], + ['ds4_5fbg',['ds4_bg',['../pearl-fitfuncs_8ipf.html#ab32134566b2573672ac674565deebd36',1,'pearl-fitfuncs.ipf']]], + ['ds6_5fbg',['ds6_bg',['../pearl-fitfuncs_8ipf.html#a5a2a03026b88f3dd99214ab1b26e6f80',1,'pearl-fitfuncs.ipf']]], + ['duplicate_5fhemi_5fscan',['duplicate_hemi_scan',['../pearl-anglescan-process_8ipf.html#aa5b1e2ab1dd43a73b7157406b803887e',1,'pearl-anglescan-process.ipf']]] +]; diff --git a/doc/html/search/functions_4.html b/doc/html/search/functions_4.html new file mode 100644 index 0000000..a9c64ad --- /dev/null +++ b/doc/html/search/functions_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_4.js b/doc/html/search/functions_4.js new file mode 100644 index 0000000..c2ba15e --- /dev/null +++ b/doc/html/search/functions_4.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['edit_5foffsets',['edit_offsets',['../pearl-anglescan-tracker_8ipf.html#a37aaf2f08c3910bed554a10dd82616ec',1,'pearl-anglescan-tracker.ipf']]], + ['edit_5freduction_5fparams',['edit_reduction_params',['../pearl-anglescan-tracker_8ipf.html#a3844e7fd93b4f54aa52f084687c2106c',1,'pearl-anglescan-tracker.ipf']]], + ['elog_5fadd_5fattachment',['elog_add_attachment',['../pearl-elog_8ipf.html#ac2f76abed8cfaa7ac02a46c0b89004f0',1,'pearl-elog.ipf']]], + ['elog_5fconfig',['elog_config',['../pearl-elog_8ipf.html#a424460442afd5f6f853e68cd665ed785',1,'pearl-elog.ipf']]], + ['elog_5fcreate_5fentry',['elog_create_entry',['../pearl-elog_8ipf.html#a05301d497e4796e5fb5adde3728ba971',1,'pearl-elog.ipf']]], + ['elog_5fcreate_5flogbook',['elog_create_logbook',['../pearl-elog_8ipf.html#ab6d97edbf33e8ec039b34ff756e7ab93',1,'pearl-elog.ipf']]], + ['elog_5finit_5fpearl_5ftemplates',['elog_init_pearl_templates',['../pearl-elog_8ipf.html#aaca820a0149ce6a0e843ca72b9c9e7ab',1,'pearl-elog.ipf']]], + ['elog_5flogin',['elog_login',['../pearl-elog_8ipf.html#a3eac4012891c2813e401aee2c1134763',1,'pearl-elog.ipf']]], + ['elog_5flogout',['elog_logout',['../pearl-elog_8ipf.html#a96e4cbbdb0fd8c58d87b502dc1883664',1,'pearl-elog.ipf']]], + ['elog_5fpanel_5fhook',['elog_panel_hook',['../pearl-elog_8ipf.html#af8b1ea711208bcc2cd1647abe04131dc',1,'pearl-elog.ipf']]], + ['elog_5fprompt_5flogbook',['elog_prompt_logbook',['../pearl-elog_8ipf.html#acedf0c8ae34e9ebadd6fa0d9d1353aa4',1,'pearl-elog.ipf']]], + ['elog_5fprompt_5flogin',['elog_prompt_login',['../pearl-elog_8ipf.html#afbace5ffc3167b42b09657ce6cc854ca',1,'pearl-elog.ipf']]], + ['elog_5fvalidate_5fattributes',['elog_validate_attributes',['../pearl-elog_8ipf.html#ab2558ef5cd5e5dfba410bd58ed258b64',1,'pearl-elog.ipf']]], + ['epics_5fconnect',['epics_connect',['../pearl-anglescan-tracker_8ipf.html#a306b168cab2f9c4146cee87009e69f6d',1,'pearl-anglescan-tracker.ipf']]], + ['epics_5fdisconnect',['epics_disconnect',['../pearl-anglescan-tracker_8ipf.html#a4619cb98a75adb3c39ea3a62e524b793',1,'pearl-anglescan-tracker.ipf']]], + ['epics_5fdisconnect_5fchid',['epics_disconnect_chid',['../pearl-anglescan-tracker_8ipf.html#acfe94a64ff3e8c4cb32e34ffb9cae594',1,'pearl-anglescan-tracker.ipf']]], + ['export_5ftracker_5fdata',['export_tracker_data',['../pearl-anglescan-tracker_8ipf.html#a09e95dbf1582fcf2e6f71baddb147f86',1,'pearl-anglescan-tracker.ipf']]], + ['extend_5fdata',['extend_data',['../pearl-anglescan-tracker_8ipf.html#a4bde8b2fc39c61c0d5a6879f1d0ae115',1,'pearl-anglescan-tracker.ipf']]], + ['extract_5fpreview_5fimage',['extract_preview_image',['../pearl-data-explorer_8ipf.html#a0adc1b370fd3bf230b61b094b3c0accb',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/functions_5.html b/doc/html/search/functions_5.html new file mode 100644 index 0000000..9d135fa --- /dev/null +++ b/doc/html/search/functions_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_5.js b/doc/html/search/functions_5.js new file mode 100644 index 0000000..db13a84 --- /dev/null +++ b/doc/html/search/functions_5.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['fermifunclindos2d_5fcorr',['FermiFuncLinDOS2D_corr',['../fermi-edge-analysis_8ipf.html#a520d8de9fbc4276c19fb417861f05b0d',1,'fermi-edge-analysis.ipf']]], + ['fermigaussconv',['FermiGaussConv',['../pearl-fitfuncs_8ipf.html#a4d20215153c0e0cee3870dfceded8bc9',1,'pearl-fitfuncs.ipf']]], + ['find_5fattr_5ffolder',['find_attr_folder',['../pearl-pshell-import_8ipf.html#a41bf534983b0662ec2609b136c395f14',1,'pearl-pshell-import.ipf']]], + ['find_5fhemi_5fdata',['find_hemi_data',['../pearl-anglescan-process_8ipf.html#aa26c9ed4c4d703e07788d980edc2406d',1,'pearl-anglescan-process.ipf']]], + ['find_5fscale_5fwave',['find_scale_wave',['../pearl-pshell-import_8ipf.html#acfb01ee360b66f286225f6e9c7220ba2',1,'pearl-pshell-import.ipf']]], + ['find_5fscan_5ffolder',['find_scan_folder',['../pearl-pshell-import_8ipf.html#a79b968d7439dfbfbc38c05f933071489',1,'pearl-pshell-import.ipf']]], + ['fit_5fdoniachsunjicbroad',['Fit_DoniachSunjicBroad',['../pearl-fitfuncs_8ipf.html#a819902ab9f541b75a0fd33a7b52465d0',1,'pearl-fitfuncs.ipf']]], + ['fit_5fscienta_5fang_5ftransm',['fit_scienta_ang_transm',['../pearl-scienta-preprocess_8ipf.html#a8536a1da8aa85e34370f384ad2ee0d5e',1,'pearl-scienta-preprocess.ipf']]], + ['fit_5fscienta_5fpoly_5fbg',['fit_scienta_poly_bg',['../pearl-scienta-preprocess_8ipf.html#a4f850a816852a1d0e22deaf894765c2c',1,'pearl-scienta-preprocess.ipf']]], + ['format_5furl',['format_url',['../pearl-elog_8ipf.html#a3cc9074c84d684d207dfdf2045755df4',1,'pearl-elog.ipf']]] +]; diff --git a/doc/html/search/functions_6.html b/doc/html/search/functions_6.html new file mode 100644 index 0000000..5fca897 --- /dev/null +++ b/doc/html/search/functions_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_6.js b/doc/html/search/functions_6.js new file mode 100644 index 0000000..eb49752 --- /dev/null +++ b/doc/html/search/functions_6.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['gather_5fbatch',['gather_batch',['../pearl-otf-import_8ipf.html#ae2640256d7d07c11b41621430279cef6',1,'pearl-otf-import.ipf']]], + ['get_5fdefault_5fpanel_5fname',['get_default_panel_name',['../pearl-elog_8ipf.html#a1376b5c9e6b1180a09961bc3296849ae',1,'pearl-elog.ipf']]], + ['get_5felog_5fdf',['get_elog_df',['../pearl-elog_8ipf.html#ac45196cb9ce8b43b76c9daf67689c49a',1,'pearl-elog.ipf']]], + ['get_5fhemi_5fnickname',['get_hemi_nickname',['../pearl-anglescan-process_8ipf.html#a987811346894d8d81fc590b2f5ccec49',1,'pearl-anglescan-process.ipf']]], + ['get_5fhemi_5fprefix',['get_hemi_prefix',['../pearl-anglescan-process_8ipf.html#a1442bc23122d52ba9c77e0f9baaad1da',1,'pearl-anglescan-process.ipf']]], + ['get_5flog_5fpath',['get_log_path',['../pearl-elog_8ipf.html#ad1a72c63f269b2e22b21a72d1ef3b279',1,'pearl-elog.ipf']]], + ['get_5fpanel_5fattributes',['get_panel_attributes',['../pearl-elog_8ipf.html#a66e1200515eff8cd5c961572eccd7220',1,'pearl-elog.ipf']]], + ['get_5fpanel_5fgraphs',['get_panel_graphs',['../pearl-elog_8ipf.html#ace94356f691cbe343761aabd67ced23c',1,'pearl-elog.ipf']]], + ['get_5fpanel_5fmessage',['get_panel_message',['../pearl-elog_8ipf.html#a7ce92b03b6a786129959d44bf1112efa',1,'pearl-elog.ipf']]], + ['get_5fsource_5fimage',['get_source_image',['../pearl-area-display_8ipf.html#a4b76a98582f5997d3810f969dbb6c4ed',1,'pearl-area-display.ipf']]], + ['get_5ftimestamp',['get_timestamp',['../pearl-elog_8ipf.html#a6b2d6cf641c61120332ac1983b2f3846',1,'pearl-elog.ipf']]], + ['get_5fview_5ffolder',['get_view_folder',['../pearl-area-display_8ipf.html#a1bf20e37ed3e9c76be8ebe448c68a048',1,'pearl-area-display.ipf']]], + ['get_5fview_5fimage',['get_view_image',['../pearl-area-display_8ipf.html#a6cc0970b41ca197fa47263556fa2686a',1,'pearl-area-display.ipf']]], + ['getattrdatafolderdfr',['GetAttrDataFolderDFR',['../pearl-area-import_8ipf.html#aa3cdc56096a6a1bf2a2d80a6245a36d2',1,'pearl-area-import.ipf']]], + ['graphname_5ffrom_5fdfref',['graphname_from_dfref',['../pearl-area-display_8ipf.html#a195b12857685c4e535a840c5db324b4a',1,'pearl-area-display.ipf']]] +]; diff --git a/doc/html/search/functions_7.html b/doc/html/search/functions_7.html new file mode 100644 index 0000000..02631a3 --- /dev/null +++ b/doc/html/search/functions_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_7.js b/doc/html/search/functions_7.js new file mode 100644 index 0000000..36fd0ad --- /dev/null +++ b/doc/html/search/functions_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['hemi_5fadd_5fanglescan',['hemi_add_anglescan',['../pearl-anglescan-process_8ipf.html#a4952bc53e3d6d272d25b5e35e91696b5',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fadd_5faziscan',['hemi_add_aziscan',['../pearl-anglescan-process_8ipf.html#a4641c716180d737700c6df87f5f8974e',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fazi_5fcut',['hemi_azi_cut',['../pearl-anglescan-process_8ipf.html#ab6ac1268de338040028dca8d0ddc967c',1,'pearl-anglescan-process.ipf']]], + ['hemi_5fpolar_5fcut',['hemi_polar_cut',['../pearl-anglescan-process_8ipf.html#aa486e16909d01e2251eeb4d635b972b1',1,'pearl-anglescan-process.ipf']]] +]; diff --git a/doc/html/search/functions_8.html b/doc/html/search/functions_8.html new file mode 100644 index 0000000..ff37095 --- /dev/null +++ b/doc/html/search/functions_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_8.js b/doc/html/search/functions_8.js new file mode 100644 index 0000000..7dd5b6e --- /dev/null +++ b/doc/html/search/functions_8.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['igorbeforenewhook',['IgorBeforeNewHook',['../pearl-elog_8ipf.html#ae824bbf81f8b7d16b36b53e3f3d85f69',1,'pearl-elog.ipf']]], + ['igorquithook',['IgorQuitHook',['../pearl-anglescan-tracker_8ipf.html#a0852e59e9018cf3f7e176aa2355b18e3',1,'IgorQuitHook(string app): pearl-anglescan-tracker.ipf'],['../pearl-elog_8ipf.html#a6fcae5eafc97bca9a637bd7800b13e25',1,'IgorQuitHook(string igorApplicationNameStr): pearl-elog.ipf']]], + ['import_5ftpi_5fscan',['import_tpi_scan',['../pearl-anglescan-process_8ipf.html#a5265fd61f86eb72dd877e4190bfb4adf',1,'pearl-anglescan-process.ipf']]], + ['import_5ftracker_5fdata',['import_tracker_data',['../pearl-anglescan-tracker_8ipf.html#ae53e615892fbc39f831b6bd7a0ae242e',1,'pearl-anglescan-tracker.ipf']]], + ['init_5fpackage',['init_package',['../pearl-anglescan-tracker_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725',1,'init_package(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725',1,'init_package(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#a7a4572f4f861f7eb46c932508d1164f9',1,'init_package(variable clean=defaultValue): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#a45e930b8eadd7cf6a5f664befd87d725',1,'init_package(): pearl-matrix-import.ipf']]], + ['init_5fvolatile_5fvars',['init_volatile_vars',['../pearl-elog_8ipf.html#a85cf9d39ea917860b463b1b4111705f2',1,'pearl-elog.ipf']]], + ['initstruct',['initStruct',['../pearl-matrix-import_8ipf.html#af0eaec901e06ce59250eb434539a0f6c',1,'pearl-matrix-import.ipf']]], + ['int_5flinbg_5freduction',['int_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a4e5ae4a68d9caa4710db477d71e2b9e0',1,'pearl-scienta-preprocess.ipf']]], + ['int_5fquadbg_5freduction',['int_quadbg_reduction',['../pearl-scienta-preprocess_8ipf.html#aa5ac074dd3e405d13d3c4401d96e4743',1,'pearl-scienta-preprocess.ipf']]], + ['integrate_5fcurved_5fedge',['integrate_curved_edge',['../fermi-edge-analysis_8ipf.html#a2a1d7b49c1f88f29ee6d49f6a6f4fbf8',1,'fermi-edge-analysis.ipf']]], + ['interpolate_5fhemi_5fscan',['interpolate_hemi_scan',['../pearl-anglescan-process_8ipf.html#a5491cdee24910f6bad0d3af3c70f888b',1,'pearl-anglescan-process.ipf']]], + ['iteratedatafolders',['IterateDataFolders',['../pearl-tools_8ipf.html#a7c5307e5e7c0202d2b088fdc11887069',1,'pearl-tools.ipf']]], + ['iteratewaves',['IterateWaves',['../pearl-tools_8ipf.html#aabc250f68dd85ca58d7be5077255af99',1,'pearl-tools.ipf']]], + ['itx_5fsuggest_5ffoldername',['itx_suggest_foldername',['../pearl-data-explorer_8ipf.html#a6b5e9729ee6dedbb217c741639a168ed',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/functions_9.html b/doc/html/search/functions_9.html new file mode 100644 index 0000000..1d34583 --- /dev/null +++ b/doc/html/search/functions_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_9.js b/doc/html/search/functions_9.js new file mode 100644 index 0000000..2e20fd4 --- /dev/null +++ b/doc/html/search/functions_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['kill_5fprogress_5fpanel',['kill_progress_panel',['../pearl-gui-tools_8ipf.html#aca0a41a0f28a35ac7535df30ddbd79fe',1,'pearl-gui-tools.ipf']]] +]; diff --git a/doc/html/search/functions_a.html b/doc/html/search/functions_a.html new file mode 100644 index 0000000..8eb5e56 --- /dev/null +++ b/doc/html/search/functions_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_a.js b/doc/html/search/functions_a.js new file mode 100644 index 0000000..a5fb344 --- /dev/null +++ b/doc/html/search/functions_a.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['lbp_5fdatasets',['lbp_datasets',['../pearl-data-explorer_8ipf.html#a8ec37ab6c651003957d7e1ba728de89e',1,'pearl-data-explorer.ipf']]], + ['lbp_5ffilelist',['lbp_filelist',['../pearl-data-explorer_8ipf.html#a614e89b9c06511144ccb380e61cc7bd6',1,'pearl-data-explorer.ipf']]], + ['line_5faverage',['line_average',['../pearl-anglescan-process_8ipf.html#aa54a550eccad2c8ccd82d2b4167f7a92',1,'pearl-anglescan-process.ipf']]], + ['list_5flogbooks',['list_logbooks',['../pearl-elog_8ipf.html#a356bebea8eb41c9ac3ea2148af22707f',1,'pearl-elog.ipf']]], + ['load_5ffile',['load_file',['../pearl-data-explorer_8ipf.html#a1bbf3e1592f3344f3628526fa549dfdf',1,'pearl-data-explorer.ipf']]], + ['load_5fhdf_5ffile',['load_hdf_file',['../pearl-data-explorer_8ipf.html#a0c839d5f8f49e6937a6532bba3ef3714',1,'pearl-data-explorer.ipf']]], + ['load_5fhemi_5fscan',['load_hemi_scan',['../pearl-anglescan-process_8ipf.html#a89f73edcd51a675f4c3933cd0242484e',1,'pearl-anglescan-process.ipf']]], + ['load_5fitx_5ffile',['load_itx_file',['../pearl-data-explorer_8ipf.html#a26f2f2bf5efc39dabb2a01abcc559e3e',1,'pearl-data-explorer.ipf']]], + ['load_5fmtrx_5ffile',['load_mtrx_file',['../pearl-data-explorer_8ipf.html#a98e327fa65bbcb3cd7c97545f7201afe',1,'pearl-data-explorer.ipf']]], + ['load_5fprefs',['load_prefs',['../pearl-anglescan-tracker_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3',1,'load_prefs(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3',1,'load_prefs(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#a92c27964d49ab8bcd7afc858ebe214a3',1,'load_prefs(): pearl-elog.ipf']]], + ['load_5fpshell_5ffile',['load_pshell_file',['../pearl-data-explorer_8ipf.html#a74c69e870329c5dd3b08f92bdeb21d87',1,'pearl-data-explorer.ipf']]], + ['load_5fselected_5ffiles',['load_selected_files',['../pearl-data-explorer_8ipf.html#a2178d5acf21fe4372ecc06224bec28ba',1,'pearl-data-explorer.ipf']]], + ['load_5ftracker_5fdata',['load_tracker_data',['../pearl-anglescan-tracker_8ipf.html#a3882038c0ad82396b6591fd756817535',1,'pearl-anglescan-tracker.ipf']]], + ['loadpearlarpes',['LoadPearlArpes',['../pearl-menu_8ipf.html#aa70ef420d6fe0f6a433cd2371fc4a03d',1,'pearl-menu.ipf']]], + ['loadpearloptics',['LoadPearlOptics',['../pearl-menu_8ipf.html#af6c9740540c6242eb7bf57fc49de82ab',1,'pearl-menu.ipf']]], + ['loadpearlpreparation',['LoadPearlPreparation',['../pearl-menu_8ipf.html#a3658ae687e12987fa1d70636849a060f',1,'pearl-menu.ipf']]] +]; diff --git a/doc/html/search/functions_b.html b/doc/html/search/functions_b.html new file mode 100644 index 0000000..fa9cff5 --- /dev/null +++ b/doc/html/search/functions_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_b.js b/doc/html/search/functions_b.js new file mode 100644 index 0000000..a630c76 --- /dev/null +++ b/doc/html/search/functions_b.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['make_5fhemi_5fgrid',['make_hemi_grid',['../pearl-anglescan-process_8ipf.html#a902ac3a24e33f651e83ee03d31707da7',1,'pearl-anglescan-process.ipf']]], + ['make_5fview_5ffolder',['make_view_folder',['../pearl-area-display_8ipf.html#a2b183a27ec795b0ec1f8efabe3068369',1,'pearl-area-display.ipf']]], + ['matrix_5fformat_5felog_5fmessage',['matrix_format_elog_message',['../pearl-matrix-import_8ipf.html#a81b1d81261a32d0ed4cf79b81487f1b4',1,'pearl-matrix-import.ipf']]], + ['matrix_5fpreview_5f2d',['matrix_preview_2d',['../pearl-matrix-import_8ipf.html#a856478705a78e8105ea5d91a2228975b',1,'pearl-matrix-import.ipf']]], + ['move_5fattach_5fitem',['move_attach_item',['../pearl-elog_8ipf.html#a7990f2948d48aefe990271d1961df833',1,'pearl-elog.ipf']]], + ['mtrx_5fcreate_5ffolder',['mtrx_create_folder',['../pearl-matrix-import_8ipf.html#a893405a122fdf70429f4f75b8877ed7d',1,'pearl-matrix-import.ipf']]], + ['mtrx_5ffile_5fbrickletid',['mtrx_file_brickletID',['../pearl-matrix-import_8ipf.html#ad74d5afa71179728a9237d1ec5884482',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fget_5fcycle_5ffolder',['mtrx_get_cycle_folder',['../pearl-matrix-import_8ipf.html#a1a46b042e41daffee61706ab2cf54351',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5fall',['mtrx_load_all',['../pearl-matrix-import_8ipf.html#a6ac0c685976b0e0c1944fb616a4f3a3c',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5ffile',['mtrx_load_file',['../pearl-matrix-import_8ipf.html#a6aeef317fd468c88c99a274338c70ae3',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5finfo',['mtrx_load_info',['../pearl-matrix-import_8ipf.html#a3a0ba4a7ad64739303b705d92be53267',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fload_5fpreview',['mtrx_load_preview',['../pearl-matrix-import_8ipf.html#abd09594d22038853e1e8021e0f36363d',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fopen_5ffile',['mtrx_open_file',['../pearl-matrix-import_8ipf.html#a59e72c849f4314aaa8339fd899665d85',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fparse_5ffilename',['mtrx_parse_filename',['../pearl-matrix-import_8ipf.html#a4bfeaf81ac483df0a38b26b6a8cf74a6',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fscale_5fdataset',['mtrx_scale_dataset',['../pearl-matrix-import_8ipf.html#ad8532f1473f92539fe88217d5d6e3368',1,'pearl-matrix-import.ipf']]], + ['mtrx_5fsplit_5ffilename',['mtrx_split_filename',['../pearl-matrix-import_8ipf.html#a0dc1efa23739e10b7558543b166e95b9',1,'pearl-matrix-import.ipf']]] +]; diff --git a/doc/html/search/functions_c.html b/doc/html/search/functions_c.html new file mode 100644 index 0000000..fce7a6b --- /dev/null +++ b/doc/html/search/functions_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_c.js b/doc/html/search/functions_c.js new file mode 100644 index 0000000..e6e7166 --- /dev/null +++ b/doc/html/search/functions_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['normalize_5fstrip_5f2d',['normalize_strip_2d',['../pearl-anglescan-process_8ipf.html#ac617c3b400488b656493af8ca08f1791',1,'pearl-anglescan-process.ipf']]], + ['normalize_5fstrip_5ftheta',['normalize_strip_theta',['../pearl-anglescan-process_8ipf.html#a9b56897bd92d926d65f4c67bef1d41bb',1,'pearl-anglescan-process.ipf']]], + ['normalize_5fstrip_5fx',['normalize_strip_x',['../pearl-anglescan-process_8ipf.html#a48b7d774ed8d3f4329e9923e18e580e8',1,'pearl-anglescan-process.ipf']]], + ['notebook_5fadd_5fattributes',['notebook_add_attributes',['../pearl-data-explorer_8ipf.html#a0c162346b59b0f66d34ee26ce5fe1e52',1,'pearl-data-explorer.ipf']]] +]; diff --git a/doc/html/search/functions_d.html b/doc/html/search/functions_d.html new file mode 100644 index 0000000..82b2b0c --- /dev/null +++ b/doc/html/search/functions_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_d.js b/doc/html/search/functions_d.js new file mode 100644 index 0000000..8a3fda7 --- /dev/null +++ b/doc/html/search/functions_d.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['otf_5fgather_5fbatch',['otf_gather_batch',['../pearl-otf-import_8ipf.html#ad2a83b85030a7d7769d434d6e2e9e557',1,'pearl-otf-import.ipf']]], + ['otf_5fgather_5fiterator',['otf_gather_iterator',['../pearl-otf-import_8ipf.html#a44078e1d8f26e515539acb96973fc630',1,'pearl-otf-import.ipf']]], + ['otf_5finterp',['otf_interp',['../pearl-otf-import_8ipf.html#abd8897317366046dfb97c6ca53813d18',1,'pearl-otf-import.ipf']]], + ['otf_5fload_5fitx',['otf_load_itx',['../pearl-otf-import_8ipf.html#a3632f8a5c0ee32a14a3e589b74a0c496',1,'pearl-otf-import.ipf']]], + ['otf_5fload_5fitx_5fall',['otf_load_itx_all',['../pearl-otf-import_8ipf.html#a603b71176ed838713ec555c440082e22',1,'pearl-otf-import.ipf']]], + ['otf_5fload_5fitx_5fmatch',['otf_load_itx_match',['../pearl-otf-import_8ipf.html#aa47fc4b956ee84a993b6d285b628fe20',1,'pearl-otf-import.ipf']]], + ['otf_5frename_5ffolders',['otf_rename_folders',['../pearl-otf-import_8ipf.html#a715f9cf2d2b1ffb04f2f9a0e344a80ee',1,'pearl-otf-import.ipf']]], + ['otf_5frename_5ffolders_5fiterator',['otf_rename_folders_iterator',['../pearl-otf-import_8ipf.html#a882da254075e8d89f0117e491af90df0',1,'pearl-otf-import.ipf']]], + ['otf_5fsmo_5fint',['otf_smo_int',['../pearl-otf-import_8ipf.html#aba965b854836658aa00e3ec2b361d7c9',1,'pearl-otf-import.ipf']]] +]; diff --git a/doc/html/search/functions_e.html b/doc/html/search/functions_e.html new file mode 100644 index 0000000..557ae9a --- /dev/null +++ b/doc/html/search/functions_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_e.js b/doc/html/search/functions_e.js new file mode 100644 index 0000000..7d587a7 --- /dev/null +++ b/doc/html/search/functions_e.js @@ -0,0 +1,70 @@ +var searchData= +[ + ['parse_5fresult',['parse_result',['../pearl-elog_8ipf.html#a5306514bf7d1a582aec146256ae45a12',1,'pearl-elog.ipf']]], + ['pearl_5fdata_5fexplorer',['pearl_data_explorer',['../pearl-data-explorer_8ipf.html#ab7e3b3a0a901f7559ee9f5affb9a6fca',1,'pearl-data-explorer.ipf']]], + ['pearl_5felog',['pearl_elog',['../pearl-elog_8ipf.html#a4088a48a8428629f120c08a419af62d6',1,'pearl-elog.ipf']]], + ['pearl_5ffile_5ftype',['pearl_file_type',['../pearl-data-explorer_8ipf.html#a8a923d7095071e7e6f99018379807732',1,'pearl-data-explorer.ipf']]], + ['pearlanglescantracker',['PearlAnglescanTracker',['../pearl-menu_8ipf.html#a74bc5da7843ee6c25f2d9c93d22a6ffa',1,'pearl-menu.ipf']]], + ['pearldataexplorer',['PearlDataExplorer',['../pearl-data-explorer_8ipf.html#a5b824531904179a94e0eaa3ffa09172e',1,'pearl-data-explorer.ipf']]], + ['pearlelogpanel',['PearlElogPanel',['../pearl-elog_8ipf.html#a6da33f1bb2639cb912e9b25af25bf663',1,'pearl-elog.ipf']]], + ['pearllivedisplay',['PearlLiveDisplay',['../pearl-menu_8ipf.html#a61ded60be72959b00f22842afa37c56f',1,'pearl-menu.ipf']]], + ['pearlmenuenablefunc',['PearlMenuEnableFunc',['../pearl-menu_8ipf.html#a3404a53bf13a01c1e811d1af6c35b726',1,'pearl-menu.ipf']]], + ['pizza_5fservice',['pizza_service',['../pearl-anglescan-process_8ipf.html#afed227ae79873fd32c96afbf606d1965',1,'pearl-anglescan-process.ipf']]], + ['pizza_5fservice_5f2',['pizza_service_2',['../pearl-anglescan-process_8ipf.html#a229770447193d4fd12032b235aab4d28',1,'pearl-anglescan-process.ipf']]], + ['pmp_5fdata',['pmp_data',['../pearl-anglescan-tracker_8ipf.html#a07efc5d6a7121540cc185c251353677c',1,'pearl-anglescan-tracker.ipf']]], + ['pmp_5fdata_5fmouseup',['pmp_data_mouseup',['../pearl-anglescan-tracker_8ipf.html#a4dad34b0481be20234fa5e8d25b262c4',1,'pearl-anglescan-tracker.ipf']]], + ['pmp_5fexport',['pmp_export',['../pearl-area-display_8ipf.html#ac5c7a25e9a8c0b001a429bae23639da9',1,'pearl-area-display.ipf']]], + ['pmp_5fparameters',['pmp_parameters',['../pearl-anglescan-tracker_8ipf.html#a6d484e3bb5f8c18d3b2910e8346b2c17',1,'pearl-anglescan-tracker.ipf']]], + ['pmp_5fparameters_5fmouseup',['pmp_parameters_mouseup',['../pearl-anglescan-tracker_8ipf.html#ad06e1354226f4f617ad0a8d6d7572dca',1,'pearl-anglescan-tracker.ipf']]], + ['polar2cart',['polar2cart',['../pearl-polar-coordinates_8ipf.html#a94ccfa9cf52c55eb1f66c2704478c396',1,'pearl-polar-coordinates.ipf']]], + ['polar2cart_5fwave',['polar2cart_wave',['../pearl-polar-coordinates_8ipf.html#a6a0ffb6b9160413d9694b1fd8e10c858',1,'pearl-polar-coordinates.ipf']]], + ['polar_5fdistance',['polar_distance',['../pearl-polar-coordinates_8ipf.html#a58139e6ebfba242b6b2ba3533b865a9a',1,'pearl-polar-coordinates.ipf']]], + ['polar_5fgraph_5fhook',['polar_graph_hook',['../pearl-anglescan-process_8ipf.html#ac4dbd1ece37b2cf22fa976a153977288',1,'pearl-anglescan-process.ipf']]], + ['prepare_5fcommand_5fline',['prepare_command_line',['../pearl-elog_8ipf.html#abd15431defaec6d770cc8cab2a40e6b0',1,'pearl-elog.ipf']]], + ['prepare_5fgraph_5fattachments',['prepare_graph_attachments',['../pearl-elog_8ipf.html#a4986de01085dc5481500240ef7667419',1,'pearl-elog.ipf']]], + ['preview_5fattributes',['preview_attributes',['../pearl-data-explorer_8ipf.html#a415e4867be1ee37d84fd609b06f6dcb8',1,'pearl-data-explorer.ipf']]], + ['preview_5fdatafolder',['preview_datafolder',['../pearl-data-explorer_8ipf.html#a6e8eaf8c092f5da60bd425f9bd8bf178',1,'pearl-data-explorer.ipf']]], + ['preview_5fdataset',['preview_dataset',['../pearl-data-explorer_8ipf.html#a68d38e9464f7d13520ec040cffdf5c3b',1,'pearl-data-explorer.ipf']]], + ['preview_5ffile',['preview_file',['../pearl-data-explorer_8ipf.html#a3232c51a8c19eaf86b9bc67352967a9f',1,'pearl-data-explorer.ipf']]], + ['preview_5fhdf_5ffile',['preview_hdf_file',['../pearl-data-explorer_8ipf.html#a1731f8e1507d90e285885723ae32ba13',1,'pearl-data-explorer.ipf']]], + ['preview_5fitx_5ffile',['preview_itx_file',['../pearl-data-explorer_8ipf.html#a4633885afab755fbc5d262178b9ddcb8',1,'pearl-data-explorer.ipf']]], + ['preview_5fmatrix_5ffile',['preview_matrix_file',['../pearl-matrix-import_8ipf.html#a8acd2b03343ef9bdfecaa75e831392d1',1,'pearl-matrix-import.ipf']]], + ['preview_5fmtrx_5ffile',['preview_mtrx_file',['../pearl-data-explorer_8ipf.html#a340f334c6caa966ee1eb891614e57b5b',1,'pearl-data-explorer.ipf']]], + ['preview_5fpshell_5ffile',['preview_pshell_file',['../pearl-data-explorer_8ipf.html#a457d2257ffd5880ab858fa583a5d1c99',1,'pearl-data-explorer.ipf']]], + ['preview_5fsetscale_5fx',['preview_setscale_x',['../pearl-data-explorer_8ipf.html#a5a7d3c00360944c00f236900b992694d',1,'pearl-data-explorer.ipf']]], + ['process_5fimage_5fdata',['process_image_data',['../pearl-anglescan-tracker_8ipf.html#a4bc40cded4d4d7676b084f7200ca5e0d',1,'pearl-anglescan-tracker.ipf']]], + ['prompt_5fdefault_5fprocess',['prompt_default_process',['../pearl-data-explorer_8ipf.html#a505ebda6bdecc4120e01766d7aedaf5d',1,'pearl-data-explorer.ipf']]], + ['prompt_5ffunc_5fparams',['prompt_func_params',['../pearl-data-explorer_8ipf.html#a1d7f4ad59b81ecd84bb63cfabd9f24dc',1,'pearl-data-explorer.ipf']]], + ['prompt_5fhdf_5foptions',['prompt_hdf_options',['../pearl-data-explorer_8ipf.html#a200e7ba052fbce4614fb4254701646ab',1,'pearl-data-explorer.ipf']]], + ['prompt_5fint_5flinbg_5freduction',['prompt_int_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a145c7275b8809c5e789b932ef46e4811',1,'pearl-scienta-preprocess.ipf']]], + ['prompt_5fint_5fquadbg_5freduction',['prompt_int_quadbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a6d06ea5a11ba79160efeea7fe673af8c',1,'pearl-scienta-preprocess.ipf']]], + ['prompt_5fredim_5flinbg_5freduction',['prompt_redim_linbg_reduction',['../pearl-scienta-preprocess_8ipf.html#a6e7de6441bbcba217760448babaca827',1,'pearl-scienta-preprocess.ipf']]], + ['prompt_5fshockley_5fanglefit',['prompt_Shockley_anglefit',['../pearl-scienta-preprocess_8ipf.html#ab3e0823a6ec7d85e08276cd32d0ffd21',1,'pearl-scienta-preprocess.ipf']]], + ['ps_5fdetect_5fscale',['ps_detect_scale',['../pearl-pshell-import_8ipf.html#acba7f4b98f67cc112c02dfeefe3e5acd',1,'pearl-pshell-import.ipf']]], + ['ps_5fscale_5fdataset',['ps_scale_dataset',['../pearl-pshell-import_8ipf.html#adc11ea797562b3d99c247f4866618d39',1,'pearl-pshell-import.ipf']]], + ['ps_5fscale_5fdataset_5f2',['ps_scale_dataset_2',['../pearl-pshell-import_8ipf.html#a2c456397c36d4116bfddca452eff5954',1,'pearl-pshell-import.ipf']]], + ['ps_5fscale_5fdatasets',['ps_scale_datasets',['../pearl-pshell-import_8ipf.html#af08a467036c64f70ca3dfe644fcc457c',1,'pearl-pshell-import.ipf']]], + ['ps_5fset_5fdimlabels',['ps_set_dimlabels',['../pearl-pshell-import_8ipf.html#aba25eb98e4c6cc9066c46ef6be1cde15',1,'pearl-pshell-import.ipf']]], + ['ps_5fset_5fdimlabels2',['ps_set_dimlabels2',['../pearl-pshell-import_8ipf.html#a8704627410409bcd27a1adeda4082c47',1,'pearl-pshell-import.ipf']]], + ['psh5_5fclose_5ffile',['psh5_close_file',['../pearl-pshell-import_8ipf.html#a2fc497747287d6fe40c6de997ed4a90d',1,'pearl-pshell-import.ipf']]], + ['psh5_5flist_5fscan_5fdatasets',['psh5_list_scan_datasets',['../pearl-pshell-import_8ipf.html#a4508bd507c4c935bd8463d9b2b84c6fc',1,'pearl-pshell-import.ipf']]], + ['psh5_5flist_5fscan_5fregions',['psh5_list_scan_regions',['../pearl-pshell-import_8ipf.html#acb317b57ef137d4d5da5938013dbe442',1,'pearl-pshell-import.ipf']]], + ['psh5_5flist_5fscans',['psh5_list_scans',['../pearl-pshell-import_8ipf.html#a2152f7c39a187b740cf9890767ffac3f',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fcomplete',['psh5_load_complete',['../pearl-pshell-import_8ipf.html#a8a5ce6c2767607de194b4c148ee98c27',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset',['psh5_load_dataset',['../pearl-pshell-import_8ipf.html#ac4dfb90b951d29b56501e904f5cc38aa',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5fmeta',['psh5_load_dataset_meta',['../pearl-pshell-import_8ipf.html#afde787a00a18dc8c63b100d8ac7d992f',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5freduced',['psh5_load_dataset_reduced',['../pearl-pshell-import_8ipf.html#a13a45e8618c1ab7406e1aa5e608e21fe',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5fslab',['psh5_load_dataset_slab',['../pearl-pshell-import_8ipf.html#a035a4df9f4508144149abdb0b46c87d1',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fdataset_5fslabs',['psh5_load_dataset_slabs',['../pearl-pshell-import_8ipf.html#a2972587ec82cc2a261b8119a582b4215',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5finfo',['psh5_load_info',['../pearl-pshell-import_8ipf.html#aa14b28120a07a8213e5a692930704a4b',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fpreview',['psh5_load_preview',['../pearl-pshell-import_8ipf.html#a8ab28d3f4ef308e33b8701e44172dbf8',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5freduced',['psh5_load_reduced',['../pearl-pshell-import_8ipf.html#a1444648f9a49e7d7aeef5b5fb55594aa',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fattrs',['psh5_load_scan_attrs',['../pearl-pshell-import_8ipf.html#aec191d0167bbf606d24396f4658104b5',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fcomplete',['psh5_load_scan_complete',['../pearl-pshell-import_8ipf.html#a0a02f87e19e825964aa17c46ed51df8c',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fdata',['psh5_load_scan_data',['../pearl-pshell-import_8ipf.html#ad26b0b56d7ccd23547535091c9430569',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5finfo',['psh5_load_scan_info',['../pearl-pshell-import_8ipf.html#a79ac37bb666b42c3332e9984196ccfe7',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fmeta',['psh5_load_scan_meta',['../pearl-pshell-import_8ipf.html#aa56c25d64b3e59f74d6dd92a599cce4f',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fpreview',['psh5_load_scan_preview',['../pearl-pshell-import_8ipf.html#ad3b9354b137ba4f1bc3ed2e74f24dc88',1,'pearl-pshell-import.ipf']]], + ['psh5_5fload_5fscan_5fsection',['psh5_load_scan_section',['../pearl-pshell-import_8ipf.html#a83804ba9637debed6ef8b13e7b9b19e0',1,'pearl-pshell-import.ipf']]], + ['psh5_5fopen_5ffile',['psh5_open_file',['../pearl-pshell-import_8ipf.html#accc20b0fc6bda95ba0cd0aea6633086f',1,'pearl-pshell-import.ipf']]] +]; diff --git a/doc/html/search/functions_f.html b/doc/html/search/functions_f.html new file mode 100644 index 0000000..b27fb7d --- /dev/null +++ b/doc/html/search/functions_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_f.js b/doc/html/search/functions_f.js new file mode 100644 index 0000000..676dec0 --- /dev/null +++ b/doc/html/search/functions_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['quick_5fpizza_5fimage',['quick_pizza_image',['../pearl-anglescan-process_8ipf.html#a0b9e2b025e1d55d2a064edccf6c1c3e3',1,'pearl-anglescan-process.ipf']]] +]; diff --git a/doc/html/search/groups_0.html b/doc/html/search/groups_0.html new file mode 100644 index 0000000..95cee43 --- /dev/null +++ b/doc/html/search/groups_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/groups_0.js b/doc/html/search/groups_0.js new file mode 100644 index 0000000..00ee40e --- /dev/null +++ b/doc/html/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['arpes_20package',['ARPES package',['../group___arpes_package.html',1,'']]] +]; diff --git a/doc/html/search/groups_1.html b/doc/html/search/groups_1.html new file mode 100644 index 0000000..a29a81d --- /dev/null +++ b/doc/html/search/groups_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/groups_1.js b/doc/html/search/groups_1.js new file mode 100644 index 0000000..58e23e7 --- /dev/null +++ b/doc/html/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sample_20preparation_20package',['Sample preparation package',['../group___preparation_package.html',1,'']]] +]; diff --git a/doc/html/search/mag_sel.png b/doc/html/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..81f6040a2092402b4d98f9ffa8855d12a0d4ca17 GIT binary patch literal 563 zcmV-30?hr1P)zxx&tqG15pu7)IiiXFflOc2k;dXd>%13GZAy? zRz!q0=|E6a6vV)&ZBS~G9oe0kbqyw1*gvY`{Pop2oKq#FlzgXt@Xh-7fxh>}`Fxg> z$%N%{$!4=5nM{(;=c!aG1Ofr^Do{u%Ih{^&Fc@H2)+a-?TBXrw5DW&z%Nb6mQ!L9O zl}b@6mB?f=tX3;#vl)}ggh(Vpyh(IK z(Mb0D{l{U$FsRjP;!{($+bsaaVi8T#1c0V#qEIOCYa9@UVLV`f__E81L;?WEaRA;Y zUH;rZ;vb;mk7JX|$=i3O~&If0O@oZfLg8gfIjW=dcBsz;gI=!{-r4# z4%6v$&~;q^j7Fo67yJ(NJWuX+I~I!tj^nW3?}^9bq|<3^+vapS5sgM^x7!cs(+mMT z&y%j};&~po+YO)3hoUH4E*E;e9>?R6SS&`X)p`njycAVcg{rEb41T{~Hk(bl-7eSb zmFxA2uIqo#@R?lKm50ND`~6Nfn|-b1|L6O98vt3Tx@gKz#isxO002ovPDHLkV1kyW B_l^Jn literal 0 HcmV?d00001 diff --git a/doc/html/search/namespaces_0.html b/doc/html/search/namespaces_0.html new file mode 100644 index 0000000..f1b59ec --- /dev/null +++ b/doc/html/search/namespaces_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/namespaces_0.js b/doc/html/search/namespaces_0.js new file mode 100644 index 0000000..5e0a843 --- /dev/null +++ b/doc/html/search/namespaces_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['pearlanglescanprocess',['PearlAnglescanProcess',['../namespace_pearl_anglescan_process.html',1,'']]], + ['pearlareadisplay',['PearlAreaDisplay',['../namespace_pearl_area_display.html',1,'']]], + ['pearlareaimport',['PearlAreaImport',['../namespace_pearl_area_import.html',1,'']]], + ['pearlareaprofiles',['PearlAreaProfiles',['../namespace_pearl_area_profiles.html',1,'']]], + ['pearlarpes',['PearlArpes',['../namespace_pearl_arpes.html',1,'']]], + ['pearldataexplorer',['PearlDataExplorer',['../namespace_pearl_data_explorer.html',1,'']]], + ['pearlelog',['PearlElog',['../namespace_pearl_elog.html',1,'']]], + ['pearlmatriximport',['PearlMatrixImport',['../namespace_pearl_matrix_import.html',1,'']]], + ['pearlpshellimport',['PearlPShellImport',['../namespace_pearl_p_shell_import.html',1,'']]], + ['pearlscientapreprocess',['PearlScientaPreprocess',['../namespace_pearl_scienta_preprocess.html',1,'']]] +]; diff --git a/doc/html/search/nomatches.html b/doc/html/search/nomatches.html new file mode 100644 index 0000000..b1ded27 --- /dev/null +++ b/doc/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/doc/html/search/pages_0.html b/doc/html/search/pages_0.html new file mode 100644 index 0000000..0db7267 --- /dev/null +++ b/doc/html/search/pages_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/pages_0.js b/doc/html/search/pages_0.js new file mode 100644 index 0000000..7cf7879 --- /dev/null +++ b/doc/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['introduction',['Introduction',['../index.html',1,'']]] +]; diff --git a/doc/html/search/pages_1.html b/doc/html/search/pages_1.html new file mode 100644 index 0000000..2c67a8e --- /dev/null +++ b/doc/html/search/pages_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/pages_1.js b/doc/html/search/pages_1.js new file mode 100644 index 0000000..1d460e2 --- /dev/null +++ b/doc/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['projections',['Projections',['../PageProjections.html',1,'']]] +]; diff --git a/doc/html/search/pages_2.html b/doc/html/search/pages_2.html new file mode 100644 index 0000000..9cb4325 --- /dev/null +++ b/doc/html/search/pages_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/pages_2.js b/doc/html/search/pages_2.js new file mode 100644 index 0000000..441b2de --- /dev/null +++ b/doc/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['todo_20list',['Todo List',['../todo.html',1,'']]] +]; diff --git a/doc/html/search/search.css b/doc/html/search/search.css new file mode 100644 index 0000000..4d7612f --- /dev/null +++ b/doc/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + position: absolute; + float: none; + display: inline; + margin-top: 8px; + right: 0px; + width: 170px; + z-index: 102; + background-color: white; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:111px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:0px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/html/search/search.js b/doc/html/search/search.js new file mode 100644 index 0000000..dedce3b --- /dev/null +++ b/doc/html/search/search.js @@ -0,0 +1,791 @@ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; ek7RCwB~R6VQOP#AvB$vH7i{6H{96zot$7cZT<7246EF5Np6N}+$IbiG6W zg#87A+NFaX+=_^xM1#gCtshC=E{%9^uQX_%?YwXvo{#q&MnpJ8uh(O?ZRc&~_1%^SsPxG@rfElJg-?U zm!Cz-IOn(qJP3kDp-^~qt+FGbl=5jNli^Wj_xIBG{Rc0en{!oFvyoNC7{V~T8}b>| z=jL2WIReZzX(YN(_9fV;BBD$VXQIxNasAL8ATvEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/doc/html/search/search_r.png b/doc/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..97ee8b439687084201b79c6f776a41f495c6392a GIT binary patch literal 612 zcmV-q0-ODbP)PbXFRCwB?)W514K@j&X?z2*SxFI6-@HT2E2K=9X9%Pb zEK*!TBw&g(DMC;|A)uGlRkOS9vd-?zNs%bR4d$w+ox_iFnE8fvIvv7^5<(>Te12Li z7C)9srCzmK{ZcNM{YIl9j{DePFgOWiS%xG@5CnnnJa4nvY<^glbz7^|-ZY!dUkAwd z{gaTC@_>b5h~;ug#R0wRL0>o5!hxm*s0VW?8dr}O#zXTRTnrQm_Z7z1Mrnx>&p zD4qifUjzLvbVVWi?l?rUzwt^sdb~d!f_LEhsRVIXZtQ=qSxuxqm zEX#tf>$?M_Y1-LSDT)HqG?`%-%ZpY!#{N!rcNIiL;G7F0`l?)mNGTD9;f9F5Up3Kg zw}a<-JylhG&;=!>B+fZaCX+?C+kHYrP%c?X2!Zu_olK|GcS4A70HEy;vn)I0>0kLH z`jc(WIaaHc7!HS@f*^R^Znx8W=_jIl2oWJoQ*h1^$FX!>*PqR1J8k|fw}w_y}TpE>7m8DqDO<3z`OzXt$ccSejbEZCg@0000 + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_0.js b/doc/html/search/variables_0.js new file mode 100644 index 0000000..3ea3b0e --- /dev/null +++ b/doc/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['already_5ffile_5fopen',['ALREADY_FILE_OPEN',['../structerror_code.html#a19dc49bdfb4bd9601f17f907da158026',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_1.html b/doc/html/search/variables_1.html new file mode 100644 index 0000000..3c65cf2 --- /dev/null +++ b/doc/html/search/variables_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_1.js b/doc/html/search/variables_1.js new file mode 100644 index 0000000..bb7f2da --- /dev/null +++ b/doc/html/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['broadening',['broadening',['../struct_doniach_sunjic_struct.html#ac9b18c8b44b43c2ee438f37f8d002a66',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_10.html b/doc/html/search/variables_10.html new file mode 100644 index 0000000..52b5fe8 --- /dev/null +++ b/doc/html/search/variables_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_10.js b/doc/html/search/variables_10.js new file mode 100644 index 0000000..7ff7b6f --- /dev/null +++ b/doc/html/search/variables_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xdw',['xdw',['../struct_doniach_sunjic_struct.html#a750e7260bf5d4c936dadde714fb2db52',1,'DoniachSunjicStruct']]], + ['xw',['xw',['../struct_doniach_sunjic_struct.html#a45c3a3fa68850032e545907ca65ab982',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_11.html b/doc/html/search/variables_11.html new file mode 100644 index 0000000..476f36e --- /dev/null +++ b/doc/html/search/variables_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_11.js b/doc/html/search/variables_11.js new file mode 100644 index 0000000..246bc4f --- /dev/null +++ b/doc/html/search/variables_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['yw',['yw',['../struct_doniach_sunjic_struct.html#a6cef648ad0cf4be1dd9fbe33ff5df1eb',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_2.html b/doc/html/search/variables_2.html new file mode 100644 index 0000000..7b43e0a --- /dev/null +++ b/doc/html/search/variables_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_2.js b/doc/html/search/variables_2.js new file mode 100644 index 0000000..a0bbba2 --- /dev/null +++ b/doc/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['convolution',['convolution',['../struct_doniach_sunjic_struct.html#a7f05f7827435fea3c986a8d538496955',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_3.html b/doc/html/search/variables_3.html new file mode 100644 index 0000000..ea0392d --- /dev/null +++ b/doc/html/search/variables_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_3.js b/doc/html/search/variables_3.js new file mode 100644 index 0000000..40890e0 --- /dev/null +++ b/doc/html/search/variables_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['elog_5fparse_5fid',['elog_parse_id',['../pearl-elog_8ipf.html#a6a9923c6465c91b1f9d1d97b090f424b',1,'pearl-elog.ipf']]], + ['elog_5fsuccess_5fmsg',['elog_success_msg',['../pearl-elog_8ipf.html#a63aa38b624b66fe502505040c25bc0c3',1,'pearl-elog.ipf']]], + ['empty_5fresultfile',['EMPTY_RESULTFILE',['../structerror_code.html#ab7f29ef2ba8497c55f2bc55c4b9fc186',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_4.html b/doc/html/search/variables_4.html new file mode 100644 index 0000000..1ed95cb --- /dev/null +++ b/doc/html/search/variables_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_4.js b/doc/html/search/variables_4.js new file mode 100644 index 0000000..8d1f5fa --- /dev/null +++ b/doc/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['file_5fnot_5freadable',['FILE_NOT_READABLE',['../structerror_code.html#a71ce7c0413c44515d9570dab1ffd5ffd',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_5.html b/doc/html/search/variables_5.html new file mode 100644 index 0000000..ecc883b --- /dev/null +++ b/doc/html/search/variables_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_5.js b/doc/html/search/variables_5.js new file mode 100644 index 0000000..41a5336 --- /dev/null +++ b/doc/html/search/variables_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hemi_5fradius_5fmm',['hemi_radius_mm',['../fermi-edge-analysis_8ipf.html#a0cb8da36beae05c79fe5b1da918d3897',1,'fermi-edge-analysis.ipf']]] +]; diff --git a/doc/html/search/variables_6.html b/doc/html/search/variables_6.html new file mode 100644 index 0000000..0c1a66b --- /dev/null +++ b/doc/html/search/variables_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_6.js b/doc/html/search/variables_6.js new file mode 100644 index 0000000..a9f05aa --- /dev/null +++ b/doc/html/search/variables_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['internal_5ferror_5fconverting_5fdata',['INTERNAL_ERROR_CONVERTING_DATA',['../structerror_code.html#afb49d1cffe8e7590892b018ac9e648cc',1,'errorCode']]], + ['invalid_5frange',['INVALID_RANGE',['../structerror_code.html#a5477920df1edcc7a1af0513d9120947a',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_7.html b/doc/html/search/variables_7.html new file mode 100644 index 0000000..e0da2ef --- /dev/null +++ b/doc/html/search/variables_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_7.js b/doc/html/search/variables_7.js new file mode 100644 index 0000000..ac54f92 --- /dev/null +++ b/doc/html/search/variables_7.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['kangledimlabel',['kAngleDimLabel',['../pearl-pshell-import_8ipf.html#a83930d4384b0238fc8416ba03dbc0386',1,'pearl-pshell-import.ipf']]], + ['kattachcolname',['kAttachColName',['../pearl-elog_8ipf.html#addbdec64930e9c1e417b16b25df8c723',1,'pearl-elog.ipf']]], + ['kattachcolsel',['kAttachColSel',['../pearl-elog_8ipf.html#aae61ff4d4a4d83dfc55af45d9ed1cbc3',1,'pearl-elog.ipf']]], + ['kattachcoltitle',['kAttachColTitle',['../pearl-elog_8ipf.html#a5afeb893f92034532341ae51471dc2d2',1,'pearl-elog.ipf']]], + ['kdatadimlabel',['kDataDimLabel',['../pearl-pshell-import_8ipf.html#a277cd450cca7832aa44f8097934e6acb',1,'pearl-pshell-import.ipf']]], + ['kdfpersistent',['kdfPersistent',['../pearl-elog_8ipf.html#a3498e65d04de046481170b49d4e3d0d6',1,'pearl-elog.ipf']]], + ['kdfroot',['kdfRoot',['../pearl-elog_8ipf.html#af34e46263aa50843f98f755988f9ab5c',1,'pearl-elog.ipf']]], + ['kdftemplates',['kdfTemplates',['../pearl-elog_8ipf.html#a28eb44739e7d5c7f9899a69afa231b8e',1,'pearl-elog.ipf']]], + ['kdfvolatile',['kdfVolatile',['../pearl-elog_8ipf.html#a915905f2e57d0d9a25c75f39fcce485f',1,'pearl-elog.ipf']]], + ['kenergydimlabel',['kEnergyDimLabel',['../pearl-pshell-import_8ipf.html#a5ad52cb10171572c454f9426d3a9be21',1,'pearl-pshell-import.ipf']]], + ['kpreviewdatasets',['kPreviewDatasets',['../pearl-pshell-import_8ipf.html#a3c72087695969f42ea91c000de47b26e',1,'pearl-pshell-import.ipf']]], + ['kprojarea',['kProjArea',['../pearl-anglescan-process_8ipf.html#a207c56ac03cc18bf1bfde88dbfe2666f',1,'pearl-anglescan-process.ipf']]], + ['kprojdist',['kProjDist',['../pearl-anglescan-process_8ipf.html#aae45cc49d67f79dcedc4420f82acea4c',1,'pearl-anglescan-process.ipf']]], + ['kprojgnom',['kProjGnom',['../pearl-anglescan-process_8ipf.html#a4a40c73c0e03545e0050ea370e9c57d3',1,'pearl-anglescan-process.ipf']]], + ['kprojortho',['kProjOrtho',['../pearl-anglescan-process_8ipf.html#a3b3bd11c35d5f850b34937ab6c45f659',1,'pearl-anglescan-process.ipf']]], + ['kprojscalearea',['kProjScaleArea',['../pearl-anglescan-process_8ipf.html#afa14187803f5b428a96c8234e04ab217',1,'pearl-anglescan-process.ipf']]], + ['kprojscaledist',['kProjScaleDist',['../pearl-anglescan-process_8ipf.html#a04e75675884236b6ed8244d7575d3a13',1,'pearl-anglescan-process.ipf']]], + ['kprojscalegnom',['kProjScaleGnom',['../pearl-anglescan-process_8ipf.html#ab6670abb621d01994c0b9974f58be843',1,'pearl-anglescan-process.ipf']]], + ['kprojscaleortho',['kProjScaleOrtho',['../pearl-anglescan-process_8ipf.html#aa5487fdee22e0da61a511c14239262f5',1,'pearl-anglescan-process.ipf']]], + ['kprojscalestereo',['kProjScaleStereo',['../pearl-anglescan-process_8ipf.html#aed66bda9701d8a69b2174fac974aa665',1,'pearl-anglescan-process.ipf']]], + ['kprojstereo',['kProjStereo',['../pearl-anglescan-process_8ipf.html#ac151c6f989d6a568fdef0acb791f84db',1,'pearl-anglescan-process.ipf']]], + ['ks_5ffilematch_5fadh5',['ks_filematch_adh5',['../pearl-data-explorer_8ipf.html#a181ccce237172811baf3de5a7a06370d',1,'pearl-data-explorer.ipf']]], + ['ks_5ffilematch_5fitx',['ks_filematch_itx',['../pearl-data-explorer_8ipf.html#a53af8689144e3aeb27ca177db5dd0c22',1,'pearl-data-explorer.ipf']]], + ['ks_5ffilematch_5fmtrx',['ks_filematch_mtrx',['../pearl-data-explorer_8ipf.html#ad720655ff881ddecae2e1b8afed58fa0',1,'ks_filematch_mtrx(): pearl-data-explorer.ipf'],['../pearl-matrix-import_8ipf.html#ad720655ff881ddecae2e1b8afed58fa0',1,'ks_filematch_mtrx(): pearl-matrix-import.ipf']]], + ['ks_5ffilematch_5fpshell',['ks_filematch_pshell',['../pearl-data-explorer_8ipf.html#a00bf5267a40b2b3d760c64d73e139878',1,'pearl-data-explorer.ipf']]], + ['kscandimlabel',['kScanDimLabel',['../pearl-pshell-import_8ipf.html#a412b4753ceb753d705a113a26c018b22',1,'pearl-pshell-import.ipf']]], + ['kscientascalingdatasets',['kScientaScalingDatasets',['../pearl-pshell-import_8ipf.html#a03f00b3299bc3df671fcc239f7dd5418',1,'pearl-pshell-import.ipf']]], + ['ktransposeddatasets',['kTransposedDatasets',['../pearl-pshell-import_8ipf.html#a0f2c168c04d075734edb995361aefb82',1,'pearl-pshell-import.ipf']]] +]; diff --git a/doc/html/search/variables_8.html b/doc/html/search/variables_8.html new file mode 100644 index 0000000..0c3d1df --- /dev/null +++ b/doc/html/search/variables_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_8.js b/doc/html/search/variables_8.js new file mode 100644 index 0000000..2e11c71 --- /dev/null +++ b/doc/html/search/variables_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['mcp_5fradius_5fepass',['mcp_radius_epass',['../fermi-edge-analysis_8ipf.html#a4749b9bce3e1d0381bd9daeb97c9754c',1,'fermi-edge-analysis.ipf']]], + ['mcp_5fradius_5fmm',['mcp_radius_mm',['../fermi-edge-analysis_8ipf.html#a4dcc00b93822f1663be2908b10d2ad3e',1,'fermi-edge-analysis.ipf']]], + ['mcp_5fradius_5fpix',['mcp_radius_pix',['../fermi-edge-analysis_8ipf.html#a09f26b0a0fd940a3d8c6f92aa769c8bc',1,'fermi-edge-analysis.ipf']]], + ['model',['model',['../struct_doniach_sunjic_struct.html#a02c13fdcf15e9adfee13464701bb7de2',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_9.html b/doc/html/search/variables_9.html new file mode 100644 index 0000000..e14a107 --- /dev/null +++ b/doc/html/search/variables_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_9.js b/doc/html/search/variables_9.js new file mode 100644 index 0000000..9df99a2 --- /dev/null +++ b/doc/html/search/variables_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['no_5ffile_5fopen',['NO_FILE_OPEN',['../structerror_code.html#affc9a8a46877373b0212d82d867ca5fa',1,'errorCode']]], + ['no_5fnew_5fbricklets',['NO_NEW_BRICKLETS',['../structerror_code.html#a4ec3cbf922809b99b04d324d3a0bbb22',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_a.html b/doc/html/search/variables_a.html new file mode 100644 index 0000000..4e38be7 --- /dev/null +++ b/doc/html/search/variables_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_a.js b/doc/html/search/variables_a.js new file mode 100644 index 0000000..c034cbd --- /dev/null +++ b/doc/html/search/variables_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oversampling',['oversampling',['../struct_doniach_sunjic_struct.html#ab5a630be50286c3cf04e40d5880506e6',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_b.html b/doc/html/search/variables_b.html new file mode 100644 index 0000000..c98ef41 --- /dev/null +++ b/doc/html/search/variables_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_b.js b/doc/html/search/variables_b.js new file mode 100644 index 0000000..a0567e2 --- /dev/null +++ b/doc/html/search/variables_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['package_5fname',['package_name',['../pearl-data-explorer_8ipf.html#aca457d1f4414d20a911254b1de13ebbb',1,'package_name(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#aca457d1f4414d20a911254b1de13ebbb',1,'package_name(): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#aca457d1f4414d20a911254b1de13ebbb',1,'package_name(): pearl-matrix-import.ipf']]], + ['package_5fpath',['package_path',['../pearl-anglescan-tracker_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-anglescan-tracker.ipf'],['../pearl-data-explorer_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-data-explorer.ipf'],['../pearl-elog_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-elog.ipf'],['../pearl-matrix-import_8ipf.html#a75bb92ef5f80843e66a7243bd958ef8b',1,'package_path(): pearl-matrix-import.ipf']]], + ['precision',['precision',['../struct_doniach_sunjic_struct.html#a906e214875392bc470dbd4bb4bdda2db',1,'DoniachSunjicStruct']]], + ['prefs_5fobjects',['prefs_objects',['../pearl-anglescan-tracker_8ipf.html#a20720748c82a7eaa4b02d4084a4219b2',1,'pearl-anglescan-tracker.ipf']]], + ['pw',['pw',['../struct_doniach_sunjic_struct.html#a92bbb374f66840510e7cb8b316057610',1,'DoniachSunjicStruct']]] +]; diff --git a/doc/html/search/variables_c.html b/doc/html/search/variables_c.html new file mode 100644 index 0000000..d5f4449 --- /dev/null +++ b/doc/html/search/variables_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_c.js b/doc/html/search/variables_c.js new file mode 100644 index 0000000..9ab9270 --- /dev/null +++ b/doc/html/search/variables_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['success',['SUCCESS',['../structerror_code.html#a36a53ca508600b841a54cfd3a3fd5402',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_d.html b/doc/html/search/variables_d.html new file mode 100644 index 0000000..a57e383 --- /dev/null +++ b/doc/html/search/variables_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_d.js b/doc/html/search/variables_d.js new file mode 100644 index 0000000..81d5a85 --- /dev/null +++ b/doc/html/search/variables_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unknown_5ferror',['UNKNOWN_ERROR',['../structerror_code.html#a11b729058e2f4a2698ddaecf4e61c846',1,'errorCode']]] +]; diff --git a/doc/html/search/variables_e.html b/doc/html/search/variables_e.html new file mode 100644 index 0000000..d1502e0 --- /dev/null +++ b/doc/html/search/variables_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_e.js b/doc/html/search/variables_e.js new file mode 100644 index 0000000..2e90f28 --- /dev/null +++ b/doc/html/search/variables_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version',['version',['../pearl-anglescan-tracker_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab',1,'version(): pearl-anglescan-tracker.ipf'],['../pearl-fitfuncs_8ipf.html#a4c7a521b8f1a0769c09bfa4a1fca7dab',1,'version(): pearl-fitfuncs.ipf']]] +]; diff --git a/doc/html/search/variables_f.html b/doc/html/search/variables_f.html new file mode 100644 index 0000000..f777e71 --- /dev/null +++ b/doc/html/search/variables_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_f.js b/doc/html/search/variables_f.js new file mode 100644 index 0000000..489677e --- /dev/null +++ b/doc/html/search/variables_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['wave_5fexist',['WAVE_EXIST',['../structerror_code.html#aa91bd8ef7a635f4575161813ebb09f3b',1,'errorCode']]], + ['wrong_5fparameter',['WRONG_PARAMETER',['../structerror_code.html#aa4279dfdaceed3bd57336cd4e38ed739',1,'errorCode']]] +]; diff --git a/doc/html/splitbar.png b/doc/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/doc/html/struct_doniach_sunjic_struct.html b/doc/html/struct_doniach_sunjic_struct.html new file mode 100644 index 0000000..f190dc8 --- /dev/null +++ b/doc/html/struct_doniach_sunjic_struct.html @@ -0,0 +1,283 @@ + + + + + + +PEARL Procedures: DoniachSunjicStruct Struct Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
DoniachSunjicStruct Struct Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Data Fields

wave pw
 
wave yw
 
wave xw
 
variable precision
 
variable oversampling
 
wave xdw
 
wave model
 
wave broadening
 
wave convolution
 
+

Detailed Description

+
+

Definition at line 191 of file pearl-fitfuncs.ipf.

+

Field Documentation

+ +
+
+ + + + +
wave DoniachSunjicStruct::broadening
+
+ +

Definition at line 207 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
wave DoniachSunjicStruct::convolution
+
+ +

Definition at line 208 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
wave DoniachSunjicStruct::model
+
+ +

Definition at line 206 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
variable DoniachSunjicStruct::oversampling
+
+ +

Definition at line 201 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
variable DoniachSunjicStruct::precision
+
+ +

Definition at line 200 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
wave DoniachSunjicStruct::pw
+
+ +

Definition at line 191 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
wave DoniachSunjicStruct::xdw
+
+ +

Definition at line 205 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
wave DoniachSunjicStruct::xw
+
+ +

Definition at line 197 of file pearl-fitfuncs.ipf.

+ +
+
+ +
+
+ + + + +
wave DoniachSunjicStruct::yw
+
+ +

Definition at line 196 of file pearl-fitfuncs.ipf.

+ +
+
+
The documentation for this struct was generated from the following file: +
+
+ + + + diff --git a/doc/html/struct_doniach_sunjic_struct.js b/doc/html/struct_doniach_sunjic_struct.js new file mode 100644 index 0000000..6520a6d --- /dev/null +++ b/doc/html/struct_doniach_sunjic_struct.js @@ -0,0 +1,12 @@ +var struct_doniach_sunjic_struct = +[ + [ "broadening", "struct_doniach_sunjic_struct.html#ac9b18c8b44b43c2ee438f37f8d002a66", null ], + [ "convolution", "struct_doniach_sunjic_struct.html#a7f05f7827435fea3c986a8d538496955", null ], + [ "model", "struct_doniach_sunjic_struct.html#a02c13fdcf15e9adfee13464701bb7de2", null ], + [ "oversampling", "struct_doniach_sunjic_struct.html#ab5a630be50286c3cf04e40d5880506e6", null ], + [ "precision", "struct_doniach_sunjic_struct.html#a906e214875392bc470dbd4bb4bdda2db", null ], + [ "pw", "struct_doniach_sunjic_struct.html#a92bbb374f66840510e7cb8b316057610", null ], + [ "xdw", "struct_doniach_sunjic_struct.html#a750e7260bf5d4c936dadde714fb2db52", null ], + [ "xw", "struct_doniach_sunjic_struct.html#a45c3a3fa68850032e545907ca65ab982", null ], + [ "yw", "struct_doniach_sunjic_struct.html#a6cef648ad0cf4be1dd9fbe33ff5df1eb", null ] +]; \ No newline at end of file diff --git a/doc/html/structerror_code.html b/doc/html/structerror_code.html new file mode 100644 index 0000000..d0eb025 --- /dev/null +++ b/doc/html/structerror_code.html @@ -0,0 +1,319 @@ + + + + + + +PEARL Procedures: errorCode Struct Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
errorCode Struct Reference
+
+
+ +

from matrixfilereader help + More...

+ + + + + + + + + + + + + + + + + + + + + + + + +

+Data Fields

int32 SUCCESS
 
int32 UNKNOWN_ERROR
 
int32 ALREADY_FILE_OPEN
 
int32 EMPTY_RESULTFILE
 
int32 FILE_NOT_READABLE
 
int32 NO_NEW_BRICKLETS
 
int32 WRONG_PARAMETER
 
int32 INTERNAL_ERROR_CONVERTING_DATA
 
int32 NO_FILE_OPEN
 
int32 INVALID_RANGE
 
int32 WAVE_EXIST
 
+

Detailed Description

+

from matrixfilereader help

+ +

Definition at line 197 of file pearl-matrix-import.ipf.

+

Field Documentation

+ +
+
+ + + + +
int32 errorCode::ALREADY_FILE_OPEN
+
+ +

Definition at line 200 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::EMPTY_RESULTFILE
+
+ +

Definition at line 201 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::FILE_NOT_READABLE
+
+ +

Definition at line 202 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::INTERNAL_ERROR_CONVERTING_DATA
+
+ +

Definition at line 205 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::INVALID_RANGE
+
+ +

Definition at line 207 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::NO_FILE_OPEN
+
+ +

Definition at line 206 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::NO_NEW_BRICKLETS
+
+ +

Definition at line 203 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::SUCCESS
+
+ +

Definition at line 197 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::UNKNOWN_ERROR
+
+ +

Definition at line 199 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::WAVE_EXIST
+
+ +

Definition at line 208 of file pearl-matrix-import.ipf.

+ +
+
+ +
+
+ + + + +
int32 errorCode::WRONG_PARAMETER
+
+ +

Definition at line 204 of file pearl-matrix-import.ipf.

+ +
+
+
The documentation for this struct was generated from the following file: +
+
+ + + + diff --git a/doc/html/structerror_code.js b/doc/html/structerror_code.js new file mode 100644 index 0000000..f6329dd --- /dev/null +++ b/doc/html/structerror_code.js @@ -0,0 +1,14 @@ +var structerror_code = +[ + [ "ALREADY_FILE_OPEN", "structerror_code.html#a19dc49bdfb4bd9601f17f907da158026", null ], + [ "EMPTY_RESULTFILE", "structerror_code.html#ab7f29ef2ba8497c55f2bc55c4b9fc186", null ], + [ "FILE_NOT_READABLE", "structerror_code.html#a71ce7c0413c44515d9570dab1ffd5ffd", null ], + [ "INTERNAL_ERROR_CONVERTING_DATA", "structerror_code.html#afb49d1cffe8e7590892b018ac9e648cc", null ], + [ "INVALID_RANGE", "structerror_code.html#a5477920df1edcc7a1af0513d9120947a", null ], + [ "NO_FILE_OPEN", "structerror_code.html#affc9a8a46877373b0212d82d867ca5fa", null ], + [ "NO_NEW_BRICKLETS", "structerror_code.html#a4ec3cbf922809b99b04d324d3a0bbb22", null ], + [ "SUCCESS", "structerror_code.html#a36a53ca508600b841a54cfd3a3fd5402", null ], + [ "UNKNOWN_ERROR", "structerror_code.html#a11b729058e2f4a2698ddaecf4e61c846", null ], + [ "WAVE_EXIST", "structerror_code.html#aa91bd8ef7a635f4575161813ebb09f3b", null ], + [ "WRONG_PARAMETER", "structerror_code.html#aa4279dfdaceed3bd57336cd4e38ed739", null ] +]; \ No newline at end of file diff --git a/doc/html/sync_off.png b/doc/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/doc/html/sync_on.png b/doc/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/doc/html/tab_a.png b/doc/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/doc/html/tab_b.png b/doc/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/doc/html/tabs.css b/doc/html/tabs.css new file mode 100644 index 0000000..9cf578f --- /dev/null +++ b/doc/html/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/doc/html/todo.html b/doc/html/todo.html new file mode 100644 index 0000000..aa6b095 --- /dev/null +++ b/doc/html/todo.html @@ -0,0 +1,132 @@ + + + + + + +PEARL Procedures: Todo List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
PEARL Procedures +  rev-distro-1.4.0-0-g80a01f2 +
+
Igor procedures for the analysis of PEARL data
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Todo List
+
+
+
+
Global adh5_scale_scan (wave data)
+
incomplete
+
Global elog_validate_attributes (string logbook, string attributes)
+
function currently not implemented, always returns 0
+
Global epics_connect ()
+
the X03DA channel names are hard-coded.
+
Global load_hemi_scan (string nickname, string pathname, string filename)
+
function not implemented
+
Global mtrx_open_file (string pathName, string fileNameOrPath)
+
fix possible cache issues, add an option to override the cache.
+
Global psh5_load_reduced (string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable progress=defaultValue)
+
load scan positions.
+
+
+
+ + + + diff --git a/doc/latex/refman.pdf b/doc/latex/refman.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fdbbc14a97c99ebacd93f53458f485deee6b3492 GIT binary patch literal 566487 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
  • *VYl0_{LutjnTd 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

    *A4!-!-=8rY(cL5COz+^;==afM&}|Vq0EqC) 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 )OewH0wJMZ&k9uAy*rTQ29DxLge$ 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%0AI@ql`nS#6t;j6 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 z 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

    3QK;}6j&D>j)7(ivhh5KP){582=N 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

    #h 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 SXUO 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 literal 0 HcmV?d00001