Image Processing https://www.wavemetrics.com/ en Image Explorer for ScanImage https://www.wavemetrics.com/node/22059 Image Explorer for ScanImage<span><a title="View user profile." href="/user/ben-murphy-baum" lang="" about="/user/ben-murphy-baum" typeof="schema:Person" property="schema:name" datatype="">Ben Murphy-Baum</a></span> <span>Tue, 02/28/2023 - 05:24 pm</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> <span class="entity-reference"><a href="/taxonomy/term/41" hreflang="en">User Interface</a></span> <span class="entity-reference"><a href="/taxonomy/term/48" hreflang="en">Visualization/Gizmo</a></span> </span> <span class="body"><h2>Visualization of time-varying fluorescence</h2> <p>Image Explorer is a data visualization tool for 3D image stacks. It includes tools for navigating and selecting images, signal playback, image contrast controls, max projection, and for visualizing time-varying fluorescence data by mousing over different areas of an image stack.</p> <p><img alt="" data-entity-type="file" data-entity-uuid="29f15565-7cab-4e73-84cb-776128cf7440" height="632" src="/sites/www.wavemetrics.com/files/users/user15290/ImageExplorer_Example3.png" width="1000" /></p> <h2>ScanImage tiffs</h2> <p>Image Explorer includes a loader designed specifically for loading complex .tif formats produced by ScanImage microscopy software. Although only ScanImage files can be loaded, the visualization tools will work on any 3D wave, as long as it is in the expected folder structure within Igor. See the header in the .ipf file for instructions on use, etc. </p> <p>There are likely some imaging configurations that will fail to load properly, however the following configurations of time-varying frame scans are currently supported:</p> <ul> <li>Multiple channels</li> <li>Multiple scan fields</li> <li>Multiple z positions (e.g. using fast-z functionality from an electrically tunable lens (ETL) or a lens with a piezo-electric actuator</li> <li>Z stacks with multiple frames per z position </li> </ul> <p>ScanImage interleaves channels, scan fields, and z positions in its .tif specification, so Image Explorer's primary job is to separate that data into multiple output waves for the user. </p> <h2>ROI Creation</h2> <p>Image Explorer is capable of defining regions of interest for further analysis. Currently those ROI boundaries are saved in root:Packages:NeuroToolsPlus:ScanImage:ROIs for the user to then do what they want with them. Future updates will probably allow automatic fluorescence extraction of ROIs. This is already a feature of the NeuroTools analysis package (with ScanImage add-on package installed), so that is currently the better option for subsequent analysis using ROIs. </p> <p><img alt="" data-entity-type="file" data-entity-uuid="8a62f25f-3dce-4d3d-8e24-e342d95d0500" height="492" src="/sites/www.wavemetrics.com/files/users/user15290/ImageExplorer_ROIs.png" width="600" /></p> <h3>Using Image Explorer</h3> <p>ImageExplorer.ipf goes in User Procedures or Igor Procedures.</p> <p>Open Image Explorer through the 'Analysis' menu in Igor.</p> <p>Important note:  Image Explorer requires the JSON xop provided by byte-physics (<a href="https://www.wavemetrics.com/node/20976">https://www.wavemetrics.com/node/20976</a>), so this must also be installed</p></span> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">8.00.x</span> </span> <section class="comment-section"> <article data-comment-user-id="748" id="comment-23794" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/748"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">thomas_braun</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1677672563"></mark> <span class="comment-body"><p>Nice to our JSON XOP being used!</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=23794&amp;1=default&amp;2=en&amp;3=" token="_cV89cnjgzTsCkcxirlnAC_A_1U5bwqHtCjN75AsK40"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">March 1, 2023 at 04:09 am - <a href="/comment/23794#comment-23794" hreflang="en">Permalink</a></p> </article> </section> Wed, 01 Mar 2023 01:24:00 +0000 Ben Murphy-Baum 22059 at https://www.wavemetrics.com OpticalFlow https://www.wavemetrics.com/node/21936 OpticalFlow <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> </span> <span><a title="View user profile." href="/user/morten" lang="" about="/user/morten" typeof="schema:Person" property="schema:name" datatype="">morten</a></span> <span>Sat, 07/23/2022 - 02:08 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> </span> <span class="body"><p>This XOP wraps <a href="https://opencv.org">openCV</a> to provide dense optical flow calculations in Igor Pro.</p> <p>Two algorithms have been wrapped: Farneback optical flow (<em>OpticalFlowFarneback</em>) and Dense Inverse Search (DIS) optical flow (<em>OpticalFlowDIS</em>). For details, please see the attached help file (Optical Flow.ihf) and the openCV documentation.</p> <p><strong>Installation</strong></p> <p>On macOS, simply copy the <em>OpticalFlow-64.xop</em> to the <em>Igor Extensions (64-bit) </em>folder<em>. </em></p> <p>On Windows, also copy <em>OpticalFlow-64.xop</em> to the <em>Igor Extensions (64-bit) </em>folder<em>.</em> In addition, you need to obtain the <em>opencv_world460.dll</em> file from the openCV 4.6 release, which can be downloaded from the openCV <a href="https://opencv.org">website</a>. Place this file next to <em>OpticalFlow-64.xop</em> in the <em>Igor Extensions (64-bit)</em> folder.</p> <p><strong>Usage</strong></p> <p>The OpticalFlow.pxp sample experiment and OpticalFlow.ipf procedure file provide an example how to visualize optical flow fields in Igor Pro. </p> <p><img alt="" data-entity-type="file" data-entity-uuid="440a1270-d785-4f35-87f2-80c771dc4cef" height="300" src="/sites/www.wavemetrics.com/files/users/user13450/images.gif" width="300" /></p> <p> </p> <p><img alt="" data-entity-type="file" data-entity-uuid="12aa8c31-1395-40f2-9a33-c5f1f48e1fe7" height="447" src="/sites/www.wavemetrics.com/files/users/user13450/flow.jpg" width="447" /></p> <p><strong>Limitations</strong></p> <p>The XOP only work with unsigned 8-bit  images. Please convert your images beforehand, adjusting contrast etc. as required.</p> <p> </p> <p><strong>General Remarks</strong></p> <p>The XOP was built using XOP Toolkit 8.0 in Xcode 13.4.1 and Visual Studio 2019. <a href="https://github.com/shinjukunian/OpticalFlowXOP">Please see the project on Github for details.</a> </p> <p> </p></span> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">9.00.x</span> <span class="entity-reference">8.00.x</span> </span> <a href="https://github.com/shinjukunian/OpticalFlowXOP" target="_blank">View Homepage</a> MIT <a href="https://github.com/shinjukunian/OpticalFlowXOP" target="_blank">https://github.com/shinjukunian/OpticalFlowXOP</a> <section class="comment-section"> </section> Sat, 23 Jul 2022 09:08:04 +0000 morten 21936 at https://www.wavemetrics.com Spectra Image Profile - Create profiles from, normalize and edit 2D / 3D spectral data https://www.wavemetrics.com/node/21549 Spectra Image Profile - Create profiles from, normalize and edit 2D / 3D spectral data <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> </span> <span><a title="View user profile." href="/user/chozo" lang="" about="/user/chozo" typeof="schema:Person" property="schema:name" datatype="">chozo</a></span> <span>Mon, 02/15/2021 - 07:44 pm</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/49" hreflang="en">Analysis</a></span> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> <span class="entity-reference"><a href="/taxonomy/term/41" hreflang="en">User Interface</a></span> <span class="entity-reference"><a href="/taxonomy/term/40" hreflang="en">Utilities</a></span> </span> <span class="body"><p>This project provides tools for working on 2D spectral data or layers of 3D data, and was inspired by the WaveMetrics Image Line Profile procedure (now replaced by the internal Line Profile tool). The basic functionality is similar to the official tool at first glance, but this project has many convenient features tailored for spectroscopic data such as detector images, two-dimensional scans or intensity maps. The main functionality is the horizontal or vertical data integration between two region-of-interest (ROI) lines to create a profile, which can be saved, compared or even used to modify the data itself. Other functions (such as normalization) are applied directly to the 2D data or layer. <strong>The tool works directly on the input data, but a backup is saved upon start.</strong> Several tools to work on 1D-3D data are included as well.</p> <p>I tried my best to test everything thoroughly, but users should verify the correct behavior for critical applications. Bug reports and suggestions for new features are always welcome.<em> Special thanks to Oleg Dyachok from Uppsala University for suggesting and testing improvements for version 4.0 and beyond.</em></p> <h2>User Interface controls</h2> <p>To start, select a 2D or 3D wave in the Data Browser and then go to <strong>‘Spectra Tools’ -&gt; ‘Image Profile …’</strong> in the top menu. Or use the command line:</p> <span class="geshifilter"><code class="igor geshifilter-igor">SpectraProfile<span style="color: #000000;">&#40;</span>inputWave<span style="color: #000000;">&#41;</span></code></span> <p>A quick overview of all controls can be found below:</p> <p><img alt="" data-entity-type="file" data-entity-uuid="cb2de051-5331-4829-8be1-68a7224bcb7d" height="566" src="/sites/www.wavemetrics.com/files/users/user1029/ImagePr_manual_ver4.25.png" width="840" /></p> <h3>Line profile controls</h3> <ul> <li>The profile can be calculated in <strong>horizontal (h key) or vertical (v key) direction</strong>. Diagonal or free-form modes (like in the Line Profile tool) are not available.</li> <li>The Region-of-Interest (ROI) lines can be modified via the control variables, by dragging the lines directly with the mouse on the image or by using the cursor keys on the keyboard (holding the <strong>shift key</strong> speeds up movements by 4x and the <strong>ctrl / command key</strong> slows down movement by 1/2). Holding <strong>both the ctrl / command and shift keys</strong> slows the movement down to one delta unit (one row / column) for precise placement.</li> <li>To instantly go to the <strong>full (minimal) ROI </strong>width use the respective check boxes or use the <strong>page up / page down keys</strong>.</li> <li><strong>Normalize Profile:</strong> The profile (not the image) will be normalized to fall between 0 and 1.</li> <li><strong>Mouse Csr Profile:</strong> An additional profile appears for comparison, which shows the current row or column under the mouse cursor<strong> </strong>(toggle with the m key). This profile is not saved.</li> <li><strong>Snap Lines to Grid:</strong> The ROI line positions are constrained to include only full rows / columns.</li> </ul> <h3>The Save Profile and Snapshot buttons</h3> <p>The Save profile button saves the current profile next to the input data using a name ending which depends on the selected range. The ending is of the format “_H(xxx-xxx)” (horizontal mode) or “_V(xxx-xxx)” (vertical mode), where xxx give the start and end of the current range, e.g., “mydata_H(16.7-19.3)”. If the full image is selected the ending will be just “_prH” or “_prV”, respectively. Holding the shift key while pressing the button will lock the ending to “_prH” / “_prV” regardless of the selected range. The range and width is always saved inside the output wave’s note.</p> <p>The Snapshot button will instead create and display a backup of the current profile for comparison. Each button press updates this snapshot to the current one. This profile will not be saved.</p> <h3>Undoing changes to the 2D / 3D data</h3> <ul> <li><strong>Undo All:</strong> Resets all changes made to the 2D/3D data and returns to the condition at start.</li> <li><strong>Undo Last:</strong> Reverts the last change made to the 2D/3D data by invoking a function. This will only work once and will not undo multiple steps.</li> <li><strong>Accept &amp; Quit:</strong> Closes the window while keeping all edits made to the 2D/3D data so far.</li> <li><strong>Save as:</strong> Saves the 2D/3D data under a different name and undoes all edits made to the original data.</li> </ul> <h3>Normalization buttons</h3> <p>These functions work on the current layer. Currently, three normalization functions are implemented:</p> <ul> <li><strong>Div. by Profile:</strong> This divides the 2D image by the current profile (each column in horizontal mode and each row in vertical mode, respectively). The profile is slightly smoothed before the division to avoid amplifying noise. Holding the <strong>ctrl / command</strong> key while pressing the button prevents this smoothing step. See further below how to modify the smoothing parameter.</li> <li><strong>Each Maximum:</strong> Finds the maximum of each row (horizontal mode) or each column (vertical mode) and divides the row / column by this value. This is useful, for example, to equalize the data in one direction (use the Keep avg. Int. checkbox to prevent downscaling of the data to 1)</li> <li><strong>A user-defined button (here labeled ‘Ring Currrent’):</strong> Normalize by user provided information. This can be any data parameter or wave saved in the current experiment. Examples are normalization by a secondary readout, time, concentration etc. See the last section on how to define your own functionality here.</li> <li><strong>Keep average Int. checkbox:</strong> This will preserve the average intensity when normalizing the 2D data. Normalization involves division by some normalization term, which reduces the intensity. This checkbox will rescale the data back to the intensity level before normalization.</li> </ul> <h3>The Delete ROI Section button</h3> <p>This button removes the columns (horizontal) or rows (vertical) inside the Region Of Interest. If the data at the beginning of the wave is removed, the scaling is adjusted to account for the deleted points. However, if data in the center is removed the scaling cannot be adjusted, since a waves scaling must be always linear and continuous. Be aware that this may lead to a mismatch between the image data and the scaling. If the scaling is important (e.g., a continuous energy scale), either refrain from using this feature or take care to only remove sections at the edges. If 3D data is edited, this will delete the selected columns or rows on all layers.</p> <h3>The Subtract Profile button</h3> <p>The current profile will be subtracted from each column (horizontal mode) or row (vertical mode) of the 2D image or current layer of 3D data. This can be used, for example, to remove constant features from a measurement which appear undisturbed in part of the data and thus can be selected with the ROI lines.</p> <p>This button has an additional functionality <em>only in horizontal mode</em>: The spectrum can be shifted each column step according to the Y-axis delta. In other words, each increasing column the Y-scale delta value is added to (or subtracted from) the profile’s x scaling, which subtracts the profile in <em>diagonal</em> direction. This is useful to subtract features which change with the parameter on the Y scale like, for example, spectral features moving with increasing photon energy.</p> <ul> <li>Hold <strong>ctrl / command</strong> to subtract the profile along <strong>increasing Y delta values</strong>.</li> <li>Hold <strong>alt / option</strong> to subtract the profile along <strong>decreasing Y delta values</strong>.</li> </ul> <p>Below example shows the diagonal subtraction result:</p> <p><img alt="" data-entity-type="file" data-entity-uuid="102b1734-043e-4c42-b537-5790251a2352" height="282" src="/sites/www.wavemetrics.com/files/users/user1029/ImagePr_diagonal%20example.jpg" width="578" /></p> <h3>The Shift +/- buttons</h3> <p>These two buttons only work horizontally (regardless of the selected mode) and are used to add or subtract the Y-axis scale from the X-axis. All layers of 3D data are processed. In other words, the X-scaling of each column is adjusted by its respective Y-scaling value; the data is recalculated into a parallelogram. This will straighten features in the data which were changing with increasing Y values. An example would be a photon-energy (Y) scan of a spectrum where certain spectral features increase in their (X) emission energy. Subtracting the photon energy scale from a photoelectron spectrum in a kinetic energy scale would give binding energy, while adding the photon energy scale reverts back to kinetic energy. The effect is illustrated again with above example data:</p> <p><img alt="" data-entity-type="file" data-entity-uuid="232e657b-94d0-475a-86b8-fe40301c1291" height="280" src="/sites/www.wavemetrics.com/files/users/user1029/ImagePr_shift%20example.jpg" width="500" /></p> <p>Hold <strong>ctrl / command</strong> to cut partial data after the shift has been applied (the parallelogram is cut back into a rectangle). Note that this might fail if there is not even one complete row of data left (the skew of the parallelogram is too large to fit a rectangle inside).</p> <h3>Align Features functionality</h3> <p>This algorithm looks for similar features of each column (horizontal mode) or row (vertical mode) of the 2D image or current layer of 3D data and tries to align these features for maximum overlap by shifting each column / row by a certain amount. The algorithm uses wave correlation and shifts the data in whole point steps (no interpolation) or sub-steps (interpolated) when the <strong>Sub-steps</strong> checkbox is enabled. This can be used, for example, to correct slight shifts of peaks in a spectrum or to estimate the shift of a peak versus some other parameter like time or position:</p> <p><img alt="" data-entity-type="file" data-entity-uuid="f96bb5b8-6b97-4ff5-986b-7dff870bd4b5" height="273" src="/sites/www.wavemetrics.com/files/users/user1029/ImagePr_align%20example.jpg" width="571" /></p> <p>The algorithm uses the first column (bottom to top in horizontal mode) or row (left to right in vertical mode) of the data as reference and tries to align all other columns / rows to this reference. Hold <strong>shift</strong> to use the last row / column instead (top to bottom in horizontal mode and right to left in vertical mode).</p> <p>Often, it is not desired to align to the full data with lots of different features. Setting the A and/or B cursors onto the image will limit the range from which the reference is selected to maximize overlap with only one selected feature. This might still fail if many similar features are present.</p> <p>Activate <strong>Smooth </strong>to smooth the data before aligning. This can improve the results for noisy data.</p> <p>Activate <strong>Align Edges</strong> to search for maximum overlap of edge features instead of peak features. The derivative of the data is used for this purpose.</p> <p>The <strong>Substeps feature</strong> is activated by default, which aligns features in steps smaller than the distance of data points, <em>i.e.</em>, by using interpolation. Deactivating this feature by unchecking the checkbox will instead move data in integer steps.</p> <p>Activate <strong>Output Shift Result</strong> to write the shift values into a wave with the name ending "_shft". The output is scaled by the 2D data’s wave scaling.</p> <p>Note that the algorithm is ‘dumb’ in a sense that it only looks for the maximum correlation and not if peak features really match etc. In the worst case this just aligns artifacts such as noise.</p> <h3>Image contrast and color controls</h3> <p>You can choose the used <strong>color table</strong> and adjust the contrast of the image or currently selected layer by using the drop-down menu and the adjustment sliders. Select the desired color table and slide the <strong>Min</strong> and <strong>Max</strong> controls until the contrast is as desired. The sliders only have a range between the maximum and minimum data value of the image or currently selected layer, so the contrast cannot be reduced further, only increased. If you reverse the position of the Min and Max sliders then the colors of the image will be inverted. Check the <strong>log scale</strong> checkbox to switch to a logarithmic scale for both the image and profile. Switching to this mode will not work if the data only contains negative or zero values.</p> <p> </p> <h2>Additional controls for 3D data (volumes)</h2> <h3>Layer and Merge controls</h3> <p>The <strong>Layer</strong> setting chooses the currently displayed layer of a 3D data set. The profile will only be created from this layer and most functions for editing data will only act on this one layer (there are exceptions like Delete ROI Section and Shift). The <strong>Delete </strong>button will delete the currently shown layer. The <strong>Merge All </strong>button will merge all (remaining) layers into a single 2D image which can then be worked on further. This can be reverted by using the Undo buttons. The scaled position of the current layer will be displayed in the top-right corner of the image.</p> <h3>Displaying profiles from all layers</h3> <p>Activating <strong>Multiple Profiles</strong> will show profiles of all layers, which are generated from the current ROI, simultaneously for comparison with the main profile from the current layer (shown in a bold line). This is useful, for example, to follow small changes in signal throughout the layers. The <strong>Separation</strong> control can be used to change the vertical spacing between the profiles. This spacing is in percent of the maximum y value. These profiles will also be saved in a wave with the ending "_map". The maximum number of profiles (layers) for this functionality is 100.</p> <p>Clicking <strong>Display Z-Profile</strong> will open a small graph which plots the change of intensity in z- (i.e., layer-) direction. This can be useful to track variations across layers. The type of information displayed can be changed via the pop-up menu. Currently average, maximum or minimum intensity can be selected.</p> <h3>Rotating a 3D volume</h3> <p>3D data can be rotated by 90 degrees around the principal axes x,y,z in clockwise and counter-clockwise direction. Use the designated buttons at the bottom of the panel for this purpose. Rotations can be undone using the Undo buttons. After rotation the top-most layer is displayed at the beginning. If the layer is empty (only zeros) then the image might look all white. This is no bug, but the normal way how empty layers are displayed. Rotation might reverse the x- and/or y-axes, depending on the new orientation of the volume's contents. For this reason, the data might 'look reversed' when displayed in a normal image plot.</p> <p> </p> <h2>Quick access functions in the menu</h2> <p>Some useful functions are available in the Spectra Tools menu:</p> <ul> <li><strong>Append 1D,2D Datasets into 2D Data:</strong> Combines the columns (Y dimension) of multiple datasets (e.g., multiple measurements) into one consecutive 2D data wave. The X dimension is extended to cover the full X range of all datasets if needed.</li> <li><strong>Stack 2D Datasets into 3D Data:</strong> Stacks multiple 2D spectra (e.g., MCP images) on top of each other to produce a 3D array.</li> <li><strong>Profile of 2D\3D Data:</strong> Same as creating a profile over the full data in horizontal or vertical mode using the profile panel. This will give 1D data for a 2D input, or 2D data or a 3D input. Hold <strong>shift</strong> while invoking the menu to define a sub-range in the respective dimension for profile generation.</li> <li><strong>2D Image from 3D Data:</strong> Sums 3D data in the layer (array) direction to give a 2D image (e.g., gives a sum of all MCP images of a 3D array).</li> <li><strong>Split Up 2D\3D Data:</strong> Separates 2D / 3D data into individual waves holding columns, rows or layers. The individual waves are saved in a folder with the name of the input.</li> </ul> <p>In Igor 9, these options are also available in the right-click menu of the data browser.</p> <p> </p> <h2>Creating profiles, splitting or combining data from the command line</h2> <p>Some quick access functions can be directly invoked. To create a profile use:</p> <span class="geshifilter"><code class="igor geshifilter-igor">QProfile<span style="color: #000000;">&#40;</span>input_wave, dimension <span style="color: #000000;">&#91;</span>,from ,to ,from_Point ,to_Point<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span></code></span> <p>Here dimension is an integer value from 0 to 2, with the meaning of 0 = vertical profile (average rows), 1 = horizontal profile (average columns), 2 = z profile (average layers). Use the optional 'from', 'to' or the 'from_Point', 'to_Point' values to define a sub-range in terms of scaled values or point values, respectively. If both types are specified the former takes precedence.</p> <p>Data can be split along a dimension via:</p> <span class="geshifilter"><code class="igor geshifilter-igor">QImageSplit<span style="color: #000000;">&#40;</span>input_wave, dimension<span style="color: #000000;">&#41;</span></code></span> <p>Here, the dimension parameter has the same meaning as above.</p> <p>To reduce the fidelity of data you can bin data points by using:</p> <span class="geshifilter"><code class="igor geshifilter-igor">QuickBinData<span style="color: #000000;">&#40;</span>input_wave, binX, binY, binZ<span style="color: #000000;">&#41;</span></code></span> <p>Here, binX, binY, binZ should be integer values greater or equal to 1, which decide by how much the data in the respective dimension is binned. For example, using binX = 2 will result in a wave with half of the points in the x (row) dimension. Data can be binned in multiple dimensions simultaneously.</p> <p>To combine data in the x- (rows), y- (column) or z- (layer) directions, use:</p> <span class="geshifilter"><code class="igor geshifilter-igor">QuickCombineData<span style="color: #000000;">&#40;</span>dimension, wave_list<span style="color: #000000;">&#41;</span></code></span> <p>The dimension parameter has the same meaning as above. wave_list is a string list of waves (use full paths if the waves are not in the current folder).</p> <p> </p> <h2>Procedure settings and user button code</h2> <p>The procedure header has two global constants which control the smoothing factor of …</p> <ul> <li><strong>kNormProfileSmooth:</strong> Sets the smoothing factor as an integer for profile normalization. The profile is smoothed by this factor before used for division with the 2D data.</li> <li><strong>kAlignSmooth:</strong> The initial smoothing factor applied to each row / column before the correlation is calculated. Useful to suppress noise. The factor can be adjusted at any time inside the panel.</li> </ul> <h3>The user-defined (normalization) button</h3> <p>Two functions and one global variable are used to provide the functionality for the user button:</p> <ul> <li><strong>kUserInfoBtnName:</strong> Defines the button’s label and can be changed to reflect the purpose of the button. This name should be short to fit inside the button.</li> <li><strong>Profile_ActivateUserInfoButton(inputWave):</strong> A function for checking whether the conditions for using the button are fulfilled. A return value of 1 activates, any other value disables the button. One could for example check here if the required information is contained in the 2D data or loaded in the current experiment.</li> <li><strong>Profile_ExecuteUserInfoButton(inputWave)</strong>: This function is called to do the normalization (or whatever you like to do here). Return a scaling factor for scaling the intensity to its average after the normalization step should the Keep average Int. checkbox be activated (returning 0 skips this step).</li> </ul> <p>You can modify the constant and the two functions directly at the beginning of the procedure file, but it is more convenient to provide your own code in a separate file or inside the experiment environment. Use the <strong>Override</strong> keyword in front of the Function / StrConstant statement to override the standard definitions inside the package. Have a look at the example implementation inside the project’s procedure, which is used to normalize the ring current of synchrotron experiments saved inside the 2D data itself.</p> <p>While the user button is intended for normalization, it is really a free-for-all button for any modification to the 2D data you may want. You could instead write a function which, for example, splits the image in half or applies an interpolation or does something completely different in each experiment file.</p> <p>The following code shows the current implementation of the user-definable normalization button:</p> <div class="geshifilter"><div class="igor geshifilter-igor" style="font-family:monospace;"><span style="color: #0000ff;">Static</span> <span style="color: #0000ff;">StrConstant</span> kUserInfoBtnName = <span style="color: #009c00;">&quot;Ring Current&quot;</span>&nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// the title of the user button</span><br /> <br /> <span style="color: #0000ff;">Static</span> <span style="color: #0000ff;">Function</span> Profile_ActivateUserInfoButton<span style="color: #000000;">&#40;</span>inwave<span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">Wave</span> inwave<br /> &nbsp; &nbsp; <span style="color: #0000ff;">Variable</span> activate = <span style="color: #000000;">0</span><br /> &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// +++ conditions for activation +++</span><br /> &nbsp; &nbsp; activate = <span style="color: #c34e00;">StringMatch</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">GetDimLabel</span><span style="color: #000000;">&#40;</span>inwave,<span style="color: #000000;">1</span>,<span style="color: #000000;">0</span><span style="color: #000000;">&#41;</span>,<span style="color: #009c00;">&quot;*mA*&quot;</span><span style="color: #000000;">&#41;</span>&nbsp; <span style="color: #ff0000; font-style: italic;">// check if dim-labels contain &quot;mA&quot; values</span><br /> &nbsp; &nbsp; activate = <span style="color: #c34e00;">StringMatch</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">note</span><span style="color: #000000;">&#40;</span>inwave<span style="color: #000000;">&#41;</span>,<span style="color: #009c00;">&quot;*ring current normalized*&quot;</span><span style="color: #000000;">&#41;</span>? <span style="color: #000000;">0</span> : activate&nbsp; <span style="color: #ff0000; font-style: italic;">// already normalized?</span><br /> &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// +++</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">return</span> activate <span style="color: #ff0000; font-style: italic;">// return 1 to activate button</span><br /> <span style="color: #0000ff;">End</span><br /> <br /> <span style="color: #0000ff;">Static</span> <span style="color: #0000ff;">Function</span> Profile_ExecuteUserInfoButton<span style="color: #000000;">&#40;</span>inwave<span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">Wave</span> inwave<br /> &nbsp; &nbsp; <span style="color: #0000ff;">Variable</span> valAvg = <span style="color: #000000;">0</span><br /> &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// +++ ring current normalization procedure +++</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">Variable</span> <span style="color: #c34e00;">i</span>, value<br /> &nbsp; &nbsp; <span style="color: #0000ff;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #c34e00;">i</span> = <span style="color: #000000;">0</span>; <span style="color: #c34e00;">i</span> <span style="color: #000000;">&lt;</span> <span style="color: #c34e00;">DimSize</span><span style="color: #000000;">&#40;</span>inwave,<span style="color: #000000;">1</span><span style="color: #000000;">&#41;</span>; <span style="color: #c34e00;">i</span> += <span style="color: #000000;">1</span><span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">String</span> Currlabel = <span style="color: #c34e00;">GetDimLabel</span><span style="color: #000000;">&#40;</span>inwave,<span style="color: #000000;">1</span>,<span style="color: #c34e00;">i</span><span style="color: #000000;">&#41;</span>&nbsp; <span style="color: #ff0000; font-style: italic;">// get the information from the column label</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #007575;">sscanf</span> Currlabel, <span style="color: #009c00;">&quot;%s (%f mA)&quot;</span>, Currlabel, value&nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// search for ring current info in the form &quot;time (XXX mA)&quot;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>value <span style="color: #000000;">!</span>= <span style="color: #000000;">0</span><span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inwave<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#91;</span><span style="color: #c34e00;">i</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">/</span>= value<br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">endif</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; valAvg += value <span style="color: #ff0000; font-style: italic;">// add the values for intensity re-normalization later</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">endfor</span><br /> &nbsp; &nbsp; valAvg <span style="color: #000000;">/</span>= <span style="color: #c34e00;">i</span>+<span style="color: #000000;">1</span><br /> &nbsp; &nbsp; <span style="color: #c34e00;">Note</span> inwave, <span style="color: #009c00;">&quot;ring current normalized&quot;</span>&nbsp; <span style="color: #ff0000; font-style: italic;">// write into note that the normalization has been done</span><br /> &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// +++</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">return</span> valAvg &nbsp; <span style="color: #ff0000; font-style: italic;">// return the intensity normalization factor</span><br /> <span style="color: #0000ff;">End</span></div></div> <p> </p></span> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">9.00.x</span> <span class="entity-reference">8.00.x</span> </span> <section class="comment-section"> <article data-comment-user-id="15087" id="comment-21200" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/15087"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Rob</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1613643573"></mark> <span class="comment-body"><p>Wow. That single handily replaces 90% of the scripts I use every day with one convenient panel!</p> <p>Thank you for sharing 😊</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=21200&amp;1=default&amp;2=en&amp;3=" token="iDtWkgu4FFxLGU4Pw4omGPiVkLyH1VC2tS-FVC8EKaU"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 18, 2021 at 02:19 am - <a href="/comment/21200#comment-21200" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-21216" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1613698229"></mark> <span class="comment-body"><p>Great to hear. Thank you for your comment! I think this tool saves me the most time as well (others are graph-related tools which I haven't put up here yet ;). I guess the other 10 % are specialized scripts only related to your field? Please let me know if there is a feature which would make your (and others) life easier.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=21216&amp;1=default&amp;2=en&amp;3=" token="WI7FVmYKRcLuj-w7HHTD5icdHNHWFNF7mM4Wd5TWi10"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 18, 2021 at 05:30 pm - <a href="/comment/21216#comment-21216" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="10776" id="comment-22789" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/10776"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">olelytken</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1648026981"></mark> <span class="comment-body"><p>I couldn't help noticing the images for the Subtract Profile and Shift +/- sections. Those images look very similar to the Auger-yield NEXAFS data that we were battling with for a long time. In the end we used an iterative process to split up the data into vertical NECAFS and diagonal XPS contributions. If you are working with the same problems you might be interested in the paper.</p> <p>"Removing photoemission features from Auger-yield NEXAFS spectra" <a href="https://doi.org/10.1016/j.elspec.2017.05.012">https://doi.org/10.1016/j.elspec.2017.05.012</a></p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=22789&amp;1=default&amp;2=en&amp;3=" token="8HhS1WAdQaDJYsN4p1WDQT1ySc-jx8RWNCd4idecPzU"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">March 23, 2022 at 02:16 am - <a href="/comment/22789#comment-22789" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-22790" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1648035501"></mark> <span class="comment-body"><p>Thank you for your comment and the link to the paper. I will take a look. Yes, this was exactly the reason for this functionality. The Subtract function relies on the fact that the XPS signal is present undisturbed in part of the scan and thus can be subtracted from the mixed image. We achieved this by simply measuring a sufficiently large range below the edge in question. This is of course complicated by second-order signal contributions, which are however often sufficiently small in our spectra. It might be interesting to add your approach to this package. What do you think?</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=22790&amp;1=default&amp;2=en&amp;3=" token="2Sc35gFiHuV_Kw4Q4veKXzs2i46Uz_BNpi7I1A8q4NY"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">March 23, 2022 at 04:38 am - <a href="/comment/22790#comment-22790" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="10776" id="comment-22792" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/10776"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">olelytken</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1648058268"></mark> <span class="comment-body"><p>I did notice you expanded the kinetic energies far enough to where the Auger peaks are gone. I guess there are still some secondary electrons left, but it's good enough to where you can extract a reasonable XPS spectrum and subtract it.</p> <p>If you want to try my approach out you can find it here <a href="http://www.wavemetrics.com/project/EccentricXPS">www.wavemetrics.com/project/EccentricXPS</a><br /> <br /> There is a pretty good help file and an example .pxp file you can test the cleanup procedure on. If you think it would fit into your package I would be happy to help you add it, but it's probably best if you test it first and see if you think it will fit.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=22792&amp;1=default&amp;2=en&amp;3=" token="SotJdwDdi0bR7uV6M7EFCAF4_QFnu-qbSEDjxzPpTJA"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">March 23, 2022 at 10:57 am - <a href="/comment/22792#comment-22792" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="10776" id="comment-22793" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/10776"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">olelytken</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1648059517"></mark> <span class="comment-body"><p>Load the examples file and run Photoemission Cleanup from the top menu</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=22793&amp;1=default&amp;2=en&amp;3=" token="LCwMluNe7Hpj6_QcsW8DVUCRBONtLK2HbC5XZK5nwcY"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">March 23, 2022 at 11:18 am - <a href="/comment/22793#comment-22793" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24320" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690527332"></mark> <span class="comment-body"><p>My packages supports menu keyboard shortcuts which are loaded from a settings file. If you want to add keyboard shortcuts to common menu entries, place the content (Spectra Tools settings.dat) of the attached zip file in the same folder as the package procedure and edit as necessary.</p></span> <div class="comment-file-wrapper"> <label>Attachments</label> <span class="field-comment-file"> <label>Attachment</label> <span class="file"><span class="file file--mime-application-zip file--package-x-generic"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2023-07/Spectra%20Tools%20settings_0.zip" type="application/zip; length=468">Spectra Tools settings_0.zip</a></span> </span> </span> </div> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24320&amp;1=default&amp;2=en&amp;3=" token="RoE6A6EpeqJY12tQLhZbY6xy9UNqTx08QmDYgh_YuCY"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 27, 2023 at 11:55 pm - <a href="/comment/24320#comment-24320" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="27309" id="comment-24582" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/27309"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Electron</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1699479900"></mark> <span class="comment-body"><p>This is great and thank you! Question, is it all possible to think about adding a Mode to visualize the 2D amplitudes across the layers in a 3D stack as they evolve with the Z-axis? Perhaps we could have it extract based on cursor location, or a specified Xmin-Xmax: Ymin-Ymax range that users change? I have data sets that display intensities over two frequencies (X &amp; Y) that then evolve over time (Z). So, I have codes that extract that data automatically from specified ROI or from every single point in the 3D waves. But this generates large amounts of waves and graphs just to visualize the data trends. Igor also has good extraction tools, but to my knowledge this still requires extracting and plotting to visualize the data. Overall, images/maps are great for visualizing peak changes with frequency and/or time - no doubt. However, I spend a lot of time analyzing intensity changes at specific points, looking for rate differences, oscillations, FFT residuals, and then restacking said residuals into images. </p> <p>Do you think adding a mode to visualize intensities plotted against the Z axis at specific X-Y coordinates is a feasible addition?! =)</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24582&amp;1=default&amp;2=en&amp;3=" token="MVS36HcE1yGQsd0uXSrCwAZ1FDC-126aQxDPsFffOQw"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">November 8, 2023 at 01:42 pm - <a href="/comment/24582#comment-24582" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24583" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1699508922"></mark> <span class="comment-body"><p>Hi Electron, Thank you for your message and feature suggestion. This sounds quite interesting. I think it would be possible to show the evolution of intensity as a function of z at the mouse location and/or integrated overt the region of interest between the red lines. I don't think it will be that easy to show the intensity based on an user-chosen sub-region (like a marquee), since there is no code to handle marquees yet. Would a display at the mouse location enough for you? Would you want to know the integrated or 2D variation (z vs. x or z.vs. y, which would be a 2D image)?</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24583&amp;1=default&amp;2=en&amp;3=" token="mUfJb_IBCNaLz3olXlSry6c0R2iEj0ylHZzFVjwSoPw"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">November 8, 2023 at 09:48 pm - <a href="/comment/24583#comment-24583" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="27309" id="comment-24584" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/27309"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Electron</span> </div> <div class="clearit"></div> </a></span> <p class="visually-hidden">In reply to <a href="/comment/24583#comment-24583" class="permalink" rel="bookmark" hreflang="en">Hi Electron, Thank you for…</a> by <a title="View user profile." href="/user/chozo" lang="" about="/user/chozo" typeof="schema:Person" property="schema:name" datatype="">chozo</a></p> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1699547525"></mark> <span class="comment-body"><p>Hi Chozo, thanks for your feedback. Displaying from the mouse location and/or integrated over a region would be very useful. I think showing the 2D variation over X or Y would be interesting additions. However, I initially had envisioned showing the intensity at the given point a specified 1D wave. I think even the option to just show the Z intensity against number of points (layers) as one moved the cursor around would be very helpful! I hope that makes sense, and I am happy to assist in anyway I can - although my programming skills are still young =).</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24584&amp;1=default&amp;2=en&amp;3=" token="feOc7CQUiqD0fgxXfmlczyEDZGjAKtLHhHuGI9vNMHc"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">November 9, 2023 at 08:32 am - <a href="/comment/24584#comment-24584" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24585" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1699584231"></mark> <span class="comment-body"><p>OK, attached is a start. You have to activate both 'Display z-Profile' and 'Mouse Profile' for now, since I have implemented only this one feature. Then you can move the mouse across any point to see the profile there. Regarding the integrated z-Profile, I am still unsure how to display this information, i.e., either as (fake) waterfall plot or image. What do you think?</p></span> <div class="comment-file-wrapper"> <label>Attachments</label> <span class="field-comment-file"> <label>Attachment</label> <span class="file"><span class="file file--mime-application-zip file--package-x-generic"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2023-11/Spectra%20Image%20Profile%20v231110.zip" type="application/zip; length=30279">Spectra Image Profile v231110.zip</a></span> </span> </span> </div> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24585&amp;1=default&amp;2=en&amp;3=" token="ZzRCGmZQerdp_WlD90uN5UsgLyllNn8MPrcbQfs0TCc"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">November 9, 2023 at 06:43 pm - <a href="/comment/24585#comment-24585" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24587" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1699596579"></mark> <span class="comment-body"><p>Nevermind, it was not so difficult to add a function to integrate the ROI in both x- and y- to create a z profile. Please try out the attached procedure and let me know if that is what you have envisioned.</p></span> <div class="comment-file-wrapper"> <label>Attachments</label> <span class="field-comment-file"> <label>Attachment</label> <span class="file"><span class="file file--mime-application-zip file--package-x-generic"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2023-11/Spectra%20Image%20Profile%20v231110b.zip" type="application/zip; length=30563">Spectra Image Profile v231110b.zip</a></span> </span> </span> </div> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24587&amp;1=default&amp;2=en&amp;3=" token="P0FAS4ZzK8CNzR1cF_cwNl91P81-xIJNPVNErhpag7c"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">November 9, 2023 at 10:09 pm - <a href="/comment/24587#comment-24587" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="27309" id="comment-24589" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/27309"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Electron</span> </div> <div class="clearit"></div> </a></span> <p class="visually-hidden">In reply to <a href="/comment/24587#comment-24587" class="permalink" rel="bookmark" hreflang="en">Nevermind, it was not so…</a> by <a title="View user profile." href="/user/chozo" lang="" about="/user/chozo" typeof="schema:Person" property="schema:name" datatype="">chozo</a></p> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1699632558"></mark> <span class="comment-body"><p>This works well - much obliged.  Scanning the cursor around to visualize z-profiles is seamless and prevents me from generating large amounts of waves. Thanks!</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24589&amp;1=default&amp;2=en&amp;3=" token="excsnQgIfmlPCQKyH97_lso41XuL_S2m_3n_ylF9KcE"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">November 10, 2023 at 08:09 am - <a href="/comment/24589#comment-24589" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24655" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1701940236"></mark> <span class="comment-body"><p>@Electron: I have now added this feature into the official version, although in a slightly different way as in the test version.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24655&amp;1=default&amp;2=en&amp;3=" token="tR5tvLsDPv5PzbdyI9d4eKdYfaM0oQsyU_iGPxxbtJs"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">December 7, 2023 at 01:10 am - <a href="/comment/24655#comment-24655" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="27309" id="comment-24656" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/27309"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Electron</span> </div> <div class="clearit"></div> </a></span> <p class="visually-hidden">In reply to <a href="/comment/24655#comment-24655" class="permalink" rel="bookmark" hreflang="en">@Electron: I have now added…</a> by <a title="View user profile." href="/user/chozo" lang="" about="/user/chozo" typeof="schema:Person" property="schema:name" datatype="">chozo</a></p> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1701965064"></mark> <span class="comment-body"><p>Thanks, Chozo - much appreciated.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24656&amp;1=default&amp;2=en&amp;3=" token="V9dICWtKJSTypMdaMuPK7hEm4K9pd5O3uZ9KSF5ZOx0"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">December 7, 2023 at 08:04 am - <a href="/comment/24656#comment-24656" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="11273" id="comment-24739" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/11273"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Mika</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707208873"></mark> <span class="comment-body"><p>Hi! This is a great code for spectra image analysis, many thanks! I have quite a silly question since I am trying to plot the peak shift vs energy for some of my data. The 2D data I have does not contain the energy scale and I typically make the image plot for my 2D data vs energy (1D wave). However, in the image profile of the Spectra tools kit, it only plots the 2D wave, thus I am wondering if there is a way to be able to choose the x scale of the plot so that the peak shift will correspond to energy shift...</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24739&amp;1=default&amp;2=en&amp;3=" token="NvqO6W9WsUw9GSolPSZeuZlEBuhAwrl6NRDowPgDvSY"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 6, 2024 at 12:41 am - <a href="/comment/24739#comment-24739" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24743" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707251705"></mark> <span class="comment-body"><p>Great to hear that you like the package! The support of scale-waves is on my long term feature list, but it turns out this interferes with the (red) profile lines especially for non-linear x waves.</p> <p>I am not sure I understand fully what you are trying to do. What do you mean by "peak shift"? Is this about the output of the 'Align' feature? You could simply use the output and plot it versus your 1D wave for scaling. I think you would need to recalculate the scale a bit, since x waves for 1D and 2D data works a bit differently.</p> <p>Would it be possible to attach some example data here? Then I can guide you through the process.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24743&amp;1=default&amp;2=en&amp;3=" token="OVYvhj_h6iMUS9LfrNDq6LX_IAXtRIb_TRkZdwic5bY"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 6, 2024 at 12:35 pm - <a href="/comment/24743#comment-24743" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="11273" id="comment-24744" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/11273"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Mika</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707296012"></mark> <span class="comment-body"><p>I appoligize, it might be confusing and hopefully will be more clear with some data. I try to send in here a 2D data (spectra as a function of time) and 1 D data (energy scale) as an example. I am interested into plotting the peak position in energy (or shift) as a function of time for the different spectra recorded. As for now the output of the 'Align' feature gives me some shift (in some numbers which are not connected to energy) vs time. I would like the y-axis to be energy of some kind. Hope that this became a bit more clear. Thank you!</p></span> <div class="comment-file-wrapper"> <label>Attachments</label> <span class="field-comment-file"> <label>Attachment</label> <span class="file"><span class="file file--mime-application-octet-stream file--general"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2024-02/test_Mika.pxp" type="application/octet-stream; length=1913344">test_Mika.pxp</a></span> </span> <span class="file"><span class="file file--mime-image-png file--image"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2024-02/test_M.png" type="image/png; length=1584571">test_M.png</a></span> </span> </span> </div> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24744&amp;1=default&amp;2=en&amp;3=" token="-UFf1YdRe7dWsr-UOptSdj0yzPo-MJAYbYgMAtrwXYg"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 7, 2024 at 12:53 am - <a href="/comment/24744#comment-24744" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24745" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707301246"></mark> <span class="comment-body"><p>No need to apologize. I see what you want to try clearly know. First note that the Align feature compares and shifts whole rows (unless you specify a limited range via cursors). The output is in data points, i.e., how many points each row has been shifted over to match. So you would need to multiply these number with the energy delta, i.e., how much energy each point corresponds to. Looking at your energy scale, there is quite some fluctuation; the step between each energy is not constant. What you can do is to assign an 'average' energy delta to the output. This is the same as applying a linear scale to your image before using my Image Tool. Here is how you can do that. Execute the following for your example data:</p> <div class="geshifilter"><div class="igor geshifilter-igor" style="font-family:monospace;"><span style="color: #007575;">Duplicate</span><span style="color: #000000;">/</span>O '2D_wave_shft', '2D_wave_shft_en'<br /> '2D_wave_shft_en' = '2D_wave_shft'<span style="color: #000000;">&#91;</span><span style="color: #c34e00;">p</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">*</span> <span style="color: #000000;">&#40;</span>energy_scale<span style="color: #000000;">&#91;</span><span style="color: #c34e00;">numpnts</span><span style="color: #000000;">&#40;</span>energy_scale<span style="color: #000000;">&#41;</span>-<span style="color: #000000;">1</span><span style="color: #000000;">&#93;</span>-energy_scale<span style="color: #000000;">&#91;</span><span style="color: #000000;">0</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">/</span><span style="color: #c34e00;">numpnts</span><span style="color: #000000;">&#40;</span>energy_scale<span style="color: #000000;">&#41;</span></div></div> <p>The last factor is basically the average energy step calculated from energy_scale.</p> <p>If you want to properly take the variable energy spacing into account then you would need to first interpolate your 2D_wave into a linear scale. You could use interp2D for that, but it is a bit more involved. Then you use my Image Tool on the transformed data. Since your energy-step fluctuations are quite small compared to the rather large shift you observe, the result would not be that affected (i.e., the error you get with above simple approach is small). Let me know if you are interested and I can walk you through that as well.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24745&amp;1=default&amp;2=en&amp;3=" token="7QwDwnDnBq8siIdIShr_ifN5PDrOluXztOA_is6WDxM"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 7, 2024 at 02:20 am - <a href="/comment/24745#comment-24745" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="11273" id="comment-24746" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/11273"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Mika</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707322777"></mark> <span class="comment-body"><p>Many thanks, Chozo! This seems to work pretty well now so it is already good for my data! Since I have plenty of data with even smaller energy shift it might be worth looking into the linear scale interpolation of the image if it is not too much to ask for (just to make sure I don't miss any shifts?). Will it be somehow possible to obtain the energy position (instead of shift) of the peak vs time? </p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24746&amp;1=default&amp;2=en&amp;3=" token="ABqar-BccZx_3rdFDOA3eQzrLAwE15ieDIAAf7vAZ-w"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 7, 2024 at 06:40 am - <a href="/comment/24746#comment-24746" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24752" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707344532"></mark> <span class="comment-body"><p>The Align feature does not know anything about your data, it's shape, position etc. So it is impossible to define a 'position' automatically for arbitrary data. You can do the following, however: Find out the peak position at the beginning yourself and then just add the energy shift to that value. I fitted the larger peak at the very bottom of your 2D image and got 96.976 points for the start position, which is:</p> <div class="geshifilter"><div class="igor geshifilter-igor" style="font-family:monospace;">•<span style="color: #007575;">print</span> energy_scale<span style="color: #000000;">&#40;</span><span style="color: #000000;">96.976</span><span style="color: #000000;">&#41;</span><br /> &nbsp; <span style="color: #000000;">18.1231</span> eV</div></div> <p>Now you can do:</p> <span class="geshifilter"><code class="igor geshifilter-igor">'2D_wave_shft_en' = <span style="color: #000000;">18.1231</span> + '2D_wave_shft'<span style="color: #000000;">&#91;</span><span style="color: #c34e00;">p</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">*</span><span style="color: #000000;">&#40;</span>energy_scale<span style="color: #000000;">&#91;</span><span style="color: #c34e00;">numpnts</span><span style="color: #000000;">&#40;</span>energy_scale<span style="color: #000000;">&#41;</span>-<span style="color: #000000;">1</span><span style="color: #000000;">&#93;</span>-energy_scale<span style="color: #000000;">&#91;</span><span style="color: #000000;">0</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">/</span><span style="color: #c34e00;">numpnts</span><span style="color: #000000;">&#40;</span>energy_scale<span style="color: #000000;">&#41;</span></code></span> <p>This gives you the position for that 'peak'. Note that the shape is not well defined at the beginning of 2D_wave. You could also use some position which is well defined at the center of the data and work from there. Just make sure you find the correct offset. Note that you can also use the Align feature in reverse: Hold 'shift' to align to the top row as reference. This might be better if the bottom rows are noisy or have some other issue. Maybe at some point in the future I offer to align to an arbitrary reference.</p> <p>I will get back to you regarding the interpolation later.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24752&amp;1=default&amp;2=en&amp;3=" token="3EtINHRksknLTHVRlr-1e13MuuW7QTvMs2exxrQXvRI"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 7, 2024 at 02:22 pm - <a href="/comment/24752#comment-24752" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="11273" id="comment-24753" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/11273"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/default_images/Artboard%201_1.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Mika</span> </div> <div class="clearit"></div> </a></span> <p class="visually-hidden">In reply to <a href="/comment/24752#comment-24752" class="permalink" rel="bookmark" hreflang="en">The Align feature does not…</a> by <a title="View user profile." href="/user/chozo" lang="" about="/user/chozo" typeof="schema:Person" property="schema:name" datatype="">chozo</a></p> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707404848"></mark> <span class="comment-body"><p>Thank you very much, Chozo for all your help! This really saved me some time! I have checked now some other data with smaller shifts and I think the approach you suggested works well enough for my data. So don't bother about the interpolation, this is already very good and I am very thankful. </p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24753&amp;1=default&amp;2=en&amp;3=" token="XPFEr4YbvD8ARuowwkFMUHOe79QL_hLW-YRPphDQT2A"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 8, 2024 at 07:07 am - <a href="/comment/24753#comment-24753" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24754" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1707407991"></mark> <span class="comment-body"><p>Great to hear that. Just let me know when the interpolation might become necessary or you have any other requests.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24754&amp;1=default&amp;2=en&amp;3=" token="AE5BMz2XG2j1iEjkEaJsI6QEr2K5pMi0h_jNq1IpxQk"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">February 8, 2024 at 07:59 am - <a href="/comment/24754#comment-24754" hreflang="en">Permalink</a></p> </article> </section> Tue, 16 Feb 2021 03:44:27 +0000 chozo 21549 at https://www.wavemetrics.com LEEM-PEEM Analysis https://www.wavemetrics.com/node/21490 LEEM-PEEM Analysis <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> </span> <span><a title="View user profile." href="/user/f-cheynis" lang="" about="/user/f-cheynis" typeof="schema:Person" property="schema:name" datatype="">F. Cheynis</a></span> <span>Fri, 12/11/2020 - 01:20 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/49" hreflang="en">Analysis</a></span> <span class="entity-reference"><a href="/taxonomy/term/44" hreflang="en">File Input/Output</a></span> <span class="entity-reference"><a href="/taxonomy/term/45" hreflang="en">Graphing</a></span> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> <span class="entity-reference"><a href="/taxonomy/term/41" hreflang="en">User Interface</a></span> <span class="entity-reference"><a href="/taxonomy/term/40" hreflang="en">Utilities</a></span> </span> <span class="body"><h3>About</h3> <p>LEEM-PEEM Analysis a program package to extend the image analysis tools provided by Elmitec GmbH acquisition software Uview2000 for the Low-Energy Electron Microscopy (LEEM) and Photo-Emission Electron Microscopy (PEEM) techniques. This package is freely available to the LEEM-PEEM user community considering that the authors will be pleased that the following reference be cited: <a href="https://doi.org/10.1063/1.4871437">Rev. Sci. Instru. 85 (2014) 043705</a>.</p> <h3>Features</h3> <ul> <li>The Graphical User Inferface (GUI) is divided into three parts. The most outfitted component concerns Elmitec GmbH Uview2000 movies (<em>.dav</em>) or image sequences (<em>.dat</em> sequence). These files are opened with a dedicated button. Vizualisation of the sequence is then possible. The built-in "Image Contrast" panel developed by Wavemetrics can be used to adjust the image rendering.</li> </ul> <ul> <li>Standard file-handling procedures are implemented such as <strong>Extract</strong> (<em>e.g.</em> to select certain images of the original data and create a new movie) and <strong>Convert</strong> (to generate a <em>.mov</em> or a <em>.avi</em> movie for presentations).</li> </ul> <ul> <li>Image processing includes polynomial background removal (<strong>Backgrnd</strong>) using Igor Pro built-in procedure.</li> </ul> <ul> <li>Two approaches are implemented for image drift correction (<strong>Drift. Corr.</strong>). The first is based on an automated image-to-image intercorrelation. The second approach requires that the user marks/locates a given detail on the surface under consideration in different images of the sequence. The drift is then linearly interpolated between these positions and a new movie is created.</li> </ul> <ul> <li>A particle analysis procedure (<strong>Part. Anal.</strong>) is also available. An arbitrary number of particles (<em>i.e.</em> black, resp. white, areas on a white, resp. black, background) are characterized (area and<em> x, y</em> position) as a function of the movie image number. Manual and Iterated built-in thresholding methods are implemented to detect automatically the current position of a given particle. A procedure to measure the intensity of a given region-of-interest along the image sequence is implemented (<strong>I<sub>ROI</sub></strong>). This is particularly useful for <strong>reflectivity I(V)</strong> curves.</li> </ul> <ul> <li>The second and third components of the GUI enable to display in Igor Pro <em>.mov</em> movies and various types of individual images obtained from Elmitec acquisition software (<em>.dat</em>) or in standard formats (<em>.tiff</em>, <em>.png</em>, and <em>.jpeg</em>).</li> </ul> <h3>Install</h3> <ul> <li> You need Igor Pro 6.3 or higher.</li> </ul> <ul> <li>Unpack the .zip file.</li> </ul> <ul> <li><strong>LEEM_Analysis2009.ipf</strong> and <strong>LEEM_Analysis2015.ipf</strong> files are global procedures. So simply move them to the 'Igor Procedures' folder or in a folder with an alias pointing to it in the 'Igor Procedures' folder.</li> </ul> <ul> <li>All other '<strong>.ipf</strong>' files are shared procedures. Move these '<strong>.ipf</strong>' files in the 'User Procedures' folder or in a folder with an alias pointing to in in the 'User Procedures' folder.</li> </ul> <ul> <li>Start Igor Pro. 'LEEM analysis 2009' and 'LEEM analysis 2015' items should be available in the 'Macros' menu. Choose the item according to the year release of your Uview2000 software. This creates the main panel. Enjoy !!</li> </ul> <h3>Limitations</h3> <ul> <li>So far only 1024x1024 images and image sequences are supported.</li> <li>This package is provided as-is without any warranty.</li> </ul></span> <a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/projects/LEEM-PEEM%20analysis%20GUI.PNG"><img src="/sites/www.wavemetrics.com/files/styles/content_body/public/projects/LEEM-PEEM%20analysis%20GUI.PNG" width="340" height="300" alt="User interface of the LEEM-PEEM analysis package" typeof="foaf:Image" class="content_body" /> </a> <a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/projects/LEEM-PEEM%20analysis.PNG"><img src="/sites/www.wavemetrics.com/files/styles/content_body/public/projects/LEEM-PEEM%20analysis.PNG" width="590" height="300" alt="Typical configuration of the LEEM-PEEM analysis package interface" typeof="foaf:Image" class="content_body" /> </a> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">6.30.x</span> </span> <section class="comment-section"> </section> Fri, 11 Dec 2020 09:20:43 +0000 F. Cheynis 21490 at https://www.wavemetrics.com Radial Profiler Demo https://www.wavemetrics.com/node/21289 Radial Profiler Demo <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> </span> <span><a title="View user profile." href="/user/jjweimer" lang="" about="/user/jjweimer" typeof="schema:Person" property="schema:name" datatype="">jjweimer</a></span> <span>Sat, 05/23/2020 - 04:05 pm</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> </span> <span class="body"><p>This package contains a demo version of a control panel as a starting point to create radial profiles over features (blobs) in a (grayscale - 2D) image.</p> <p>This package requires the <a href="https://www.wavemetrics.com/node/21002">Image Tools Package</a>.</p> <p>The ZIP archive contains a video tutorial of how to use the radial profiler.</p> <p>The demo version will only find the blob and show the row/column profiles. Contact me off-line when you are interested in the full version.</p></span> <a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/projects/RadialProfilerImagev100.png"><img src="/sites/www.wavemetrics.com/files/styles/content_body/public/projects/RadialProfilerImagev100.png" width="623" height="300" alt="Radial Profiler v100 Image" typeof="foaf:Image" class="content_body" /> </a> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">8.00.x</span> </span> <section class="comment-section"> </section> Sat, 23 May 2020 23:05:44 +0000 jjweimer 21289 at https://www.wavemetrics.com Image Tools https://www.wavemetrics.com/node/21002 Image Tools <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> </span> <span><a title="View user profile." href="/user/jjweimer" lang="" about="/user/jjweimer" typeof="schema:Person" property="schema:name" datatype="">jjweimer</a></span> <span>Wed, 08/07/2019 - 11:08 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> </span> <span class="body"><h3>Background</h3> <p>This package is presented as a way for users to load, display, and print out summary views from sets of TIFF (or other) images or internally-existing xy/image waves without needing to write code.</p> <p><img src="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/projects/ImageToolsv380.png" width="400" /></p> <h3>Operation</h3> <p>Once installed, the package is accessible from the Analysis --&gt; Image Tools sub-menu.</p> <p>The displayed content is divided as four frames.</p> <ul> <li>An image display window shows the currently active image</li> <li>A control bar on the top of the main display sets the parameters in the viewing window</li> <li>A histogram graph shows the histograms for the image being displayed.</li> <li>Operation of the package is done using inputs on a control panel.</li> </ul> <h4>Image Control Bar</h4> <ul> <li>Expand window size to free ..., minimum (showing all controls) [..], or preferred [ ]</li> <li>Change the color scale used to display the image (main and split)</li> <li>Change the image range (contrast adjustments) using sliders or numerical inputs or invert (only for main image)</li> <li>Split view to show two images from current folder side-by-side or top-to-bottom (default)</li> <li>Swap main and split images</li> </ul> <h4>Main Tab</h4> <h5>Image Displayed</h5> <ul> <li>Step through images that are loaded as sets using buttons to advance or go backward in the loaded sets.</li> <li>See the image size (pixels) and bit depth.</li> <li>View/Add notes to an image file (wave).</li> <li>Play a movie from a stack</li> </ul> <h5>Display Information</h5> <ul> <li>Shows the positions of the marquee when drawn on the image</li> <li>Toggle on/off the histogram display with linear and log scales as well as cumulative and derivative histograms.</li> <li>Scale the derivative histogram to search for positions of zero crossings (peaks in histogram).</li> <li>Choose a region of interest (RoI) for a sub-set of analysis</li> <li>Choose inside, outside, inside - outside, and outside - inside analysis for histogram</li> <li>See where the RoI is in image coordinates.</li> <li>Lock the RoI to continue using the selection tool on the image.</li> <li>Shows the min/max in the image and in the selected RoI (if present)</li> </ul> <h4>Load Tab</h4> <h5>Load Image(s)</h5> <ul> <li>Load a single RGB image, multiple RGB images, a folder of RGB images, or a selection of RGB images from a stack.</li> <li>Load uncompressed or compressed TIFFs as well as other image file formats</li> <li>Do the same to load grayscale images.</li> <li>Load / Convert existing xy waves to a format that can be used within the package</li> <li>Choose to keep the source (or not), to extract any one or all of the RGB channels, and/or to create a grayscale image</li> <li>Create your own image file loader and have it automatically recognized (ask for details)</li> </ul> <h4>Calibrate Tab</h4> <h5>Calibrate XY</h5> <ul> <li>Set a calibration factor for pixel, image width, or image height to apply locally or globally</li> </ul> <h5>Calibrate Intensity</h5> <ul> <li>Invert, remove negatives, remove outliers, normalize (by height or flux density), and apply an equation using "I" for intensity as well as "x,y" for position<br /> Example Equations: (I^2) will square the intensity or (I &lt; 20 ? 0 : I) will set all intensity values below 20 to zero</li> </ul> <h4>Process Tab</h4> <h5>Remove Background</h5> <ul> <li>Manually set or edit grid points that denote the background locations</li> <li>Create NxM grids that ignore marquee regions (rectangle or oval), threshold, or fill regions</li> <li>Apply an operation to remove a background having various plane orders through the grid points</li> <li>Remove a zero order plane to subtract the minimum value from the image</li> </ul> <h5>Threshold</h5> <ul> <li>Apply a thresholding method to one image, each image, or all images in a stack</li> <li>Select various threshold methods as documented in the Igor Pro options, including manual or range </li> <li>Fill the threshold</li> </ul> <h5>Mask Image Regions</h5> <ul> <li>Use drawing regions, the marquee, a threshold image, or a fill image to highlight regions of interest</li> </ul> <h5>Stack Math (for Image Stacks)</h5> <ul> <li>Average + Standard Uncertainty, Derivative, or Integral over the stack</li> </ul> <h5>Split Math (when view is split)</h5> <ul> <li>Add, Subtract, Multiply, Divide with left (operation) right. Process only displayed or process selectively for stacks.</li> <li>Input equation using L (left) and R (right) for split math operation.</li> </ul> <h5>Crop to Marquee</h5> <ul> <li>Crop using the marquee to exact or to smallest feature</li> </ul> <h4>Publish Tab</h4> <h5>Image</h5> <ul> <li>Turn on/off axes</li> <li>Turn on/off scale bar and set its location / color</li> </ul> <h5>Layout</h5> <ul> <li>Store the image to a list to use for a layout (with tags as desired) or a contact print format</li> <li>Allow the layout image to update dynamically as changes are made to the main image</li> </ul> <h3><strong>Caveats</strong></h3> <ul> <li>This package has been developed for analyzing single-channel images. It may do some things correctly with RGB images or 4-stack images, however no guarantees are given for these types of images. Convert RGB or 4-stack images to grayscale or read only each individual channel accordingly.</li> <li>This program can load image stacks (TIFF movies). That does not however mean that it will handle them all with equal efficiency. Load larger files as stacks using the selections to load only a certain range in the movie and/or to load only a certain sequence (e.g. every 10th image).</li> </ul> <h3>Further Help</h3> <p>Tutorial videos for portions of this package are available at either link below.</p> <p><a href="https://www.dropbox.com/sh/47xycixobhec14n/AAD8ARkbGN6sm2GsYfD4pOeVa?dl=0">Dropbox Link to Video Tutorials</a></p> <p><a href="https://drive.google.com/drive/folders/1YjdmH0gws0mMgR5ZXlQqIAq5rP5aJ9sl?usp=share_link">GoogleDrive Link to Video Tutorials</a></p></span> <a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/projects/ImageToolsv380.png"><img src="/sites/www.wavemetrics.com/files/styles/content_body/public/projects/ImageToolsv380.png" width="533" height="300" alt="Image Tools v3.80" typeof="foaf:Image" class="content_body" /> </a> <a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/projects/ImageToolsv300.png"><img src="/sites/www.wavemetrics.com/files/styles/content_body/public/projects/ImageToolsv300.png" width="523" height="300" alt="Image Tools v3.00" typeof="foaf:Image" class="content_body" /> </a> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">9.00.x</span> <span class="entity-reference">8.00.x</span> </span> <section class="comment-section"> <article data-comment-user-id="25" id="comment-19388" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/25"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/jjweimer/profile-images/2018-12/meimage.jpg" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">jjweimer</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1579029825"></mark> <span class="comment-body"><p>I would be grateful to hear from folks who find this package useful, who would like to see features added to it, or who would like to contribute to its development. Please contact me with comments here or via a direct email.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=19388&amp;1=default&amp;2=en&amp;3=" token="MFCzq4z6cLrqin6CHv2HeJ0RTqA7XfNmUHBpyYw0e7w"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">January 14, 2020 at 11:23 am - <a href="/comment/19388#comment-19388" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24305" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690298647"></mark> <span class="comment-body"><p>JJ, while I don't use your tool (yet) I took a look how things are done in your code. ;) I found a few bugs and inconsistencies, so I thought you might want to know about them. Here is a (non-exhaustive) list of what I found so far:</p> <p>1) the include statements fail if not all the procedures are inside the standard procedures folder. I often rather want to have just a shortcut to the main procedure (Image Tools Main.ipf in this case) and leave all the rest somewhere else. This would work if you would provide relative paths to the included files, e.g.,</p> <pre> #include ":Supporting:Image Tools Headers" instead of #include "Image Tools Headers" within Image Tools Main.ipf</pre> <pre> #include ":Image Tools Background" instead of #include "Image Tools Background" within Image Tools Process.ipf</pre> <p>and so on.</p> <p>2) I am not such a fan of creating stuff upon start of every experiment. Why do you want to initialize the package upon start? It might be better to initialize the folder structure upon first start.</p> <p>3) line 384 in Image Tools Main.ipf: Missing /Z flag in</p> <p>wave swave = $lwfile</p> <p>4) The controls overlap and have an inconsistent font size on Windows (see attachment).</p> <p>5) Toggling marquee 'lock' on and off shifts the marquee area down a bit each time.</p> <p>6) If I click the |&lt; button directly after start, the 'Folder' popup menu appears, which is broken at this stage.</p> <p>7) I think do_strsplitmath() has a possible bug: If the name of limg contains an 'r' the command execution would break, since all 'r's are replaced by the name of rimg.</p> <p>8) If I switch loading to Internal Data Folder, press Convert but then cancel I get an error.</p> <p>9) Related to 8, I then can click through the different tabs without a proper wave loaded, which breaks all kinds of things. The tab controls need hard checks if / when they are safe to be activated.</p></span> <div class="comment-file-wrapper"> <label>Attachments</label> <span class="field-comment-file"> <label>Attachment</label> <span class="file"><span class="file file--mime-image-png file--image"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2023-07/Image%20Tools%20panel.png" type="image/png; length=28131">Image Tools panel.png</a></span> </span> </span> </div> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24305&amp;1=default&amp;2=en&amp;3=" token="Dw8xfL43eyGdlTRrW0zBPS9CKF-Q-v5hLBNi1Xk5IZU"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 25, 2023 at 08:24 am - <a href="/comment/24305#comment-24305" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="25" id="comment-24306" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/25"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/jjweimer/profile-images/2018-12/meimage.jpg" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">jjweimer</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690305051"></mark> <span class="comment-body"><p>@chozo -- Thanks. I agree, parts of the code may need a robust sanity check. A few quick notes ...</p> <p>1) I prefer to "hide" supporting procedures in a folder within the main folder. I'd not considered this would cause disruption using your approach. I'll implement the relative file path designation to allow it.</p> <p>2) I should only be checking behind at the start of each experiment to discover whether the Image Tools procedures have been updated. I'll make sure this is the case.</p> <p>4) Ah yes, Windows. I'll have to fire up my Parallels version and adjust.</p> <p>5) I've fought with the distinctions in placement of a marquee as pixels versus axes versus graph coordinates until my head spins. I'll revisit this.</p> <p>3, 6-9) I should hope to tackle these issues ASAP.</p> <p>I think you've given me my plans for the upcoming week, and I'm looking forward to the non-non-exhaustive list. :-)</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24306&amp;1=default&amp;2=en&amp;3=" token="xEtlhpkayb3KkoYNfZjTr84JEwePGaBE_tm7fTt6hlE"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 25, 2023 at 10:10 am - <a href="/comment/24306#comment-24306" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="25" id="comment-24307" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/25"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/jjweimer/profile-images/2018-12/meimage.jpg" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">jjweimer</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690330708"></mark> <span class="comment-body"><p>@chozo -- v3.32 should fix all but 4) and 5)</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24307&amp;1=default&amp;2=en&amp;3=" token="U8lipFX0maeeLjhzBkxF1YRXQsECA-l6Prsy52MrYt4"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 25, 2023 at 05:18 pm - <a href="/comment/24307#comment-24307" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24308" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690342181"></mark> <span class="comment-body"><p>Great, here's more. :)</p> <p>1) The #include issue was not fully resolved yet. You need to put a ':' in front of each statement in Image Tools Process.ipf.</p> <p>2) ImageLoad is apparently unable to load compressed Tiff images (at least with LZW), so you need to add a /Z flag and handle the loading error (lines 464 ... in Load Tools).</p> <p>3) The Histogram graph is actually partly outside my monitor area. You might want to calculate the size of the image display and the placement of the histogram view according to the screen size. (This one is a bit tedious, so just if you want to go for it.)</p> <p>4) Similar to 3, enabling split view can possibly stretch the whole thing far beyond the available screen area.</p> <p>5) I was trying to load a tiff image now, but the Folder popup and &lt;&gt; buttons never appeared and the loaded image was also not displayed automatically. So I was unable to display the loaded image.</p> <p>6) I guess it is not intended to save the main graph, so I would use /K=1 when building the graphs for the tool to prevent the dialog.</p> <p>7) When I lock the marquee and drag a new marquee anyway, all values change to NaN (this may be intended)?</p> <p>8) When I press 'include' for Contact print without selecting anything in particular, I get an error in line 198 in Publish.ipf</p> <p>9) When I remove the pre-placed cursor from the histogram, I get an error. Handle that the cursor might be absent or make sure that it always exists (by forcefully readding it). (Also, why is it called B when it is cursor A, or does the B stand for something else?)</p> <p>10) imgT_bckg... waves are created in the current folder and not in packages (this may be intended?).</p> <p>11) In split view (using one of the background-subtracted waves), the BW, invert and color controls do not seem to work properly, as they apply to both, just the left or just the right image depending on whether they are toggled on or off.</p> <p>12) Related to 11, after toggling the BW checkbox and removing the split, I managed to have the wrong image displayed so that the contrast sliders give errors.</p> <p>13) I just realized you still have the aftercompiledhook() in there, which still creates all data each time a new Igor session is started. Of course, your choice if you want to keep it that way. :)</p> <p>14) Just curious, your default image gives a highly noisy impression with the rapidly varying sin/cos. I wondered if something less frequent like img_default = 200*sin(x/30)*cos(y/30)+200 would be nice.</p> <p>That's all for now. I can give it some more testing when the image loading + display works.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24308&amp;1=default&amp;2=en&amp;3=" token="fubkegNqck-Xgj55w54lfy2NQMTvUdwXJj4U0i0FmqQ"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 25, 2023 at 08:29 pm - <a href="/comment/24308#comment-24308" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="10" id="comment-24309" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/10"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/images-imported/picture-10.png" width="85" height="72" typeof="foaf:Image" class="thumbnail" /> </span> <img class="employee-badge" src="/profiles/wavemetrics/themes/wavemetrics/images/icons/employee-icon.png" /> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">Igor</span> </div> <div class="clearit"></div> </a></span> <p class="visually-hidden">In reply to <a href="/comment/24308#comment-24308" class="permalink" rel="bookmark" hreflang="en">Great, here&#039;s more. :) 1)…</a> by <a title="View user profile." href="/user/chozo" lang="" about="/user/chozo" typeof="schema:Person" property="schema:name" datatype="">chozo</a></p> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690384311"></mark> <span class="comment-body"><p>Quick comment about Chozo (2) above:</p> <p>ImageLoad supports reading TIFF images in two branches: Igor's TIFF code and LibTiff.  Igor's TIFF code does not support LZW compression.  If you are working with compressed TIFF it is best to use /BIGT=1.  If that fails to read the image use /RAT to get more information about the file to determine how to proceed.</p> <p> </p> <p>A.G.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24309&amp;1=default&amp;2=en&amp;3=" token="fCdBW26EhAw5FvgfqAolb0y_ZpfZ4MVav47gMMiZPu8"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 26, 2023 at 08:11 am - <a href="/comment/24309#comment-24309" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="25" id="comment-24310" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/25"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/jjweimer/profile-images/2018-12/meimage.jpg" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">jjweimer</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690388452"></mark> <span class="comment-body"><p>@chozo -- I'll handle the critical errors promptly. Otherwise ...</p> <p>2) I'll revise with the /Z and decide what is best to proceed. In the meantime, I suggest loading the compressed tiff in a standard way and using convert folder to add the compressed tiff.</p> <p>3) and 4) I will eventually prefer to handle this by including a #if compiler reference to check whether the Screen Sizer package is installed in the experiment ( <a href="https://www.wavemetrics.com/project/ScreenSizer">https://www.wavemetrics.com/project/ScreenSizer</a> ). It has functions to position windows by fraction of screen size. I'm reluctant rebuild the features in the Screen Sizer toolset again from scratch, especially since I think (pat myself on the back here) that the Screen Sizer package does what is needed in a robust, easy, and intuitive way. In the meantime, 27in+ 4K+ monitors (or MacBook Pro 16in Retina monitors) are great assets to have when you must work with images. :-)</p> <p>13) The AfterCompiledHook is there to assure that Image Tools handles updates itself properly. The package folder is created from scratch only the first time. After this, the code drops into the imgT_Update() function. This checks the version number of the current against the version number when the experiment was first created. If the version number changed, the package updates itself. I've only had one time that I truly needed to add additional data to the package (perhaps back at the version 1 or 2 stage). I see that I could simply reference back to when this happened and/or check so as not recreate the scaling factors (e.g. if they exist). Otherwise, I still have to drop to an update branch after compiling because sometimes the panel controls change. So I have to also the package to remove and recreate the image + panel. I am curious whether you have an alternative way to resolve the need to handle package updates that do not use a hook function.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24310&amp;1=default&amp;2=en&amp;3=" token="ZqR5IPk34hLPk3vek6f0s8olZyoa4lNTH4kxG_kuOXQ"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 26, 2023 at 09:20 am - <a href="/comment/24310#comment-24310" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24312" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690402740"></mark> <span class="comment-body"><p>3) / 4) It is actually not as tedious as I made it seem. :) Here is some code as a start:</p> <div class="geshifilter"><div class="igor geshifilter-igor" style="font-family:monospace;"><span style="color: #0000ff;">variable</span> TFTResX, TFTResY, pix = <span style="color: #000000;">72</span><span style="color: #000000;">/</span><span style="color: #c34e00;">ScreenResolution</span><br /> <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #c34e00;">cmpstr</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">IgorInfo</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">2</span><span style="color: #000000;">&#41;</span>,<span style="color: #009c00;">&quot;Macintosh&quot;</span><span style="color: #000000;">&#41;</span>==<span style="color: #000000;">0</span><span style="color: #000000;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// Mac</span><br /> &nbsp; &nbsp; <span style="color: #0000ff;">string</span> TFTInfo = <span style="color: #c34e00;">StringByKey</span><span style="color: #000000;">&#40;</span><span style="color: #009c00;">&quot;RECT&quot;</span>,<span style="color: #c34e00;">ReplaceString</span><span style="color: #000000;">&#40;</span><span style="color: #009c00;">&quot;,RECT&quot;</span>,<span style="color: #c34e00;">StringByKey</span><span style="color: #000000;">&#40;</span><span style="color: #009c00;">&quot;SCREEN1&quot;</span>,<span style="color: #c34e00;">IgorInfo</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">0</span><span style="color: #000000;">&#41;</span>,<span style="color: #009c00;">&quot;:&quot;</span><span style="color: #000000;">&#41;</span>,<span style="color: #009c00;">&quot;;RECT&quot;</span><span style="color: #000000;">&#41;</span>,<span style="color: #009c00;">&quot;=&quot;</span><span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; TFTResX = <span style="color: #000000;">&#40;</span><span style="color: #c34e00;">Str2Num</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">StringFromList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">2</span>,TFTInfo,<span style="color: #009c00;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> - <span style="color: #c34e00;">Str2Num</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">StringFromList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">0</span>,TFTInfo,<span style="color: #009c00;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">*</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">72</span><span style="color: #000000;">/</span><span style="color: #c34e00;">ScreenResolution</span><span style="color: #000000;">&#41;</span> &nbsp;<br /> &nbsp; &nbsp; TFTResY = <span style="color: #000000;">&#40;</span><span style="color: #c34e00;">Str2Num</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">StringFromList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">3</span>,TFTInfo,<span style="color: #009c00;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> - <span style="color: #c34e00;">Str2Num</span><span style="color: #000000;">&#40;</span><span style="color: #c34e00;">StringFromList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">1</span>,TFTInfo,<span style="color: #009c00;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">*</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">72</span><span style="color: #000000;">/</span><span style="color: #c34e00;">ScreenResolution</span><span style="color: #000000;">&#41;</span> &nbsp;<br /> <span style="color: #0000ff;">else</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// Windows</span><br /> &nbsp; &nbsp; <span style="color: #007575;">GetWindow</span> kwFrameInner wsizeDC<br /> &nbsp; &nbsp; TFTResX = <span style="color: #000000;">&#40;</span>v_right-v_left<span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; TFTResY = <span style="color: #000000;">&#40;</span>v_bottom-v_top<span style="color: #000000;">&#41;</span><br /> <span style="color: #0000ff;">endif</span><br /> <span style="color: #0000ff;">variable</span> WinTop = <span style="color: #000000;">50</span>, WinLeft = <span style="color: #000000;">250</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// screen margins</span><br /> <span style="color: #0000ff;">variable</span> WinBottom&nbsp; = TFTResY - <span style="color: #000000;">250</span><br /> <span style="color: #0000ff;">variable</span> WinRight &nbsp; = TFTResX - <span style="color: #000000;">350</span><br /> WinBottom = <span style="color: #c34e00;">limit</span><span style="color: #000000;">&#40;</span>WinBottom, WinTop+<span style="color: #000000;">300</span>, <span style="color: #c34e00;">inf</span><span style="color: #000000;">&#41;</span> &nbsp; &nbsp; &nbsp; <span style="color: #ff0000; font-style: italic;">// min size</span><br /> WinRight &nbsp;= <span style="color: #c34e00;">limit</span><span style="color: #000000;">&#40;</span>WinRight, WinLeft+<span style="color: #000000;">300</span>, <span style="color: #c34e00;">inf</span><span style="color: #000000;">&#41;</span><br /> &nbsp; &nbsp; <br /> <span style="color: #007575;">NewImage</span><span style="color: #000000;">/</span>K=<span style="color: #000000;">1</span><span style="color: #000000;">/</span>N=<span style="color: #000000;">$k_imgDisplay</span> itd<br /> <span style="color: #007575;">MoveWindow</span><span style="color: #000000;">/</span>W=<span style="color: #000000;">$k_imgDisplay</span> WinLeft<span style="color: #000000;">*</span>pix, WinTop<span style="color: #000000;">*</span>pix, WinRight<span style="color: #000000;">*</span>pix, WinBottom<span style="color: #000000;">*</span>pix</div></div> <p>Also, you then might want to use within disp_ShowHistograms():</p> <span class="geshifilter"><code class="igor geshifilter-igor"><span style="color: #007575;">AutoPositionWindow</span><span style="color: #000000;">/</span><span style="color: #c34e00;">E</span><span style="color: #000000;">/</span>M=<span style="color: #000000;">1</span><span style="color: #000000;">/</span><span style="color: #c34e00;">R</span>=<span style="color: #000000;">$k_imgDisplay</span> <span style="color: #000000;">$k_histGraphs</span></code></span> <p>13) I assume you are operating from the POV that the tool will be used when it is (manually) loaded by the user. But I usually have all tools I might use loaded all the time, so some procedures creating data all the time is somewhat undesired. There are many ways to approach that. To roll with your current implementation, how about only running the update function within AfterCompiledHook()? If the updater does not find any folders, this means the tool has not been started =&gt; back out quietly without doing anything. This way you never have to do any initialization from this function, which can be solely shifted to the startup of the tool. I personally have update code attached to the window hook functions, however. In general, I also make sure that the code works with all previous graphs/panels ever created in the past which were left open (yes, this can be tiresome at time, I know, but I also did not discover the magic trick to teach my users to properly close tools when they are done).</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24312&amp;1=default&amp;2=en&amp;3=" token="tstvb6-bV4fY4by0h__2gOp0Crm-Us5dNEV4UyDV_fg"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 26, 2023 at 01:14 pm - <a href="/comment/24312#comment-24312" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="25" id="comment-24313" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/25"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/jjweimer/profile-images/2018-12/meimage.jpg" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">jjweimer</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690403873"></mark> <span class="comment-body"><p>@chozo - Try v3.40, especially to load compressed TIFFs. A few notes in the meantime ...</p> <p>1), 5) - 7), 9) fixed<br /> 2) try it and let me know (I have no immediate access to compressed TIFFs)<br /> 3) and 4) to be addressed later when I have enough motivation to include compiler directives to test for ScreenSizer<br /> 8) I suspect this was an issue with something else and this error should not happen again<br /> 10) yes, I keep the background waves in the source folder in case someone wants to export just that folder and post-process separately<br /> 11) the color scale goes across both but the scalings and invert only work on the main window. This is purposeful to allow comparisons such as .... Is my background corrected image really better than simply adjusting the lower and upper contrast on the main image?<br /> 12) the B&amp;W checkbox is removed (perhaps forever or at least until I decide what purpose it really should serve and how to handle it more robustly)<br /> 13) see my previous note<br /> 14) cool and now implemented!!!!</p> <p>Follow up -- You were posting when I was.</p> <p>* I'll look at incorporating your code for window sizings.<br /> * I missed the AutoPosition ... function.<br /> * OK. Now I understand exactly what you mean. I should initialize the package at the menu call, not at compilation. Apologies ... I see the difference once you explained how you operate. I prefer to load procedures only as needed. As to assuring backward compatibility with previous panel controls ... not my cup of tea. I'd rather just kill off an "outdated" panel and redraw the new panel.</p> <p>Please let me know whether you can load compressed TIFFs. I can implement further changes and any bug fixes as needed for a 3.41 version.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24313&amp;1=default&amp;2=en&amp;3=" token="4EK8VlEfwV2r8plG2CNSnXZo_gFj4D0DEKODrwGGv5E"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 26, 2023 at 01:24 pm - <a href="/comment/24313#comment-24313" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="1029" id="comment-24314" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/1029"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/chozo/profile-images/2022-03/WM%20Logo3.png" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">chozo</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690426415"></mark> <span class="comment-body"><p>JJ - No, unfortunately compressed images do not load yet. I'll attach a few example files for you to play around with. I think moving to compressed tif would be very beneficial, since the file size can be 1-2 orders of magnitude smaller. To batch compress images you could for example use ImageMagick.</p></span> <div class="comment-file-wrapper"> <label>Attachments</label> <span class="field-comment-file"> <label>Attachment</label> <span class="file"><span class="file file--mime-application-zip file--package-x-generic"><a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/2023-07/test%20images.zip" type="application/zip; length=48511">test images.zip</a></span> </span> </span> </div> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24314&amp;1=default&amp;2=en&amp;3=" token="hy8M31dsTS_2Di6FG111BtJMUOmL4FYggUM3julVf4Q"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 26, 2023 at 07:53 pm - <a href="/comment/24314#comment-24314" hreflang="en">Permalink</a></p> </article> <article data-comment-user-id="25" id="comment-24317" class="js-comment"> <span class="teaser-flag"><a class="user-profile-compact-wrapper" href="/user/25"> <div class="user-compact-image-wrapper"> <span class="field-profile-picture"> <img src="/sites/www.wavemetrics.com/files/styles/thumbnail/public/jjweimer/profile-images/2018-12/meimage.jpg" width="100" height="100" alt="" typeof="foaf:Image" class="thumbnail" /> </span> </div> <div class="user-compact-info-wrapper"> <span class="username-wrapper">jjweimer</span> </div> <div class="clearit"></div> </a></span> <div class="comment-body-wrapper"> <mark class="hidden" data-comment-timestamp="1690465806"></mark> <span class="comment-body"><p>@chozo -- I was able to load both images, albeit not properly into a single channel grayscale. I could extract the R, G, or B channels.</p> <p>Let's go off-line. Follow up with me at weimerj at uah dot edu.</p></span> <div class="clearit"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=24317&amp;1=default&amp;2=en&amp;3=" token="aBhWhcSgw2N8P1IDoF8ksWb8EPBSR6EghVr81svN_x0"></drupal-render-placeholder> </div> <div class="clearit"></div> <p class="comment-post-date">July 27, 2023 at 06:50 am - <a href="/comment/24317#comment-24317" hreflang="en">Permalink</a></p> </article> </section> Wed, 07 Aug 2019 18:08:15 +0000 jjweimer 21002 at https://www.wavemetrics.com Quick ROI inspector https://www.wavemetrics.com/project/Quick_ROI_inspector Quick ROI inspector <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> </span> <span><a title="View user profile." href="/user/inchinn" lang="" about="/user/inchinn" typeof="schema:Person" property="schema:name" datatype="">inchinn</a></span> <span>Tue, 06/06/2017 - 08:38 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/45" hreflang="en">Graphing</a></span> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> <span class="entity-reference"><a href="/taxonomy/term/49" hreflang="en">Analysis</a></span> </span> <span class="body">//// This marquee tool is for analysing time series movies.<br /> ////Use the marquee tool to mark an ROI, right click and select quickroi.<br /> ////This is then appended to the image with its coordinates printed to the history.<br /> ////The average of the pixel values within the ROI in each frame is calculated and<br /> //// shown in the wave QROI. If you select a new ROI this everything is updated.<br /> /// You can also use the "subtract background" button to subtract the average of the <br /> ////ROI pixels from the whole image on a frame by frmae basis. Useful for analysing Ca imaging movies<br /> /// When done hit the done button to kill all waves and variables</span> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">6.20.x</span> </span> <section class="comment-section"> </section> Tue, 06 Jun 2017 15:38:57 +0000 inchinn 7749 at https://www.wavemetrics.com SimpLiFi - Simple line profiles for TEM/STEM images https://www.wavemetrics.com/project/SimpLiFi SimpLiFi - Simple line profiles for TEM/STEM images <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> </span> <span><a title="View user profile." href="/user/kpantzas" lang="" about="/user/kpantzas" typeof="schema:Person" property="schema:name" datatype="">kpantzas</a></span> <span>Tue, 04/11/2017 - 08:16 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> </span> <span class="body">The SimpLiFi package provides an interface for extracting and analyzing line profiles from TEM/STEM images. This tool is in part a simplified version of the Image Line Profile tool provided in the ImageProcessing package by WaveMetrics ( SimpLiFi does not handle paths - only straight lines - and only greyscale images). It is also in part modified to mimic functionalities of the Line Profile tool available in Gatan's Digital Micrograph:<br /> <br /> - A Frame is displayed on the image to show the width over which the profile is drawn<br /> - Two cursors can be displayed on the profile graph to compute the thickness of a feature (e.g. a layer), and also extract the mean image intensity, as well as an average of values that are within 5% of the max and 5% of the min of the profile section between the cursors<br /> - Dashed lines are displayed on the image to show the position of cursors on the profile graph<br /> - The computed values (thickness, average, min, max) can be exported to a Results wave<br /> - The Results wave can be displayed in a Table<br /> <br /> This project is still in development and will evolve as my understanding of IGOR programming evolves. Comments and suggestions are welcome.<br /></span> <section class="comment-section"> </section> Tue, 11 Apr 2017 15:16:38 +0000 kpantzas 7660 at https://www.wavemetrics.com EccentricXPS - Analysis and Organisation of XPS Spectra https://www.wavemetrics.com/project/EccentricXPS EccentricXPS - Analysis and Organisation of XPS Spectra <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> </span> <span><a title="View user profile." href="/user/olelytken" lang="" about="/user/olelytken" typeof="schema:Person" property="schema:name" datatype="">olelytken</a></span> <span>Wed, 03/01/2017 - 09:22 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/49" hreflang="en">Analysis</a></span> <span class="entity-reference"><a href="/taxonomy/term/39" hreflang="en">Curve Fitting</a></span> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> </span> <span class="body"><p>EccentricXPS is an Igor Pro procedure initially written to load, display and analyze the two-dimensional x-ray photoelectron spectroscopy (XPS) images produced by our VG Scienta SES 200 hemispherical analyzer at the University of Erlangen-Nuremberg. EccentricXPS can load and display the images from the raw .txt files produced by the SES software (version 1.2.2, build 37) and then convert the images to normal one-dimensional spectra, which can be easily displayed, compared and fitted, either as single spectra or in bulk.<br /> <br /> Over time the procedure has been expanded to also be able to load, display and analyze the Auger-yield NEXAFS images we have been measuring at the Materials Science beamline at Elettra in Trieste using the KolXPD software (version 1.8.0.42). The Auger-yield NEXAFS images, measured as photon energy vs. kinetic energy, can be displayed, photoemission features travelling through the images can be removed and the spectra converted into normal one-dimensional spectra. These one-dimensional spectra can, just as the XPS spectra, easily be displayed, compared and fitted, either as single spectra or in bulk as a group.<br /> <br /> A more thorough description of how the photoemission features are removed from the NEXAFS images can be found here: <a href="https://doi.org/10.1016/j.elspec.2017.05.012">https://doi.org/10.1016/j.elspec.2017.05.012</a><br /> <br /> The EccentricXPS_v1.201.zip file contains the procedure file EccentricXPS_v1.201.ipf, an extensive help file EccentricXPS_Help_v1.201.ihf, and an Igor experiment file EccentricXPS_Examples_v1.201.pxp with a collection of spectra that can be used to test the full functionality of EccentricXPS.<br /> <br /> To have the procedure load automatically when you start up Igor Pro copy the procedure file EccentricXPS_v1.201.ipf, or a shortcut to the file, into your Igor Procedures folder, typically located in C:\Program Files\WaveMetrics\Igor Pro Folder\Igor Procedures. To have the help file load automatically you also need to copy the EccentricXPS_Help_v1.201.ihf file, or a shortcut to the file, into your Igor Help Files folder, typically located in C:\Program Files\WaveMetrics\Igor Pro Folder\Igor Help Files.<br /> <br /> The procedure when loaded will create two new menu items: XPS and NEXAFS. A good place to start would be to click Help in the XPS menu, which will open the help file and a description of what the different menu selections will do.</p></span> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">6.30.x</span> </span> https://opensource.org/licenses/MIT <section class="comment-section"> </section> Wed, 01 Mar 2017 17:22:16 +0000 olelytken 7577 at https://www.wavemetrics.com ALP Alternate Line Profile https://www.wavemetrics.com/project/ALP ALP Alternate Line Profile <span class="field-os-compatibility"> <span class="entity-reference"><a href="/taxonomy/term/26" hreflang="en">Mac-Intel</a></span> <span class="entity-reference"><a href="/taxonomy/term/27" hreflang="en">Windows</a></span> </span> <span><a title="View user profile." href="/user/rkigorexch" lang="" about="/user/rkigorexch" typeof="schema:Person" property="schema:name" datatype="">rkigorexch</a></span> <span>Sat, 12/24/2016 - 09:39 am</span> <span class="field-project-type"> <span class="entity-reference"><a href="/taxonomy/term/45" hreflang="en">Graphing</a></span> <span class="entity-reference"><a href="/taxonomy/term/46" hreflang="en">Image Processing</a></span> <span class="entity-reference"><a href="/taxonomy/term/49" hreflang="en">Analysis</a></span> </span> <span class="body">Why ALP?<br /> The Igor 7 image line profile has fewer features than in Igor 6. Wavemetrics is not currently planning to make significant changes, the <br /> workaround suggested is to use IP6 procedures. Some issues are:<br /> - The profile graph cannnot be modified, or the data explored, for example with a cursor.<br /> - Does not take wave scaling into account.<br /> - No longer possible to graph a profile, it can only be saved. (Has been changed in Igor 7.02)<br /> - The saved wave is now a triplet. This is not visible in the default New Graph menu, inexperienced users can not easily graph it themselves. <br /> - The lines defining the profile are hard to see on dark images.<br /> - If a profile limit goes outside the image, the profile is NaN, instead of truncating at the edge of the image. <br /> - There is no help, only tool tips.<br /> <br /> ALP is an Alternate Line Profile package intended to fill some of these needs.<br /> - supports sub-pixel interpolation.<br /> - The profile graph is fully accessible.<br /> - Image wave scaling is used.<br /> - v1.1 handles 2D waves displayed vs X and/or Y waves.<br /> - The profile can be specified in pixel or scaled units.<br /> - There are two graphing options, together in one graph or separate graphs. The single graph option facilitates comparison of profiles from different images.<br /> - The profile lines on the image are easily visible.<br /> - The profiles are saved as three one-D waves, for easy discovery and use. These are the profile, and the corresponding X and Y coords. The<br /> coordinates are in scaled wave units.<br /> - Has readily available help information.<br /> <br /> Updates &amp; bug fixes:<br /> - v1.1 Handles X and/or Y axis waves, as well as wave scaling.<br /> The profile graph properties are no longer reset at every update. User modifications "stick". <br /> Saved wave names are more systematic.<br /> - v1.2 Profile graph uses scaled x or y instead of pixels.<br /> Profile width increment adapted to wave scaling/axis wave.<br /> - v1.3 better switching between image windows, ALP parameters are stored in graph user data<br /> ALP lines can be hidden or retained on image when ALP is not the active top window,<br /> see constant HideLinesDefault below to control default behavior<br /> Initial profile adapts to displayed ranges, if whole image not visible. <br /> <br /> USING ALP:<br /> - After importing the procedure, select Alternate Line Profile... from the Image Menu. The press the Help button for full information.</span> <a href="https://www.wavemetrics.com/sites/www.wavemetrics.com/files/images-imported/ALPv1.preview.png"><img src="/sites/www.wavemetrics.com/files/styles/content_body/public/images-imported/ALPv1.preview.png" width="640" height="277" title="ALP main window and profile region on " typeof="foaf:Image" class="content_body" /> </a> <span class="field-supported-version"> <label>Supported Igor Version</label> <span class="entity-reference">7.00.x</span> </span> <a href="See ALP helps" target="_blank">View Documentation</a> See ALP procedure file <section class="comment-section"> </section> Sat, 24 Dec 2016 17:39:00 +0000 rkigorexch 7465 at https://www.wavemetrics.com