#pragma rtGlobals=3 // Use modern global access method and strict wave access. #pragma version = 1.7 #pragma IgorVersion = 6.2 #pragma ModuleName = PearlAnglescanPanel #include "pearl-anglescan-process" #include "pearl-pmsco-import" // copyright (c) 2018 Paul Scherrer Institut // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http:///www.apache.org/licenses/LICENSE-2.0 // // Please acknowledge the use of this code. /// @file /// @brief interactive processing of angle scanned XPD data. /// @ingroup ArpesPackage /// /// steps to process a hemispherical scan into a diffractogram: /// 1. load the scan file in data reduction mode. /// 2. open the angle scan panel by calling asp_show_panel(). /// 3. select the dataset. /// 4. set the processing parameters. /// 5. start the processing and display the result. /// 6. refine parameters and repeat steps 4-5. /// 7. export the result in the desired form. /// /// @author matthias muntwiler, matthias.muntwiler@psi.ch /// /// @copyright 2018 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 /// /// @namespace PearlAnglescanPanel /// @brief interactive processing of angle scanned XPD data. /// /// PearlAnglescanPanel is declared in @ref pearl-anglescan-panel.ipf. /// package name is used as data folder name static strconstant package_name = "pearl_anglescan_panel" /// data folder path static strconstant package_path = "root:packages:pearl_anglescan_panel:" /// semicolon-separated list of persistent variable, string, and wave names static strconstant prefs_objects = "theta_offset;tilt_offset;phi_offset;alpha_offset;crop_alpha_enable;crop_alpha_value;norm_alpha_enable;norm_alpha_mode;norm_alpha_smoothing;norm_phi_enable;norm_phi_mode;norm_phi_thetarange;norm_theta_enable;norm_theta_mode;norm_theta_smoothing;norm_thetaphi_enable;norm_thetaphi_mode;norm_theta_smoothing;output_folding;output_horizon;graph_mode;graph_projection;graph_colortable;graph_contrast;" /// initialize package data once when the procedure is first loaded static function AfterCompiledHook() dfref savedf = GetDataFolderDFR() variable do_init = 1 if (DataFolderExists(package_path)) setdatafolder $(package_path) nvar /z init_done if (nvar_exists(init_done)) if (init_done) do_init = 0 endif endif endif if (do_init) init_package() load_prefs() setdatafolder $(package_path) variable /g init_done = 1 endif setdatafolder savedf return 0 end static function init_package() dfref savedf = getdatafolderdfr() setdatafolder root: newdatafolder /o/s packages newdatafolder /o/s $package_name // configuration (persistent) string /g graphname = "graph_anglescan_panel" // recently used (persistent) variable /g theta_offset = 0 variable /g tilt_offset = 0 variable /g phi_offset = 0 variable /g alpha_offset = 0 variable /g crop_alpha_enable = 0 variable /g crop_alpha_value = 25 variable /g norm_alpha_enable = 0 variable /g norm_alpha_mode = 4 variable /g norm_alpha_smoothing = 0.25 variable /g norm_theta_enable = 0 variable /g norm_theta_mode = 4 variable /g norm_theta_smoothing = 0.25 variable /g norm_thetaphi_enable = 0 variable /g norm_thetaphi_mode = 4 variable /g norm_thetaphi_smoothing = 0.25 variable /g norm_phi_enable = 0 variable /g norm_phi_mode = 4 variable /g norm_phi_thetarange = 20 string /g output_name = "holo1" variable /g output_folding = 1 variable /g output_horizon = 88 variable /g graph_mode = 1 variable /g graph_projection = kProjStereo string /g graph_colortable = "grays" variable /g graph_contrast = 2 // recently used (volatile) string /g source_path = "" string /g export_folderpath = "root:" variable /g export_format = 1 // administrative data (volatile) string /g panel_name = "" string /g preview_graphname = "" string /g dist_x_graphname = "" string /g dist_y_graphname = "" string /g output_graphname = "" // data (volatile) make /n=(10,10) /o raw_data, process_data make /o dist_x, dist_x_smoo make /o dist_y, dist_y_smoo setdatafolder savedf end /// save persistent package data to the preferences file. /// /// this function is called when the user clicks the corresponding button. /// static function save_prefs() dfref saveDF = GetDataFolderDFR() string fullPath = SpecialDirPath("Packages", 0, 0, 0) fullPath += package_name NewPath/O/C/Q tempPackagePrefsPath, fullPath fullPath += ":preferences.pxp" SetDataFolder root:packages SetDataFolder $package_name SaveData /O /Q /J=prefs_objects fullPath KillPath/Z tempPackagePrefsPath SetDataFolder saveDF end /// 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. /// static function load_prefs() dfref saveDF = GetDataFolderDFR() variable result = -1 setdatafolder root: NewDataFolder /O/S packages NewDataFolder /O/S $package_name string fullPath = SpecialDirPath("Packages", 0, 0, 0) fullPath += package_name GetFileFolderInfo /Q /Z fullPath if (V_Flag == 0) // Disk directory exists? fullPath += ":preferences.pxp" GetFileFolderInfo /Q /Z fullPath if (V_Flag == 0) // Preference file exist? LoadData /O /R /Q fullPath result = 0 endif endif SetDataFolder saveDF return result end /// import raw data /// /// the raw data are copied into the package data folder, /// and the process waves are initialized. /// /// @param raw_data 2D intensity distribution. /// the x dimension is the detection angle. /// the y dimension is an arbitrary sequence of manipulator scan positions. /// ManipulatorTheta, ManipulatorPilt and ManipulatorPhi waves /// that indicate the manipulator angles for each y position /// must be present in the :attr sub-folder next to the raw data wave. /// function asp_import_raw(raw_data) wave raw_data dfref saveDF = GetDataFolderDFR() dfref datadf = GetWavesDataFolderDFR(raw_data) dfref attrdf = datadf:attr if (!DataFolderRefStatus(attrdf)) setdatafolder datadf setdatafolder :: dfref parentdf = GetDataFolderDFR() dfref attrdf = parentdf:attr endif setdatafolder $(package_path) // todo : check dimensions and scales svar source_path source_path = GetWavesDataFolder(raw_data, 2) duplicate /o raw_data, raw, process_data wave /sdfr=attrdf /z ManipulatorTheta wave /sdfr=attrdf /z ManipulatorTilt wave /sdfr=attrdf /z ManipulatorPhi if (WaveExists(ManipulatorTheta) && WaveExists(ManipulatorTilt) && WaveExists(ManipulatorPhi)) duplicate /o attrdf:ManipulatorTheta, raw_theta, process_theta duplicate /o attrdf:ManipulatorTilt, raw_tilt, process_tilt duplicate /o attrdf:ManipulatorPhi, raw_phi, process_phi else DoAlert 0, "Can't find manipulator angle waves.\rCheck that the attr folder exists, or provide values in the following table." make /n=(dimsize(raw_data, 1)) /o raw_theta, raw_tilt, raw_phi make /n=(dimsize(raw_data, 1)) /o process_theta, process_tilt, process_phi edit /k=1 raw_theta, raw_tilt, raw_phi endif make /o /n=(dimsize(raw_data, 0)) dist_x, dist_x_smoo make /o /n=(dimsize(raw_data, 1)) dist_y, dist_y_smoo SetDataFolder saveDF end /// display a graph window of the processed data. /// /// if the window exists, it is updated and brought to the front of the window stack. /// function asp_display_previews() dfref df = $(package_path) wave /sdfr=df process_data svar /sdfr=df preview_graphname if (strlen(preview_graphname) && (wintype(preview_graphname) == 1)) ad_update_profiles(process_data) DoWindow /F $preview_graphname else preview_graphname = ad_display_profiles(process_data) endif nvar /sdfr=df graph_contrast svar /sdfr=df graph_colortable set_contrast(graph_contrast, graph_contrast, graphname=preview_graphname, colortable=graph_colortable) end /// display a graph window of the distribution checks. /// /// if the window exists, it is updated and brought to the front of the window stack. /// /// @param xdist 1: display the x-distribution; 0: don't. /// @param ydist 1: display the y-distribution; 0: don't. /// function asp_display_dist_check(xdist, ydist) variable xdist, ydist dfref df = $(package_path) wave /sdfr=df dist_x wave /sdfr=df dist_y wave /sdfr=df dist_x_smoo wave /sdfr=df dist_y_smoo svar /sdfr=df dist_x_graphname svar /sdfr=df dist_y_graphname if (xdist) if (strlen(dist_x_graphname) && (wintype(dist_x_graphname) == 1)) DoWindow /F $dist_x_graphname else display /k=1 /n=graph_asp_dist_x dist_x, dist_x_smoo dist_x_graphname = s_name ModifyGraph /w=$dist_x_graphname mode(dist_x)=2 ModifyGraph /w=$dist_x_graphname lsize(dist_x)=2 ModifyGraph /w=$dist_x_graphname rgb(dist_x)=(0,0,0) endif endif if (ydist) if (strlen(dist_y_graphname) && (wintype(dist_y_graphname) == 1)) DoWindow /F $dist_y_graphname else display /k=1 /n=graph_asp_dist_y dist_y, dist_y_smoo dist_y_graphname = s_name ModifyGraph /w=$dist_y_graphname mode(dist_y)=2 ModifyGraph /w=$dist_y_graphname lsize(dist_y)=2 ModifyGraph /w=$dist_y_graphname rgb(dist_y)=(0,0,0) endif endif end /// initialize the process data with a copy of the raw data. /// /// applies the angle offsets. /// /// @param[in] check select which output to generate (currently not used). /// @arg 0 (default) process data, don't calculate check waves. /// @arg 1 process data and calculate check waves. /// @arg 2 calculate check waves only, do not calculate process data. /// static function do_init_process(check) variable check dfref df = $(package_path) wave /sdfr=df raw wave /sdfr=df raw_theta wave /sdfr=df raw_tilt wave /sdfr=df raw_phi nvar /sdfr=df theta_offset nvar /sdfr=df tilt_offset nvar /sdfr=df phi_offset nvar /sdfr=df alpha_offset duplicate /o raw, df:process_data duplicate /o raw_theta, df:process_theta duplicate /o raw_tilt, df:process_tilt duplicate /o raw_phi, df:process_phi wave /sdfr=df process_data wave /sdfr=df process_theta wave /sdfr=df process_tilt wave /sdfr=df process_phi process_theta = raw_theta - theta_offset process_tilt = raw_tilt - tilt_offset process_phi = raw_phi - phi_offset setscale /p x dimoffset(raw, 0) - alpha_offset, dimdelta(raw, 0), waveunits(raw, 0), process_data end /// alpha-crop the process data. /// /// @param[in] check select which output to generate (currently not used). /// @arg 0 (default) process data, don't calculate check waves. /// @arg 1 process data and calculate check waves. /// @arg 2 calculate check waves only, do not calculate process data. /// /// @param[in] force override the global enable flag. /// @arg 0 (default) apply this filter only if its global enable flag is set. /// @arg 1 apply this filter even if it is not enabled. /// static function do_crop_alpha(check, [force]) variable check variable force if (ParamIsDefault(force)) force = 0 endif dfref df = $(package_path) wave /sdfr=df process_data nvar /sdfr=df crop_alpha_enable nvar /sdfr=df crop_alpha_value if ((force || crop_alpha_enable) && (crop_alpha_value > abs(dimdelta(process_data, 0)))) crop_strip(process_data, -crop_alpha_value, +crop_alpha_value) endif end /// alpha-normalize the process data. /// /// @param[in] check select which output to generate. /// @arg 0 (default) process data, don't calculate check waves. /// @arg 1 process data and calculate check waves. /// @arg 2 calculate check waves only, do not calculate process data. /// /// @param[in] force override the global enable flag. /// @arg 0 (default) apply this filter only if its global enable flag is set. /// @arg 1 apply this filter even if it is not enabled. /// static function do_norm_alpha(check, [force]) variable check variable force if (ParamIsDefault(force)) force = 0 endif dfref saveDF = GetDataFolderDFR() dfref df = $(package_path) wave /sdfr=df process_data nvar /sdfr=df norm_alpha_enable nvar /sdfr=df norm_alpha_mode nvar /sdfr=df norm_alpha_smoothing if (force || norm_alpha_enable) dfref temp_df = newfreedatafolder() setdatafolder temp_df normalize_strip_x(process_data, smooth_method=norm_alpha_mode, smooth_factor=norm_alpha_smoothing, check=check) if (check) wave check_dist wave check_smoo duplicate /o check_dist, df:dist_x duplicate /o check_smoo, df:dist_x_smoo endif endif SetDataFolder saveDF end /// phi-normalize the process data. /// /// @param[in] check select which output to generate. /// @arg 0 (default) process data, don't calculate check waves. /// @arg 1 process data and calculate check waves. /// @arg 2 calculate check waves only, do not calculate process data. /// /// @param[in] force override the global enable flag. /// @arg 0 (default) apply this filter only if its global enable flag is set. /// @arg 1 apply this filter even if it is not enabled. /// static function do_norm_phi(check, [force]) variable check variable force if (ParamIsDefault(force)) force = 0 endif dfref saveDF = GetDataFolderDFR() dfref df = $(package_path) wave /sdfr=df process_data wave /sdfr=df process_theta wave /sdfr=df process_phi nvar /sdfr=df norm_phi_enable nvar /sdfr=df norm_phi_mode nvar /sdfr=df norm_phi_thetarange if (force || norm_phi_enable) dfref temp_df = newfreedatafolder() setdatafolder temp_df normalize_strip_phi(process_data, process_theta, process_phi, theta_range=norm_phi_thetarange, check=check) if (check) wave check_dist wave check_smoo duplicate /o check_dist, df:dist_y duplicate /o check_smoo, df:dist_y_smoo endif endif SetDataFolder saveDF end /// theta-normalize the process data. /// /// @param[in] check select which output to generate. /// @arg 0 (default) process data, don't calculate check waves. /// @arg 1 process data and calculate check waves. /// @arg 2 calculate check waves only, do not calculate process data. /// /// @param[in] force override the global enable flag. /// @arg 0 (default) apply this filter only if its global enable flag is set. /// @arg 1 apply this filter even if it is not enabled. /// static function do_norm_theta(check, [force]) variable check variable force if (ParamIsDefault(force)) force = 0 endif dfref saveDF = GetDataFolderDFR() dfref df = $(package_path) wave /sdfr=df process_data wave /sdfr=df process_theta nvar /sdfr=df norm_theta_enable nvar /sdfr=df norm_theta_mode nvar /sdfr=df norm_theta_smoothing if (force || norm_theta_enable) dfref temp_df = newfreedatafolder() setdatafolder temp_df normalize_strip_theta(process_data, process_theta, smooth_method=norm_theta_mode, smooth_factor=norm_theta_smoothing, check=check) if (check) wave check_dist wave check_smoo duplicate /o check_dist, df:dist_y duplicate /o check_smoo, df:dist_y_smoo endif endif SetDataFolder saveDF end /// theta,phi-normalize the process data. /// /// @param[in] check select which output to generate. /// @arg 0 (default) process data, don't calculate check waves. /// @arg 1 process data and calculate check waves. /// @arg 2 calculate check waves only, do not calculate process data. /// /// @param[in] force override the global enable flag. /// @arg 0 (default) apply this filter only if its global enable flag is set. /// @arg 1 apply this filter even if it is not enabled. /// static function do_norm_thetaphi(check, [force]) variable check variable force if (ParamIsDefault(force)) force = 0 endif dfref saveDF = GetDataFolderDFR() dfref df = $(package_path) wave /sdfr=df process_data wave /sdfr=df process_theta wave /sdfr=df process_phi nvar /sdfr=df norm_thetaphi_enable nvar /sdfr=df norm_thetaphi_mode nvar /sdfr=df norm_thetaphi_smoothing if (force || norm_thetaphi_enable) dfref temp_df = newfreedatafolder() setdatafolder temp_df normalize_strip_thetaphi(process_data, process_theta, process_phi, smooth_method=norm_thetaphi_mode, smooth_factor=norm_thetaphi_smoothing, check=check) if (check) wave check_dist wave check_smoo duplicate /o check_dist, df:dist_y duplicate /o check_smoo, df:dist_y_smoo endif endif SetDataFolder saveDF end /// calculate the output using all enabled processing filters. /// /// the diffractogram is calculated, to display the graph, call @ref asp_display_graph. /// function asp_calculate_output() dfref saveDF = GetDataFolderDFR() setdatafolder $(package_path) svar output_name wave process_data wave process_theta wave process_tilt wave process_phi nvar folding=output_folding nvar horizon=output_horizon do_init_process(0) do_crop_alpha(0) do_norm_alpha(0) do_norm_phi(0) do_norm_theta(0) do_norm_thetaphi(0) pizza_service_2(process_data, output_name, process_theta, process_tilt, process_phi, folding=folding, nograph=1) setdatafolder $output_name wave values wave pol if (horizon > 0) values = pol <= horizon ? values : nan endif SetDataFolder saveDF end /// display the output diffractogram in a new graph /// function asp_display_output() dfref df = $(package_path) svar /sdfr=df output_name svar /sdfr=df output_graphname nvar /sdfr=df graph_projection nvar /sdfr=df graph_mode dfref saveDF = GetDataFolderDFR() setdatafolder $(package_path) output_graphname = output_name output_graphname = display_hemi_scan(output_name, projection=graph_projection, graphtype=graph_mode, graphname=output_graphname) SetDataFolder saveDF asp_update_graph() end /// update graphs with new color table or contrast /// /// applies to the preview graph and the diffractogram. /// function asp_update_graph() dfref df = $(package_path) svar /sdfr=df preview_graphname svar /sdfr=df output_graphname svar /sdfr=df graph_colortable nvar /sdfr=df graph_contrast if (strlen(preview_graphname) && (wintype(preview_graphname) == 1)) set_contrast(graph_contrast, graph_contrast, graphname=preview_graphname, colortable=graph_colortable) endif if (strlen(output_graphname) && (wintype(output_graphname) == 1)) set_contrast(graph_contrast, graph_contrast, graphname=output_graphname, colortable=graph_colortable) endif end /// close all graphs created by the angle scan panel /// function asp_close_graphs() dfref df = $(package_path) svar /sdfr=df preview_graphname svar /sdfr=df output_graphname svar /sdfr=df dist_x_graphname svar /sdfr=df dist_y_graphname if (strlen(preview_graphname) && (wintype(preview_graphname) == 1)) killwindow $preview_graphname endif if (strlen(output_graphname) && (wintype(output_graphname) == 1)) killwindow $output_graphname endif if (strlen(dist_x_graphname) && (wintype(dist_x_graphname) == 1)) killwindow $dist_x_graphname endif if (strlen(dist_y_graphname) && (wintype(dist_y_graphname) == 1)) killwindow $dist_y_graphname endif preview_graphname = "" output_graphname = "" dist_x_graphname = "" dist_y_graphname = "" end /// copy the output data to a new folder /// /// @param dest_name name of destination folder. /// can contain a relative (starting with a colon) or absolute (starting with "root:") path. /// folders in the path must exist except for the last one. /// the destination folder does not need to exist. /// existing data in the destination folder is overwritten. /// function asp_duplicate_output(dest_name) string dest_name dfref df = $(package_path) svar /sdfr=df source_path svar /sdfr=df output_name svar /sdfr=df output_graphname wave raw_data = $source_path dfref saveDF = GetDataFolderDFR() dfref dest_df = GetWavesDataFolderDFR(raw_data) setdatafolder dest_df newdatafolder /o /s $dest_name dfref dest_df = GetDataFolderDFR() setdatafolder df duplicate_hemi_scan(output_name, dest_df, "") SetDataFolder saveDF end /// save the output diffractogram to an igor text file /// function asp_save_output_itx() dfref df = $(package_path) svar /sdfr=df output_name dfref saveDF = GetDataFolderDFR() setdatafolder df save_hemi_scan(output_name, "", "") SetDataFolder saveDF end /// save the output diffractogram to a PMSCO ETPI file /// /// @param ekin kinetic energy in eV /// function asp_save_output_etpi(ekin) variable ekin dfref df = $(package_path) svar /sdfr=df output_name wave /sdfr=df process_data dfref saveDF = GetDataFolderDFR() setdatafolder df string s_prefix = "" string s_int = "values" dfref data_df = find_hemi_data(output_name, s_prefix, s_int) string s_polar = s_prefix + "pol" string s_azim = s_prefix + "az" pmsco_save_scan("", "", num2str(ekin), s_polar, s_azim, "", s_int, "", sdfr=data_df) SetDataFolder saveDF end static function check_norm_alpha() do_init_process(0) do_crop_alpha(0) do_norm_alpha(2, force=1) asp_display_dist_check(1, 0) end static function check_norm_phi() do_init_process(0) do_crop_alpha(0) do_norm_phi(2, force=1) asp_display_dist_check(0, 1) end static function check_norm_theta() do_init_process(0) do_crop_alpha(0) do_norm_theta(2, force=1) asp_display_dist_check(0, 1) end static function check_norm_thetaphi() do_init_process(0) do_crop_alpha(0) do_norm_thetaphi(2, force=1) asp_display_dist_check(0, 1) end static function preview_crop_alpha() do_init_process(0) do_crop_alpha(0, force=1) asp_display_previews() end static function preview_norm_alpha() do_init_process(0) do_crop_alpha(0) do_norm_alpha(1, force=1) asp_display_previews() end static function preview_norm_phi() do_init_process(0) do_crop_alpha(0) do_norm_phi(1, force=1) asp_display_previews() end static function preview_norm_theta() do_init_process(0) do_crop_alpha(0) do_norm_theta(1, force=1) asp_display_previews() end static function preview_norm_thetaphi() do_init_process(0) do_crop_alpha(0) do_norm_thetaphi(1, force=1) asp_display_previews() end /// create the angle scan processing panel /// function asp_show_panel() dfref df = $(package_path) svar /sdfr=df panel_name if (strlen(panel_name) && (wintype(panel_name) == 7)) DoWindow /F $panel_name return 0 endif NewPanel /K=1 /N=anglescan_panel /W=(200,100,479,1027) as "angle scan processing" panel_name = s_name GroupBox gb_source, title="data source" Button b_source_select, size={50,20},proc=PearlAnglescanPanel#bp_source_select,title="select..." Button b_source_select, help={"select the source wave, e.g. ReducedData1. it must be in the original scan data folder along with the attr folder and the manipulator positions."} TitleBox tb_source_path, size={240,21} TitleBox tb_source_path,variable= root:packages:pearl_anglescan_panel:source_path GroupBox gb_offsets, title="offsets" SetVariable sv_theta_offset, size={88,16},bodyWidth=60,title="theta" SetVariable sv_theta_offset,value= root:packages:pearl_anglescan_panel:theta_offset SetVariable sv_theta_offset, help={"manipulator theta value that corresponds to normal emission."} SetVariable sv_tilt_offset, size={74,16},bodyWidth=60,title="tilt" SetVariable sv_tilt_offset,value= root:packages:pearl_anglescan_panel:tilt_offset SetVariable sv_tilt_offset, help={"manipulator tilt value that corresponds to normal emission."} SetVariable sv_phi_offset, size={78,16},bodyWidth=60,title="phi" SetVariable sv_phi_offset,value= root:packages:pearl_anglescan_panel:phi_offset SetVariable sv_phi_offset, help={"manipulator phi value that should map to the 3 o'clock angle."} SetVariable sv_alpha_offset, size={90,16},bodyWidth=60,title="alpha" SetVariable sv_alpha_offset,value= root:packages:pearl_anglescan_panel:alpha_offset SetVariable sv_alpha_offset, help={"alpha value that corresponds to normal emission (if the sample normal is properly aligned)."} GroupBox gb_crop_alpha, title="crop alpha" CheckBox cb_crop_alpha_enable, size={50,14}, title="enable" CheckBox cb_crop_alpha_enable, help={"enable cropping at +/- alpha"} CheckBox cb_crop_alpha_enable,variable= root:packages:pearl_anglescan_panel:crop_alpha_enable SetVariable sv_crop_alpha_value, size={90,16},bodyWidth=60,title="angle" SetVariable sv_crop_alpha_value,limits={0,30,1},value= root:packages:pearl_anglescan_panel:crop_alpha_value SetVariable sv_crop_alpha_value, help={"alpha (detection angle) cropping angle"} Button b_crop_alpha_preview, size={80,20},proc=PearlAnglescanPanel#bp_crop_alpha_preview,title="preview" Button b_crop_alpha_preview, help={"show a preview of the cropped dataset."} GroupBox gb_norm_alpha, title="normalize alpha" CheckBox cb_norm_alpha_enable, size={50,14}, title="enable" CheckBox cb_norm_alpha_enable,variable= root:packages:pearl_anglescan_panel:norm_alpha_enable CheckBox cb_norm_alpha_enable, help={"enable normalization of the alpha distribution"} PopupMenu pm_norm_alpha_mode, size={138,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_norm_alpha_mode,title="method" PopupMenu pm_norm_alpha_mode, mode=5, popvalue="loess", value= #"\"none;binomial;boxcar;scienta;loess;\"" PopupMenu pm_norm_alpha_mode, help={"alpha normalization method. recommended: loess"} SetVariable sv_norm_alpha_smoothing, size={112,16}, bodyWidth=60, title="smoothing" SetVariable sv_norm_alpha_smoothing, limits={0,1,0.05}, value= root:packages:pearl_anglescan_panel:norm_alpha_smoothing SetVariable sv_norm_alpha_smoothing, help={"smoothing parameter (depends on the normalization method)."} Button b_norm_alpha_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_alpha_check,title="check" Button b_norm_alpha_check, help={"show a graph of the normalization function"} Button b_norm_alpha_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_alpha_preview,title="preview" Button b_norm_alpha_preview, help={"show a preview of the normalized dataset (without other normalizations)."} GroupBox gb_norm_phi, title="normalize phi" CheckBox cb_norm_phi_enable, size={50,14}, title="enable" CheckBox cb_norm_phi_enable,variable= root:packages:pearl_anglescan_panel:norm_phi_enable CheckBox cb_norm_phi_enable, help={"enable normalization of the phi distribution to reduce the effect of wobble"} SetVariable sv_norm_phi_range, size={118,16}, bodyWidth=60, title="theta range" SetVariable sv_norm_phi_range, limits={0,90,1}, value= root:packages:pearl_anglescan_panel:norm_phi_thetarange SetVariable sv_norm_phi_range, help={"theta range (from normal) to factor into the normalization function"} Button b_norm_phi_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_phi_check, title="check" Button b_norm_phi_check, help={"show a graph of the normalization function"} Button b_norm_phi_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_phi_preview, title="preview" Button b_norm_phi_preview, help={"show a preview of the normalized dataset (without other normalizations)."} GroupBox gb_norm_theta, title="normalize theta" CheckBox cb_norm_theta_enable, size={50,14},title="enable" CheckBox cb_norm_theta_enable, variable= root:packages:pearl_anglescan_panel:norm_theta_enable CheckBox cb_norm_theta_enable, help={"enable normalization of the theta distribution (integrated over phi)"} PopupMenu pm_norm_theta_mode, size={138,21},bodyWidth=100,proc=PearlAnglescanPanel#pmp_norm_theta_mode,title="method" PopupMenu pm_norm_theta_mode,mode=5,popvalue="loess",value= #"\"none;binomial;boxcar;polynomial;loess;\"" PopupMenu pm_norm_theta_mode, help={"theta normalization method. recommended: loess"} SetVariable sv_norm_theta_smoothing, size={112,16}, bodyWidth=60, title="smoothing" SetVariable sv_norm_theta_smoothing, limits={0,1,0.05}, value= root:packages:pearl_anglescan_panel:norm_theta_smoothing SetVariable sv_norm_theta_smoothing, help={"smoothing parameter (depends on the normalization method)."} Button b_norm_theta_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_theta_check, title="check" Button b_norm_theta_check, help={"show a graph of the normalization function"} Button b_norm_theta_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_theta_preview, title="preview" Button b_norm_theta_preview, help={"show a preview of the normalized dataset (without other normalizations)."} GroupBox gb_norm_thetaphi, size={272,97},title="normalize (theta,phi)" CheckBox cb_norm_thetaphi_enable, size={50,14},title="enable" CheckBox cb_norm_thetaphi_enable, variable= root:packages:pearl_anglescan_panel:norm_thetaphi_enable CheckBox cb_norm_thetaphi_enable, help={"enable normalization of the (theta, phi) distribution."} PopupMenu pm_norm_thetaphi_mode, size={138,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_norm_thetaphi_mode,title="method" PopupMenu pm_norm_thetaphi_mode, mode=5, popvalue="loess", value= #"\"none;none;none;none;loess;\"" PopupMenu pm_norm_thetaphi_mode, help={"theta normalization method. recommended: loess"} SetVariable sv_norm_thetaphi_smoothing, size={112,16}, bodyWidth=60, title="smoothing" SetVariable sv_norm_thetaphi_smoothing, limits={0,1,0.05}, value= root:packages:pearl_anglescan_panel:norm_thetaphi_smoothing SetVariable sv_norm_thetaphi_smoothing, help={"smoothing parameter (depends on the normalization method)."} Button b_norm_thetaphi_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_thetaphi_check, title="check" Button b_norm_thetaphi_check, help={"show a graph of the normalization function"} Button b_norm_thetaphi_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_thetaphi_preview, title="preview" Button b_norm_thetaphi_preview, help={"show a preview of the normalized dataset (without other normalizations)."} GroupBox gb_output, title="output" SetVariable sv_output_folding, size={95,16}, bodyWidth=60, title="folding" SetVariable sv_output_folding, limits={1,20,1}, value= root:packages:pearl_anglescan_panel:output_folding SetVariable sv_output_folding, help={"n-fold rotational average. 1=no averaging."} SetVariable sv_output_horizon, size={98,16}, bodyWidth=60, title="horizon" SetVariable sv_output_horizon, limits={1,90,1}, value= root:packages:pearl_anglescan_panel:output_horizon SetVariable sv_output_horizon, help={"highest theta to display"} PopupMenu pm_graph_projection, size={149,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_projection, title="projection" PopupMenu pm_graph_projection, mode=2, popvalue="stereographic", value= #"\"equidistant;stereographic;equal area;gnomonic;orthographic;\"" PopupMenu pm_graph_projection, help={"projection (theta mapping) mode"} PopupMenu pm_graph_mode, size={129,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_mode,title="mode" PopupMenu pm_graph_mode, mode=2, popvalue="polar plot", value= #"\"none;polar plot;none;image;\"" PopupMenu pm_graph_mode, help={"graph mode"} Button b_output_calc, size={80,20}, proc=PearlAnglescanPanel#bp_output_calc, title="calc + display" Button b_output_calc, help={"execute data processing with the enabled filters and display the diffractogram."} Button b_output_duplicate, size={80,20}, proc=PearlAnglescanPanel#bp_output_duplicate, title="duplicate ..." Button b_output_duplicate, help={"copy the result to an arbitrary data folder."} Button b_output_itx, size={80,20}, proc=PearlAnglescanPanel#bp_output_itx, title="save ITX ..." Button b_output_itx, help={"save the result to an igor text file (itx)."} Button b_output_etpi, size={80,20}, proc=PearlAnglescanPanel#bp_output_etpi, title="save ETPI ..." Button b_output_etpi, help={"save the result to a pmsco angle scan file (etpi)."} GroupBox gb_graph, title="graph" PopupMenu pm_graph_colortable, size={152,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_colortable, title="color table" PopupMenu pm_graph_colortable, mode=0, value= #"\"*COLORTABLEPOPNONAMES*\"" PopupMenu pm_graph_colortable, help={"color table to use in pseudocolor graphs."} SetVariable sv_graph_contrast, size={119,16}, bodyWidth=60, title="contrast (%)" SetVariable sv_graph_contrast, limits={0,25,1}, value= root:packages:pearl_anglescan_panel:graph_contrast SetVariable sv_graph_contrast, help={"contrast value (percentile)."} Button b_graph_update, size={80,20}, proc=PearlAnglescanPanel#bp_graph_update, title="update" Button b_graph_update, help={"update the existing graph."} Button b_graph_png, size={80,20}, proc=PearlAnglescanPanel#bp_graph_png, title="save PNG ..." Button b_graph_png, help={"save the graph in png format."} arrange_controls() update_menus() end static function arrange_controls() dfref df = $(package_path) svar /sdfr=df panel_name variable gb_space = 2 variable gb_internal_top = 20 variable gb_internal_bot = 8 variable line_space = 26 variable cb_adj = 2 variable sv_adj = 2 variable pm_adj = 0 variable b_adj = 0 variable tb_adj = 0 variable gb_top = 4 variable gb_ht = 0 // ht = line + 30 // gb = gb + ht + 2 // cb = gb + 18 // pm = gb + 38 // line += 26 // sv = line + 2 GroupBox gb_source,pos={4,gb_top} gb_ht = gb_internal_top Button b_source_select,pos={17, gb_top + gb_ht + b_adj},size={50,20} gb_ht += line_space TitleBox tb_source_path,pos={18, gb_top + gb_ht + tb_adj},size={240,21} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_source, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_offsets,pos={4,gb_top} gb_ht = gb_internal_top SetVariable sv_theta_offset,pos={46, gb_top + gb_ht + sv_adj},size={88,16} gb_ht += line_space SetVariable sv_tilt_offset,pos={60, gb_top + gb_ht + sv_adj},size={74,16} gb_ht += line_space SetVariable sv_phi_offset,pos={56, gb_top + gb_ht + sv_adj},size={78,16} gb_ht += line_space SetVariable sv_alpha_offset,pos={44, gb_top + gb_ht + sv_adj},size={90,16} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_offsets, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_crop_alpha,pos={4,gb_top} gb_ht = gb_internal_top CheckBox cb_crop_alpha_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14} gb_ht += line_space SetVariable sv_crop_alpha_value,pos={44, gb_top + gb_ht + sv_adj},size={90,16} Button b_crop_alpha_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_crop_alpha, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_norm_alpha,pos={4,gb_top} gb_ht = gb_internal_top CheckBox cb_norm_alpha_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14} gb_ht += line_space PopupMenu pm_norm_alpha_mode,pos={36, gb_top + gb_ht + pm_adj},size={138,21} Button b_norm_alpha_check,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space SetVariable sv_norm_alpha_smoothing,pos={22, gb_top + gb_ht + sv_adj},size={112,16} Button b_norm_alpha_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_norm_alpha, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_norm_phi,pos={4,gb_top} gb_ht = gb_internal_top CheckBox cb_norm_phi_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14} Button b_norm_phi_check,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space SetVariable sv_norm_phi_range,pos={15, gb_top + gb_ht + sv_adj},size={118,16} Button b_norm_phi_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_norm_phi, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_norm_theta,pos={4,gb_top} gb_ht = gb_internal_top CheckBox cb_norm_theta_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14} gb_ht += line_space PopupMenu pm_norm_theta_mode,pos={35, gb_top + gb_ht + pm_adj},size={138,21} Button b_norm_theta_check,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space SetVariable sv_norm_theta_smoothing,pos={21, gb_top + gb_ht + sv_adj},size={112,16} Button b_norm_theta_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_norm_theta, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_norm_thetaphi,pos={4,gb_top} gb_ht = gb_internal_top CheckBox cb_norm_thetaphi_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14} gb_ht += line_space PopupMenu pm_norm_thetaphi_mode,pos={35, gb_top + gb_ht + pm_adj},size={138,21} Button b_norm_thetaphi_check,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space SetVariable sv_norm_thetaphi_smoothing,pos={21, gb_top + gb_ht + sv_adj},size={112,16} Button b_norm_thetaphi_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_norm_thetaphi, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_output,pos={4,gb_top} gb_ht = gb_internal_top SetVariable sv_output_folding,pos={38, gb_top + gb_ht + sv_adj},size={95,16} Button b_output_calc,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space SetVariable sv_output_horizon,pos={35, gb_top + gb_ht + sv_adj},size={98,16} Button b_output_duplicate,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space PopupMenu pm_graph_projection,pos={24, gb_top + gb_ht + pm_adj},size={149,21} Button b_output_itx,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space PopupMenu pm_graph_mode,pos={44, gb_top + gb_ht + pm_adj},size={129,21} Button b_output_etpi,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_output, size={272,gb_ht} gb_top += gb_ht + gb_space GroupBox gb_graph,pos={4,gb_top} gb_ht = gb_internal_top PopupMenu pm_graph_colortable,pos={21, gb_top + gb_ht + pm_adj},size={152,21} Button b_graph_update,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space SetVariable sv_graph_contrast,pos={14, gb_top + gb_ht + sv_adj},size={119,16} Button b_graph_png,pos={186, gb_top + gb_ht + b_adj},size={80,20} gb_ht += line_space gb_ht += gb_internal_bot GroupBox gb_graph, size={272,gb_ht} end /// update the popup menus to reflect the values of the global variables /// static function update_menus() dfref df = $(package_path) svar /sdfr=df panel_name if (wintype(panel_name) == 7) variable m nvar /sdfr=df norm_alpha_mode m = norm_alpha_mode + 1 PopupMenu pm_norm_alpha_mode win=$panel_name, mode=m nvar /sdfr=df norm_theta_mode m = norm_theta_mode + 1 PopupMenu pm_norm_theta_mode win=$panel_name, mode=m nvar /sdfr=df norm_thetaphi_mode m = norm_thetaphi_mode + 1 PopupMenu pm_norm_thetaphi_mode win=$panel_name, mode=m nvar /sdfr=df graph_mode m = graph_mode + 1 PopupMenu pm_graph_mode win=$panel_name, mode=m nvar /sdfr=df graph_projection m = graph_projection + 1 PopupMenu pm_graph_projection win=$panel_name, mode=m svar /sdfr=df graph_colortable m = 1 + WhichListItem(graph_colortable, CTabList()) PopupMenu pm_graph_colortable win=$panel_name, mode=m endif end static function bp_source_select(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up dfref dfBefore = GetDataFolderDFR() Execute /q/z "CreateBrowser prompt=\"Select 2D holo scan wave\", showWaves=1, showVars=0, showStrs=0" dfref dfAfter = GetDataFolderDFR() SetDataFolder dfBefore SVAR list = S_BrowserList NVAR flag = V_Flag if ((flag != 0) && (ItemsInList(list) >= 1)) string wname = StringFromList(0, list) wave w = $wname asp_import_raw(w) endif break case -1: // control being killed break endswitch return 0 End static function bp_norm_alpha_check(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up check_norm_alpha() break case -1: // control being killed break endswitch return 0 End static function bp_norm_theta_check(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up check_norm_theta() break case -1: // control being killed break endswitch return 0 End static function bp_norm_phi_check(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up check_norm_phi() break case -1: // control being killed break endswitch return 0 End static function bp_norm_thetaphi_check(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up check_norm_thetaphi() break case -1: // control being killed break endswitch return 0 End static function bp_crop_alpha_preview(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up preview_crop_alpha() break case -1: // control being killed break endswitch return 0 End static function bp_norm_alpha_preview(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up preview_norm_alpha() break case -1: // control being killed break endswitch return 0 End static function bp_norm_phi_preview(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up preview_norm_phi() break case -1: // control being killed break endswitch return 0 End static function bp_norm_theta_preview(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up preview_norm_theta() break case -1: // control being killed break endswitch return 0 End static function bp_norm_thetaphi_preview(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up preview_norm_thetaphi() break case -1: // control being killed break endswitch return 0 End static function bp_output_calc(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up asp_calculate_output() asp_display_output() break case -1: // control being killed break endswitch return 0 End static function bp_output_duplicate(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up string dest_folder prompt dest_folder, "destination folder name (relative to data source)" doprompt "duplicate", dest_folder if (!v_flag) asp_duplicate_output(dest_folder) endif break case -1: // control being killed break endswitch return 0 End static function bp_output_etpi(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up dfref df = $(package_path) wave /sdfr=df process_data variable ekin ekin = NumberByKey("KineticEnergy", note(process_data), "=", "\r") prompt ekin, "kinetic energy" doprompt "save etpi", ekin if (!v_flag) asp_save_output_etpi(ekin) endif break case -1: // control being killed break endswitch return 0 End static function bp_output_itx(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up asp_save_output_itx() break case -1: // control being killed break endswitch return 0 End static function bp_graph_update(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up asp_update_graph() break case -1: // control being killed break endswitch return 0 End static function bp_graph_png(ba) : ButtonControl STRUCT WMButtonAction &ba switch( ba.eventCode ) case 2: // mouse up dfref df = $(package_path) svar /sdfr=df source_path svar /sdfr=df output_graphname if (WinType(output_graphname) == 1) SavePICT /WIN=$output_graphname /E=-5 /B=144 /TRAN=0 endif break case -1: // control being killed break endswitch return 0 End static function pmp_norm_alpha_mode(pa) : PopupMenuControl STRUCT WMPopupAction &pa switch( pa.eventCode ) case 2: // mouse up dfref df = $(package_path) nvar /sdfr=df norm_alpha_mode norm_alpha_mode = pa.popNum - 1 break case -1: // control being killed break endswitch return 0 End static function pmp_norm_theta_mode(pa) : PopupMenuControl STRUCT WMPopupAction &pa switch( pa.eventCode ) case 2: // mouse up dfref df = $(package_path) nvar /sdfr=df norm_theta_mode norm_theta_mode = pa.popNum - 1 break case -1: // control being killed break endswitch return 0 End static function pmp_norm_thetaphi_mode(pa) : PopupMenuControl STRUCT WMPopupAction &pa switch( pa.eventCode ) case 2: // mouse up dfref df = $(package_path) nvar /sdfr=df norm_thetaphi_mode norm_thetaphi_mode = pa.popNum - 1 break case -1: // control being killed break endswitch return 0 End static function pmp_graph_mode(pa) : PopupMenuControl STRUCT WMPopupAction &pa switch( pa.eventCode ) case 2: // mouse up dfref df = $(package_path) nvar /sdfr=df graph_mode graph_mode = pa.popNum - 1 break case -1: // control being killed break endswitch return 0 End static function pmp_graph_projection(pa) : PopupMenuControl STRUCT WMPopupAction &pa switch( pa.eventCode ) case 2: // mouse up dfref df = $(package_path) nvar /sdfr=df graph_projection graph_projection = pa.popNum - 1 break case -1: // control being killed break endswitch return 0 End static function pmp_graph_colortable(pa) : PopupMenuControl STRUCT WMPopupAction &pa switch( pa.eventCode ) case 2: // mouse up dfref df = $(package_path) svar /sdfr=df graph_colortable graph_colortable = StringFromList(pa.popNum - 1, CTabList()) asp_update_graph() break case -1: // control being killed break endswitch return 0 End