## Igor Pro 9 Changed and New Features

Igor Pro 9 contains hundreds of improvements, including built-in support for HDF5, 24 new functions and 34 new operations.

For a shorter and more visual guide to Igor Pro 9's new features than is detailed below, see our Igor Pro 9 Highlights page.

Major Igor Pro 9 improvements include:

• Autosave has been added with user options to control for the frequency and granularity of saving.
• New built-in HDF5 support: Igor experiments can now be saved as HDF5 files, and you can open and browse multiple HDF5 files and convert the data into Igor native formats. Igor Pro 9 can still read files created by all earlier versions of Igor and defaults to saving packed experiments using the .pxp file format used in previous versions.
• Igor supports sparse matrices through the new MatrixSparse operation. It uses the Intel Math Kernel Library Sparse BLAS routines and employs the libraries terminology and conventions. A sparse matrix in Igor is represented by a set of three 1D waves which define the non-zero elements of the matrix. Igor supports three sparse matrix representation formats: COO, CSC, and CSR. Sparse matrix operations in include matrix addition, multiplication, and TRSV which solves a system of linear equations.
• Agglomerative hierarchical cluster analysis has been added with the new HCluster operation.
• Complex curve fitting has been implemented.
• Major update of the MultiPeak Fit package. The functions that were previously provided by the PeakFunctions2 XOP are now built-in.
• The ability to drag waves from the Data Browser onto a graph to make new traces has been enhanced. New active areas allow you to append traces to specific axes and to make new free axes, as well as select a wave as an X wave. Also, it is now possible to drag waves onto graphs and tables from the Waves in Window list of the Window Browser.
• For those times when a user-defined panel is just a bit too small to read easily or a bit too big to fit your laptop's screen, you can make that panel bigger or smaller using Igor 9's new Panel→Expansion submenu.
• Box Plots and Violin Plots now support per-dataset properties.
• Box Plots and Violin Plots now allow you to control the color, marker and marker size of each individual data point.
• Igor's PDF export now supports transparency and improved font embedding.
• Improved editing of Polygons and Beziers.
• The new Presentation Table Procedures package allows you to programmatically create a "presentation table" in a graph, layout or control panel window.
• Command completion now includes user-defined functions.
• Faster procedure compile time.
• Improved text processing performance.
• 29 new MatrixOP functions: spliceCols, zapNaNs, zapINFs, addRows, addCols, waveX, waveY, waveZ, waveT, DecimateMinMax, Select, SQ, VarBeams, SumND, KronProd, bitReverseCol, setColsRange, layerStack, maxMagAB, minAB, minMagAB, gammaln, gamma, expIntegralE1, greaterOrEqual, log2, normP, oneNorm, and expm.
• Added functions vectorization and optimized memory allocation in MatrixOP.

## Notable Technology Changes

Igor Pro 9 is based on the Qt 5.12 cross-platform application framework.

## Igor Version Compatibility

Igor Pro 9 can read files created by all earlier versions of Igor.

If you don’t use features new in Igor Pro 9, then .pxp experiment files that it writes are readable by earlier versions of Igor.

Once you use features added in Igor Pro 9 and save an experiment file, that file may cause errors if you try to read it in an earlier version of Igor. Just in case you need to go back to an earlier version of Igor, it is a good idea to make backup copies of all your Igor files now.

Some behaviors have changed slightly in Igor Pro 9. These changes may affect some existing Igor experiments. See Behavior Changes in Igor Pro 9 for details.

## Features Removed From Igor Pro 9

Macintosh: Igor Pro 9 no longer displays a splash screen while Igor is starting. In order to troubleshoot slow startup or crashes during startup, start Igor from the command prompt (Windows) or Terminal (Macintosh) with the new /START flag, which is supported on all platforms.

Macintosh: The PlayMovie operation was changed so that the movie file is always passed to the operating system to be opened with the default program for the given extension. The /W flag is also always ignored. Note that the movie is not automatically played--the user will need to manually play the movie. These changes were required due to removal of features in macOS Catalina (10.15). They were actually implemented in Igor Pro 8.04 but mentioned here to make the situation more clear.

## XOP Changes in Igor Pro 9

The VDT2 XOP, used for serial I/O, was updated to version 3.00. All of the VDT2 operations are now thread-safe - see Calling VDT2 Operations from a Preemptive Thread for details. We added a /P=portName flag to various VDT2 operations - see Specifying the Operation Port Using the /P Flag for details. Thanks to Michael Huth of byte-physics for contributing these features.

### XOPs Removed From Igor Pro 9

As of Igor Pro 9, HDF5 support is built into Igor. Previously it was implemented via an XOP. Also, the “HDF5 Browser.ipf” file is activated by default. Consequently, you should no longer activate HDF5 support using aliases or shortcuts pointing to HDF5.xop, HDF564.xop, or to “HDF5 Browser.ipf ". If you use HDF5 programmatically, some minor changes may be required to your procedures. See HDF5 Programming Changes in Igor Pro 9 for details.

The PeakFunctions2 XOP has been removed, and the functions defined by it are now built in. This XOP was intended primarily as support for the Multi-peak Fit 2 package.

The IgorGIS XOP is now considered obsolete because we no longer have the expertise to maintain the XOP and answer support questions. For now, the XOP is installed in an Obsolete directory but that is subject to change, particularly on Macintosh where Apple sets the rules on what files we can include in our installer. There is no replacement for the functionality provided by the IgorGIS XOP.

## Guide To Igor Pro 9 Improvements

File Management Improvements

HDF5 Packed Experiment Files

Performance Improvements

User-Interface Changes

Behavior Changes

Programming Changes

Data Browser Improvements

Window Browser Improvements

Dialog Improvements

Graphing Improvements

Box and Violin Plot Improvements

Graphs and High-Resolution Displays

Table Improvements

Page Layout Improvements

Notebook Improvements

Help Improvements

Command Window Improvements

Graphics Export Improvements

Procedure Window Improvements

Gizmo Improvements

Drawing Improvements

Annotation Improvements

Control and Control Panel Improvements

Analysis Improvements

Statistics Improvements

Matrix Improvements

Curve Fitting Improvements

Image Processing Improvements

Data Import And Export Improvements

Miscellaneous Improvements

New And Improved Packages

New And Improved Example Experiments

### File Management Improvements

Igor Pro 9 adds an autosave feature which may prevent loss of work in the event of a crash.

You can save all modified procedure files at once by choosing File→Save All Standalone Procedure Files.

You can save all modified notebook files at once by choosing File→Save All Standalone Notebook Files.

### HDF5 Packed Experiment Files

In Igor Pro 9 and later, you can save an Igor experiment as an HDF5 file. The main advantage is that the data is immediately accessible to a wide array of programs that support HDF5. The main disadvantage is that you will need Igor Pro 9 or later to open the file in Igor as an experiment file. Also HDF5 is considerably slower than PXP for experiments with very large numbers of waves.

Igor Pro 9 adds HDF5 default compression which can be applied to saving HDF5 packed experiment files.

### Performance Improvements

Windows: Improved performance of some threadsafe operations when called from multiple threads, particularly those that access files (e.g. LoadWave).

Windows: Improved performance of text parsing, which results in slightly faster procedure compiling and loading of text data, among other things.

Added optimized memory allocation and vectorized execution options in various MatrixOP functions.

Added automatic multithreading to ImageRegistration (for registration of a 3D stack wave).

Copying or cutting a very large number of cells is much faster on Windows. (It was always fast on Macintosh.) This also affects SaveTableCopy.

Improved the code path that is used internally when checking floating point values for NaN or Inf. Since many operations and functions need to do this check on all points in an input wave, this change can be significant (up to ~25% reduction in execution time for some commands).

### User-Interface Changes

Command Completion in procedure windows and the command line now (optionally) includes user-defined functions.

Undo for subwindows had been improved. Previously, if, for instance, you had a graph subwindow in a panel, you had to switch to draw mode to undo changes in the graph subwindow. Now the Undo and Redo items in the Edit menu refer to whatever subwindow is currently active.

The ability to drag waves from the Data Browser onto a graph to make new traces has been enhanced. New active areas allow you to append traces to specific axes and to make new free axes, as well as select a wave as an X wave. See Appending Traces by Drag and Drop. Also, it is now possible to drag waves onto graphs and tables from the Waves in Window list of the Window Browser.

The Window Browser and other dialogs that display lists of windows can now display titles of windows under or next to the window’s icon instead of the name. Click the gear icon at the bottom of the window list and use the Display Text submenu to select Title.

### Behavior Changes

During experiment loading, if a text file (plain text notebook or procedure file) is valid as UTF-8, it is loaded as UTF-8 regardless of the text encoding stored in the experiment file. This means that pure ASCII files stored in or referenced by experiments that were previously loaded as, for example, MacRoman or Windows-1252 are now loaded as UTF-8. If you add a non-ASCII character to such files and save the file or the experiment, they are saved as UTF-8 instead of MacRoman or Windows-1252. The purpose of this change is to transition away from obsolete text encodings.

If a plain text file has a UTF-8 byte order mark or a UTF-8 TextEncoding pragma, it is loaded as UTF-8 even if it contains invalid byte sequences. Invalid bytes are displayed using the Unicode replacement character (� - U+FFFD).

To discourage perpetuation of antiquated text encodings, the NewNotebook operation now defaults to UTF-8 text encoding. Previously it defaulted to the text encoding specified by Misc→Text Encodings→Default Text Encoding. Also the text encoding popup menu was removed from the Windows→New→Notebook dialog and the dialog always creates notebooks that use UTF-8.

The text encoding popup menu was removed from the Windows→New→Procedure dialog and the dialog always creates procedure files that use UTF-8.

A ListBox control now reports a mouse-down event in an empty listbox.

Replaced all animated cursors (e.g. the spinning beachball cursor) with a single animated cursor.

The PlayMovie operation was changed on Macintosh so that the movie file is always passed to the operating system to be opened with the default program for the given extension. The /W flag is also always ignored. Note that the movie is not automatically played--the user will need to manually play the movie. These changes were required due to removal of features in macOS Catalina (10.15). This has always been the behavior on Windows.

Due to a quirk of programming, ReplaceWave/Y trace=<tracename>, <wave> behaved like ReplaceWave/X. This has been changed so that it behaves like ReplaceWave without a flag. Thus, if the trace is an XY pair, /Y changes the Y wave and not the X wave.

ScaleToIndex() now returns NaN when the input is -INF.

Windows: Added support for displaying PDF pictures. Previously, PDF pictures were only fully supported on Macintosh and were displayed as a gray placeholder box on Windows.

If a folder containing wave, notebook, or procedure files referenced by an experiment is missing when the experiment is loaded, and if you elect to skip the folder, Igor gives you the option to skip loading all waves from that folder. This is of use in rare circumstances when a missing folder contains a large number of reference wave files. It allows you to load the rest of the experiment.

The default pseudo-random number generator for enoise and gnoise was changed from an outdated LCG-variant to Xoshiro256**, a pure 64-bit generator with sound statistical properties. If you have code that first calls SetRandomSeed before calling enoise or gnoise to get repeatable “random” numbers, you will now get different results unless you use the optional RNG parameter with enoise or gnoise to select the LCG-variant generator.

[Windows] ControlInfo kwControlBarTop, etc. return height, width in panel units (just like the values for control sizes in recreation macros) so that the values returned are the same as used for the ControlBar operation. This is a change from previous Igors, but affects only Windows systems with screen resolution higher than 96 dpi.

A wave assignment from a text wave to a numeric wave no longer just sets the numeric wave to the point index value instead of the sourceWave[pointIndex]. (Note that Igor will also generate an error when directly assigning from a text wave to a numeric wave).

### Programming Changes

Igor’s compiler now checks that the module names (#pragma ModuleName) in each independent module are unique.

Igor’s compiler now checks that no regular module name (#pragma ModuleName) is the same as any independent module name (#pragma IndependentModule), including ProcGlobal, except that the regular module name may be the same as the name of the independent module it is in.

When you use #pragma rtFunctionErrors=1, GetDataFolder(mode, dfr) and GetIndexedObjNameDFR() now produce an error on an invalid DFREF input.

CheckDisplayed/W=win works when win is the name of a Gizmo, Panel, or Page Layout window (previously only graph and table window names were accepted).

New Range-based For-Loop. Example:

Function f()
Make/O/T/N=5 tw= "p= "+num2str(p)
for( var : tw )
print var
endfor
End

You can specify the width of default tabs in procedure windows in units of spaces as well as points using a new DefaultTab pragma. See The DefaultTab Pragma For Procedure Files for details.

SetWindow’s markerHook feature passes two new WMMarkerHookStruct members to the custom marker hook function: See Custom Marker Hook Functions.

New DataFolderRefChanges function for monitoring changes to a data folder and its contents.

Font names in user-defined functions and macros can be any string expression, not just the name of a local string variable. This gives up the compile-time checking of literal font names in quotes, like font="New York"; they’re checked at run-time and participate in Font Substitution.

The KillPath operation previously prevented killing a symbolic path used to a load shared wave if the shared wave file was in the current data folder. It now prevents killing a symbolic path used to load a shared wave in any data folder. Use the /Z flag to suppress error reporting if this change creates problems for you.

New keyword for Operation Queue: RELOAD CHANGED PROCS. For detailes, see Operation Queue.

Switch and StrSwitch now detect and throw a compile error for duplicate case statements.

#### Global Variables and Strings with Liberal Names

Prior to Igor Pro 9, Igor allowed you to create a global variable or string with a liberal name from a user-defined function like this:

Function Demo()
String name
name = "L-Var"      // This is a liberal name
Variable/G \$name        // Created variable with liberal name
End

This was a bug because liberal names are allowed for waves and data folders only - see Liberal Object Names. In Igor Pro 9 or later, attempting to create a global variable or string like this throws an error.

This change will cause errors if existing code tries to do this. In that case, the best solution is to fix the code so it does not use liberal names for global variables and strings. If that is not possible, you can make Igor accept such liberal names like this:

SetIgorOption AllowLiberalNamesForVariables=1

### Programming Improvements

Command Completion in procedure windows and the command line now (optionally) includes user-defined functions.

The Edit→Adjust Indentation menu item also trims trailing whitespace from the selection, and ensures that the procedure window text ends with an end-of-line character.

The BeforeExperimentSaveHook now uses the refNum parameter to identify what kind of save is about to be performed.

Added tooltip hook functions so that an Igor programmer can provide a tooltip for any arbitrary rectangle in a window. See Tooltip Hook Functions.

Added a new event to window hook functions: earlyKeyboard allows a window hook function attached to a graph or control panel to pre-empt handling of the keyboard before controls have a chance to use typed characters. See Named Window Hook Events.

Window hook functions now receive the modified event for graph and notebook subwindows in addition to top-level graph and notebook windows. Since a window hook can only be attached to a top-level window, this change means that a control panel window may now receive a modified event for a subwindow. Check the winName member of the window hook structure to find out what window or subwindow the event is for. See Named Window Hook Events, especially the subtopic Modified Events.

Window hook functions now receive the modified event for a graph when the mouse wheel changes an axis range.

Restored delivery of Cmd-<key> (Macintosh) and Ctrl-<key> events to control action procedures and window hook functions. This was lost in the transition from Igor Pro 6 to Igor Pro 7. Note that any such key combination that is a menu item shortcut will be caught by the menu, unless the menu item is disabled.

When using multiple return syntax, you can declare the destination variables in the destination list. WAVE variables do not perform any time consuming automatic lookups. For example, you can use:

[variable a, String s, WAVE/T w]=  somefunc()

without previously declaring a, s and w.

Igor’s compiler no longer erroneously allows multiple “else” causes for if-else-endif or if-elseif-endif conditional statements (it generates a compile error).

#pragma rtGlobals=3 now adds wave type checking at runtime.

For example, a numeric wave accessed as if it were a text wave will produce a runtime error:

#pragma rtGlobals=3

Function/WAVE GetTextWave()
make/FREE data = {1} // Oops, really a numeric wave!
return data
End

Function DemoRuntimeWaveTypeError()
DebuggerOptions enable=1, debugOnError=1, NVAR_SVAR_WAVE_Checking=1
WAVE/T numericWave = GetTextWave() // calling routine may not realize returned wave has wrong type.
print strlen(numericWave[0])        // "error: An attempt was made to treat a numeric wave as if it were a text wave."
End

This new wave type checking can be reverted to Igor 8’s behavior by executing:

SetIgorOption ReportWaveTypeMismatch= 0

A wave assignment to a numeric wave from a text wave no longer just sets the numeric wave to the point index value; now the result is effectively:

numericWave[pointIndex] = str2num(textWave[pointIndex])

When declaring a WAVE variable, you can use a new /ZZ flag to prevent the time consuming automatic lookup; acts as /Z if explicit = provided.

Code that uses /SDFR such as:

WAVE/Z/SDFR=badDFR namedWave

now always sets the wave reference to NULL because of the bad Data Folder Reference badDFR.

Igor 8 just ignored the badDFR (after throwing an error), so that if the current data folder also contained namedWave, then Igor 8’s wave reference finds that wrong wave.

Igor 9’s new behavior is different than

WAVE myWave=badDFR:namedWave

which still silently ignores bad dfrs and finds the named wave in the current data folder, just like Igor 8. That is a problem to be addressed at a later time.

An optimization for a simple wave expression like Variable val=wave[number] that requires number to be an integer to work correctly is no longer employed when number isn’t an integer, so that the Interpolation in Wave Assignments promise is kept.

Runtime error messages generated from \{...} expressions now identify the source (window, object name) of the expression. See Dynamic Text Escape Codes.

New operation WaveTracking, a debugging tool to help you find cases of Free Wave Leaks or other cases in which waves live beyond the lifetime you intend. Also see Wave Tracking.

Added a new keyword to the Operation Queue:

Execute/P "RELOAD CHANGED PROCS "

#### Function and Operation Improvements

Mostly full short int range allowed (-32767, +32767) allowed for Button and other controls pos={left,top} values.

Added CreateDataObjectName function which can replace some combination of CheckName, CleanupName, and UniqueName.

ColorScale now displays the colors used by a Gizmo path, ribbon, or scatter plot, and properly handles the Color Table Span and the Data Values of the First and Last Colors.

[Windows] ControlInfo kwControlBarTop, etc. return height, width in panel units (just like the values for control sizes in recreation macros) so that the values returned are the same as used for the ControlBar operation. This is a change from previous Igors, but affects only Windows systems with screen resolution higher than 96 dpi.

Added the NOCHANGE mode to the ErrorBars operation to make it easier to change error bar appearance without knowing what error bar mode is being used.

Added /CLIP flag to the ErrorBars operation to control the extension of error bars outside the plot area. This may be especially useful if you turn off axis standoff.

FastOp has new syntax and optimizations.

In Igor Pro 7 and 8, FReadLine looked for a UTF-8 byte order mark (see Byte Order Marks) and skipped it if present when called from compiled code (user-defined functions) but not when interpreted (called from the command line or from a Macro or Proc). Now, by default, it looks for and skips a UTF-8 BOM from both compiled and interpreted code.

FReadLine now supports a /ENCG flag that allows you to tell it the text encoding of the file being read in which case it converts the text to UTF-8 for internal storage in Igor. If you specify UTF-8 or UTF-16, it looks for a byte order mark and skips it if present.

FunctionInfo no longer needs SetIgorOption IndependentModuleDev=1 to return information about functions in independent modules other than the running one and ProcGlobal.

The GetFileFolderInfo and SetFileFolderInfo operations accept a /UTC flag which allows you to receive and set the file creation and modification dates using UTC instead of local time.

Added GetWindow axsize and axsizeDC which return the size of the plot rectangle as expanded for any axis standoff.

Added GetWindow wsizeForControls which returns the size of the window in the same coordinates as used for controls (a control with that size would exactly fill the window).

GetWindow gsize, gsizeDC, psize, and psizeDC now return sensible values with a left control bar.

Grep no longer creates a global S_FileName string when called in a function.

IgorInfo(3) no longer mentions “OS:Macintosh OS X", since it has been “macOS” for a while now. Now it returns “OS:macOS". Note: IgorInfo(2) is unchanged; that’s what user code has traditionally used to test for “Macintosh” before #ifdef MACINTOSH was implemented.

IgorInfo(11) returns the type of the current experiment ("Packed", “HDF5 packed", “Unpacked", or “” if the experiment was never saved).

IgorInfo(12) returns the file name, including extension, of the current experiment.

IgorInfo(13) returns a collection of information about the autosave settings.

IgorInfo(14) returns a collection of information about the HDF5 default compression settings.

IgorInfo(15) returns a string specifying the default experiment file format.

IgorInfo(16) returns returns the total number of waves of all kinds (global, free, local) that currently exist. Advanced programmers can use this as a lightweight method for detecting wave leaks.

Added the keyword traceName to the ModifyGraph operation. This makes it possible to set or change a trace name in the same way as /TN can be used with Display and AppendToGraph to set the name. See ModifyGraph for Traces.

Added optional format string parameter to num2str. It allows %g, %d, %f, and %x and arbitrarily long format strings. When missing, the format used is "%.5g".

NOTE: the presence or absence of the format parameter changes how Not-a-Number is rendered, which has always been a difference between sprintf and num2str:

• Print num2str(NaN)
NaN
Print num2str(NaN,"%g")
nan

Added ReplicateString function which returns the input string repeated some number of times.

You can use /T=4 with SaveTableCopy, /T=1 with SaveGraphCopy, and /T=1 with SaveGizmoCopy to save as an HDF5 packed experiment file (.h5xp).

SetDrawLayer no longer creates and sets S_Name when run from the command line or when the drawing layer is changed using Igor’s GUI.

sprintf and printf are no longer limited to 2400 bytes.

Added /AUTO flag to TickWavesFromAxis operation to control whether the tick waves come from Igor’s auto ticks or from the computed manual ticks.

There is now no limit to the length of an element of a text wave parameter passed to the wfprintf operation. Previously text wave element contents were clipped to about 500 bytes. There is also no limit to the length of formatStr. Previously it was limited to 800 bytes.

Added axRect to Structure WMDrawUserShapeStruct, the “axis rectangle", which is the plot rectangle as expanded for any axis standoff.

The TileWindows and StackWindows operations can now be called from user-defined functions. Previously you could call them only via Execute.

Added the /WINS flag to the TileWindows and StackWindows operations. This makes it easier to programmatically specify the windows.

Fixed a problem with free destination waves. Some operations (e.g., Interpolate2), when asked to overwrite a destination wave that was a free wave, created a new free wave instead. This was mostly asymptomatic.

Added PolygonOp operation, which performs operations on planar polygons.

Added TextHistogram operation, which computes the histogram of a text wave where the output bins represent the counts of occurrences of each unique string found in the input wave.

Added support for Winkel III projection in the Project operation.

Added reverse searching in FindValue and in FindSequence.

Added new UnzipFile operation to extract files from a zip archive.

### Data Browser Improvements

Improved performance when deleting many objects at a time and when starting a new experiment or quitting Igor.

The contextual menu of the object list can be extended with “DataBrowserObjectsPopup” user-defined menu definitions.

When a single data folder is selected and the info pane is enabled, the contents of a string within the data folder with a specific name will be displayed as “Notes” for that data folder.

### Window Browser Improvements

You can now drag waves from the Waves in Window list of The Window Browser onto graph or table windows to append those waves to the target window.

The Window Browser and other dialogs that display lists of windows can now display titles of windows under or next to the window’s icon instead of the name. Click the gear icon at the bottom of the window list and use the Display Text submenu to select Title.

Added GetWindowBrowserSelection function to get a list of windows selected in the Window Browser window list.

The contextual menu of the window list can be extended with “WindowBrowserWindowsPopup” user-defined menu definitions.

### Dialog Improvements

Added maxArea support for image Particle Analysis dialog.

The dialogs for loading data (e.g. Load Wave, Load Image, etc.) now allow a single file to be dragged onto the dialog (for example, from Finder or Windows Explorer) as an alternative to clicking the File... button and selecting a file in the file open dialog.

Most dialogs with multiple wave browsers now have a From Target checkbox that applies to each browser individually instead of a single checkbox that applies to all browsers in the dialog. The following dialogs were changed: New Graph, Append Traces, New Category Plot, New Image Plot, Append Image Plot, New Contour Plot, Append Contour Plot, Convolve, and Correlate.

Dialogs that allow the user to select an anchor position for an annotation or text have an improved interface for selecting the anchor position that requires less thought. The dialogs impacted by this change are Annotation, Draw Text, Text Markers, and Control Properties for a TitleBox control.

Dialogs that contain lists of traces now show hidden traces in italic text. This makes it easier to quickly determine if any of the traces in the graph are hidden. The dialogs impacted by this change are Modify Trace Appearance, Remove from Graph, Reorder Traces, and Replace Wave.

Dialogs that contain controls for inserting Igor formatted text now have a Character button to make inserting a special character (e.g. μ or &#x1F9A0;) easier. Previously the Special→Character submenu was used.

Windows: The Pictures dialog now presents additional available clipboard formats when loading from the clipboard. Previously the list of formats was typically limited to at most two image formats (often EMF and TIFF). Now, if the clipboard also contains PNG or JPEG data, those formats are also listed.

### Graphing Improvements

The ability to drag waves from the Data Browser onto a graph to make new traces has been enhanced. New active areas allow you to append traces to specific axes and to make new free axes, as well as select a wave as an X wave. See Appending Traces by Drag and Drop. Also, it is now possible to drag waves onto graphs and tables from the Waves in Window list of the Window Browser.

Added /ALL flag to RemoveFromGraph to remove all non-contour traces. This will be faster than getting the trace list and removing the list. Also added /ALL flag to RemoveImage and RemoveContour to remove all images and contours from a graph.

Added ability to suppress the time portion of the tick labels on a date/time axis. See ModifyGraph for Axes, look for the dateInfo keyword.

Added /HAX and /VAX flags to the SetMarquee operation to make it possible to write Igor procedure code that displays the graph marquee using axis coordinates.

Traces that display a complex wave with ModifyGraph cmplxMode=0 (real and imaginary) have twice as many points as a normal trace. The cursor info window now shows the cursor’s point number as the actual wave row number with “i” or “r” appended. If you edit the cursor’s point number, this suffix is correctly interpreted. If you enter the number with no suffix, it is interpreted as 2*row. If it is odd, it is the imaginary part. See Info Panel and Cursors.

Added the Turbo rainbow-like built-in color table; see Igor Pro 9-Compatible Color Tables. Also added Turbo as a color table wave (for compatibility with Igor 8); see the Color Table Waves in the Igor Pro Folder.

Added Scientific Colour Maps (Version 6.0.4) to the Color table waves in the Igor Pro Folder, specifically in the :Color Tables:SciColMaps subfolder.

The new Draw Presentation Table procedures allow you to programmatically create a “presentation table” in a graph, layout or control panel window. A presentation table provides formatting control beyond that provided by a normal Igor table window.

Added ModifyGraph useDotForX keyword. Set to 1 to change the normal x in ddd x 10^n to a vertically centered dot. This exponential format is often as used in axis labels.

Added new Annotation Escape Code to support text background color. Use “\KB(r,g,b)” to start and then either a color with zero alpha or “\KB0;” to end. See Annotation Escape Codes for details.

Runtime error messages generated from \{...} expressions now identify the source (window, object name) of the expression. See Dynamic Text Escape Codes.

Added ModifyGraph mrkFillRGB keyword to set background fill color of hollow trace markers when ModifyGraph opaque has been set.

Improved marker standoff for lines and markers trace mode (ModifyGraph mstandoff keyword). The standoff is implemented by masking away the bits of the connecting line behind the markers. Previously a square mask was used; now the masking area for most markers is shaped like the marker. Among other things, this allows you to choose a transparent color without having the overlap area of the marker over the line showing more-intense color due to double drawing of transparent color.

Added a feature that allows you to scale markers in axis units (open demo). See Marker Size as f(z) in Axis Units.

You can now add a zero line to an axis that uses User Ticks from Waves.

The Graph Info Panel (see Info Panel and Cursors) contextual menus to control the precision of the displayed numbers now have much finer-grained control of the number of digits. If you right-click on a field displaying date/time information, you can choose different date/time formats, and set the number of digits of fractional seconds to display.

Programmatic control of the display formats for the Graph Info Panel (see Info Panel and Cursors) has been added to the Cursor command. These commands have been added to the graph recreation macros so that a graph will remember the formats you chose for a particular graph.

The Graph Info Window now uses appropriate date/time formats when showing deltas if both cursors are displaying date/time info.

A category plot with more than 197 points now draws correctly (although it may not be very useful!). Zooming in on such a graph now works correctly.

The legend display of a trace that has round or square line caps now looks like the trace.

ModifyGraph linTkLabel now supports linTkLabel=2 to suppress the normal space before the units. For example, “20 °W” becomes “20°W".

### Box and Violin Plot Improvements

Box Plots and Violin Plots now support per-dataset settings. For instance, in a trace with several box plots, you can change the fill color of a single box. Previously, all the boxes or violins in a single trace had to look alike. See ModifyBoxPlot and ModifyViolinPlot. The Modify Box Plot and Modify Violin Plot dialogs support per-dataset settings via a menu of datasets.

Box Plots and Violin Plots now allow you to control the color, marker and marker size of each individual data point in a data set. See ModifyBoxPlot and ModifyViolinPlot.

Added two new methods for setting whisker length in box plots: arbitrary upper and lower percentiles (whiskerMethod=6) and arbitrary mean ± factor*(standard deviation). See ModifyBoxPlot.

Added new control over the meaning of outliers and far outliers in box plots via new ModifyBoxPlot outlierMethod keyword. See ModifyBoxPlot.

Prior to Igor 9, all data points (normal, outlier, far outlier, median and mean) were drawn below the box and whisker lines to avoid obscuring the lines. Now you can request that they be drawn above the lines using the ModifyBoxPlot markersOnTop keyword.

Box plots can now have filled markers (like the ModifyGraph opaque keyword) using the ModifyBoxPlot markersFilled keyword. You can also set the fill color for hollow markers analogously to the new ModifyGraph mrkFillRGB keyword. The ModifyBoxPlot keywords are dataFillColor, outlierFillColor, farOutlierFillColor, medianMarkerFillColor, and meanFillColor.

Similarly, violin plots can also have color-filled markers. Filled markers are selected using the ModifyViolinPlot keywords MarkerFilled, MeanMarkerFilled, and MedianMarkerFilled. The fill color is set by ModifyViolinPlot keywords MarkerFillColor, MeanMarkerFillColor, and MedianMarkerFillColor.

### Table Improvements

Copying or cutting a very large number of cells is much faster on Windows. (It was always fast on Macintosh.) This also affects SaveTableCopy.

In Igor Pro 8 and before, if you selected N rows in a table and did a paste when the clipboard contained M rows, Igor replaced the N rows with the M rows from the clipboard.

Now, in this situation, Igor displays the Rows to Paste dialog which gives you three options:

1. Paste M rows using the current selection
2. Change the selection and paste N rows
3. Replace the selected N rows with M rows from the clipboard

The previously-existing Columns to Paste dialog was updated but still presents the same two options as before: to paste M columns or to paste N columns. The option of replacing N columns with M columns is still not supported.

Previously if you created a table displaying a date/time wave (see Date/Time Waves) from the command line, the column format for the date/time wave defaulted to date or date/time depending on the content of the wave. This choice of default for date/time waves was not applied if you created a table from a procedure. Now the date/time default is applied whether you create the table from the command line or from a procedure.

Object reference waves (WAVE waves and DFREF waves) are now displayed by default as hexadecimal. See Object Reference Wave Formatting for details.

For advanced users: If you display an object reference wave (a WAVE wave or DFREF wave) in a table, turn on column info tags via the Table menu, and hover the mouse over an element of the object reference wave, Igor displays in the column info tag information about the wave or data folder referenced by the element.

For advanced users: If you right-click table cells containing wave references, you can choose Edit Waves from the resulting contextual menu to edit the referenced waves. See Editing Waves Referenced by WAVE Waves for details.

Added ModifyTable viewSelection to bring the selection into view.

In a table displaying a 3D wave, if you press Command (Macintosh) or Ctrl (Windows) and double-click the Next Layer or Previous Layer icons, Igor displays a dialog in which you can enter the layer index.

​In a table, if you select a cell in the dimension label column of a 3D wave, the ID area shows “Rx Label Lz” instead of just “Rx Label” where x denotes a row number and z denotes a layer number. Similarly, if you select an index column, it now displays “Rx Index Lz".

### Page Layout Improvements

The new Draw Presentation Table procedures allow you to programmatically create a “presentation table” in a graph, layout or control panel window. A presentation table provides formatting control beyond that provided by a normal Igor table window.

The page layout status area shows the right and bottom coordinates as well as the width and height.

When dragging the marquee in a page layout, the marquee coordinates are shown in the status area.

Windows: Added support for displaying PDF pictures. Previously, PDF pictures were only fully supported on Macintosh and were displayed as a gray placeholder box on Windows.

### Notebook Improvements

Windows: Added support for displaying PDF pictures. Previously, PDF pictures were only fully supported on Macintosh and were displayed as a gray placeholder box on Windows.

You can now disable output to a notebook that you are using as a worksheet by unchecking the Copy Command Output to the Notebook checkbox in the Command Window section of the Miscellaneous Settings dialog. See Notebooks as Worksheets for background information.

When a notebook window is active, you can save all modified standalone notebook files at once by choosing File→Save All Standalone Notebook Files. See Saving All Standalone Files for details.

You can specify the width of default tabs in notebooks in units of spaces as well as points. See Notebook Default Tabs for details.

Added syntaxColorSelection keyword to the Notebook operation to syntax color the selected text in a formatted text notebook.

In formatted notebooks, you can set the text format of the selected text to the ruler default by choosing Notebook→Set Text Format to Ruler Default or by clicking the Default button in the ruler bar.

The Notebook operation text keyword now converts CRLF and LF to CR. CR is the line ending used internally by Igor.

It is now possible to change the frequency of checks for external editor modifications to plain-text notebooks and procedure windows, or to disable the check entirely. This may be useful if you have procedure windows stored on remote servers. See Misc→Miscellaneous Settings, Text Editing category, External Editor tab.

The GetSelection operation can now return information about the screen position of the selection in a notebook, though this is needed only in very rare cases.

### Help Improvements

Added support for help for User-Defined Hook Functions like IgorStartOrNewHook. These functions now appear in the Help Browser Command help pane and are supported by the contextual menu Help For and Insert Template For items.

Added /PICT flag to OpenHelp, which provides information about all pictures in a help file.

Windows: Added support for displaying PDF pictures. Previously, PDF pictures were only fully supported on Macintosh and were displayed as a gray placeholder box on Windows.

You can select a help topic or subtopic name in a procedure window or notebook, then right-click, and choose Help For <topic> to display the help for that topic. This works only if the help file containing the topic is already open. This feature can be used to provide help for user-defined functions in packages with an associated help file that is already open.

### Command Window Improvements

Command Completion in procedure windows and the command line now (optionally) includes user-defined functions.

When you hover the mouse cursor over commands in procedure windows and the command window, Igor displays a tooltip with information about the command. See Command Tooltips for more information.

### Graphics Export Improvements

Igor’s PDF export now supports transparency and does a better job of font embedding.

Windows: You can copy a JPEG picture in Igor and paste it into a Microsoft Office application. However, few other Windows programs support pasting JPEG and PNG is a better choice for scientific graphics.

Image display now creates a shadow bitmap to be drawn to the destination in place of raw data when conditions require individual rectangles be drawn for each data point. This is to avoid creation of huge PDFs (or even a crash) with oversampled data. This can be controlled using

SetIgorOption UseImageShadowBitmap = 0 or 1 (or for dev, 2)

Zero disables the code, 1 (the default) enables it for PDF export and other non-bitmap destinations while, for testing, 2 enables it for on-screen and other bitmap uses. Regardless of the setting, it is (currently) used only when conditions require individual rectangles such as nonlinear axes such as log mode or coordinate values from x or y waves. Note: when used with Quartz PDF, the result may be blurry.

### Procedure Window Improvements

You can align comments in a procedure window by selecting text and choosing Edit→Align Comments. See Aligning Comments for details.

You can specify the width of default tabs in procedure windows in units of spaces as well as points. See Procedure Window Default Tabs for details.

Command Completion in procedure windows and the command line now (optionally) includes user-defined functions.

MatrixOP and APMath functions are now syntax colored using a new “Special Function” color setting. See Syntax Coloring for more information.

Syntax coloring for user-defined functions is now enabled by default. See Syntax Coloring for more information.

When a procedure window is active, you can save all modified standalone procedure files at once by choosing File→Save All Standalone Procedure Files. See Saving All Standalone Files for details.

When you hover the mouse cursor over commands in procedure windows and the command window, Igor displays a tooltip with information about the command. See Command Tooltips for more information.

### Gizmo Improvements

Added AppendToGizmo defaultPath to display a triplet wave as a default path plot.

Added AppendToGizmo defaultVoxelgram to display a default voxelgram.

Added AppendToGizmo defaultIsoSurface to display a default isosurface.

Added AppendToGizmo defaultVolumeSlices to display three volume slices from a 3D wave.

Gizmo now displays data wave names in the default window title.

Added ModifyGizmo groupScaling=1 for independent group scaling.

Added ModifyGizmo scalingMode for group objects.

Added ModifyGizmo setOuterBox for group objects.

Added user control over the length and orientation of the tick marks for all Gizmo axes.

Changed Isosurface object drawing in cloud mode to support external or internal colors. Also modified the IsoSurface dialog.

Added an Invert CTab checkbox in the Gizmo Image dialog.

Changed the default offset of the z-axis label.

### Drawing Improvements

Added axRel coordinate system to the Drawing Coordinate Systems. AxRel is just like prel except it also includes the axis standoff.

Added a Move to Layer item to the draw tools palette and to the draw objects contextual menu. This streamlines what used to be a process of selecting, cutting, changing the draw layer and pasting if you wanted to change the draw layer of a drawing object.

Fixed a bug in the Retrieve Offscreen Objects menu in the tool palette and draw objects contextual menu when the objects are grouped. Previously, Retrieve treated the objects in a group as individual objects. Now it retrieves the entire group.

Converted all draw tools code to use floating point variables. This should eliminate problems with extreme zoom levels and other mis-matches caused by integer math.

Fixed a number of lingering bugs with the display of the drawing grid.

The DrawPoly and DrawBezier operations consult the new SetDrawEnv subpaths and fillRule values to alter the interpretation of NaNs in their coordinate lists:

• It is possible to separate a polygon or Bezier curve into segments by adding coordinate pairs that are NaN. By default, such segments are drawn as if they are separate shapes. If you fill such shapes with a color having transparency, any overlapping areas will darken because they will be painted twice.
•
• If you use SetDrawEnv subpaths=1, the segments are sub paths within a single shape. The segments are drawn with no line linking the subpaths, but when filled the entire shape will be treated as a single shape, making it possible to create a shape with internal holes. The way those holes are filled is affected by the SetDrawEnv fillRule keyword.

The user interface for drawing and editing polygons and Bezier curves has been extensively revamped; it is easier now to constrain the drawing and editing to 15 degree angle increments from horizontal/vertical, and to align dragged anchor points to their neighbors when the Shift key is pressed.

Editing a Bezier curve is particularly upgraded; contextual menus invoked on the anchors, control points, and the curve between anchors provide easy ways to make the curves smooth, sharp, symmetrical, or 90 degree arcs. It is now possible to undo/redo added points while drawing and editing.

In addition, “closed” Bezier curves (where the first and last anchors have the same coordinates) treat the control points attached at the closure anchors identically to all other control points on either side of their anchor; moving a control point also moves the control point on the other side of the anchor to keep the angle between them the same (usually parallel).

For more details about editing Bezier curves and polygons, see the Editing a Polygon topic.

New operation Text2Bezier creates the data for a Bezier curve corresponding to the outline of some text. Allows special effects like text filled with a gradient, or text outline with different fill color.

Added the /ND flag to the GraphWaveEdit operation to prevent deletion of points from the wave being edited.

The new Draw Presentation Table procedures allow you to programmatically create a “presentation table” in a graph, layout or control panel window. A presentation table provides formatting control beyond that provided by a normal Igor table window.

Windows: Added support for displaying PDF pictures. Previously, PDF pictures were only fully supported on Macintosh and were displayed as a gray placeholder box on Windows.

### Annotation Improvements

Added support in Igor TeX for space codes: \quad \, \: \; \! \ \qquad. Also added support for \overleftarrow \overrightarrow \widehat \hat \widetilde \tilde \textmu.

A limitation on Symbol font backward compatibility with Igor 6 was eliminated.

ColorScales honor the host graph’s ModifyGraph useComma, useLongMinus, and useDotForX settings.

Added new Annotation Escape Code to support text background color. Use "\KB(r,g,b)" to start and then either a color with zero alpha or "\KB0;" to end.

Runtime error messages generated from \{...} expressions now identify the source (window, object name) of the expression.

### Control and Control Panel Improvements

Panels can now be expanded or contracted using the Panel→Expansion submenu and the ModifyPanel expand command. A default panel expansion can be set in the Miscellaneous Settings dialog. Any expansion other than 1.0 may present an alternate GUI appearance in order to maintain functionality.

Prior to Igor Pro 9, a ListBox control did not respond to mouse clicks if the control was empty. Now an action procedure for an empty ListBox control will receive a mouse down event (event code 1, see WMListboxAction). Along with this change, we fixed a bug: an empty ListBox control with header cells and the userColumnResize keyword set to non-zero will now allow you to drag the cell divider to resize the columns.

When using Button picture keyword, you can now use a picture with transparent background that truly makes the button have transparent areas. To enable transparent backgrounds, use the labelBack keyword to set the button’s color to a transparent color.

The new Draw Presentation Table procedures allow you to programmatically create a “presentation table” in a graph, layout or control panel window. A presentation table provides formatting control beyond that provided by a normal Igor table window.

The maximum length of a control’s help string has been increased from 255 to 1970 bytes.

GetWindow wsizeForControls returns a panel’s size in the same units used to position controls.

Control titles can now be 255 characters long; the previous limit was 100. Note that this can create a control panel that is not backwards compatible.

A CheckBox control can now take a point from a wave as the control value instead of a global variable.

ModifyPanel noedit=1 no longer completely prevents the operate-mode contextual menu, but the only content is an Expansion menu.

### Analysis Improvements

#### Improved Analysis Operations and Functions

FFT/Rows and FFT/COLS no longer require an even number of points in the input when the wave is complex.

Added a wave note to triangulation wave created by ImageInterpolate/STW.

Histogram operation now supports /DP in /A and /CUM.

FFT and IFFT now support /FREE flag when used with /ROWS or /COLS.

Added /FREE flag to Interpolate2 for creating free output waves.

Added /OSCW flag to CWT to force creation of scaling wave in all scaling modes.

The poly and poly2D functions now support complex coefficients and will return a complex value in a complex expression.

FilterFIR improvement: a band reject filter results when /LO frequencies are less than the /HI frequencies (the stop bands of the filters overlap).

This accomplished by designing a band pass filter instead, and then generating the coefficients that subtract that filtered result from the original data. In other words, band reject data = original data - band pass filtered data.

Previous to this change, the resulting filter would have been a “reject all bands” filter.

#### New Analysis Operations and Functions

Added new HCluster operation that does agglomerative hierarchical cluster analysis. The input can be either a matrix in which rows represent vectors in a data space, or a square distance matrix giving the distance or dissimilarity between pairs of vectors. Output is a distance matrix if you start with a vector matrix, and/or a wave containing information needed to draw a hierarchical dendrogram.

Added binomial(), bernoulli(), Stirling2() and factorialPower() functions to APMath.

Added built-in WaveMinAndMax function to calculate the minimum AND maximum value in a wave (or subrange of a wave). This is much faster than calling WaveMin followed by WaveMax.

Made the peak functions from PeakFunctions2 XOP built-in. They can be easily wrapped in user-defined functions to make fast fitting functions. The functions are: MPFXGaussPeak, MPFXLorentzianPeak, MPFXVoigtPeak, MPFXEMGPeak and MPFXExpConvExpPeak.

### Statistics Improvements

The enoise and gnoise functions use the new Xoshiro256** pseudo-random number generator by default. Earlier generators can still be selected by using the optional RNG parameter.

### Matrix Improvements

Added MatrixMultiplyAdd operation to calculate the matrix expression matC= alpha*matA x matB + beta*matC. This operation uses LAPACK for speed.

Added support for constants in MatrixOP syntax.

Added new MatrixOP functions: zapNaNs(), zapINFs(), spliceCols(), addRows(), addCols(), waveX(), waveY(), waveZ(), waveT(), decimateMinMax(), sq(), Select(), varBeams(), KronProd(), bitReverseCol(), setColsRange(), layer(), layerStack(), maxMagAB(), minAB(),minMagAB(), gammaln(), gamma(), expIntegralE1(), greaterOrEqual(), log2(), oneNorm(), normP() and expm().

Added new MatrixOp flags: /T=killMode to display the left hand side result in a table, /AT=type to set memory allocation type and /NV=mode to determine if Intel MKL vector functions should be used.

MatrixOP now allows a 2D wave to be handled as a 1 layer 3D wave in the layer() function. The layer() function now has an optional third parameter that allows the extraction of a layer from a specified chunk of a 4D wave.

MatrixOP now supports adding, multiplying and dividing a matrix and a constant. In this case the constant behaves as if it were a full matrix of the constant value and the calculations proceeds as if it is an element-by-element calculation.

Improved efficiency of MatrixOP 3D wave calculations. Added automatic multithreading for MatrixOP scaleRows() and scaleCols(). Improved efficiency of add, subtract, multiply, divide element by element calculations using Intel vectorized instructions.

The MatrixOp functions addRows(), addCols(), scaleRows() and scaleCols() now accept a scaling wave parameter that has any number of rows and columns as long as the total number of points of the scaling wave parameter matches the required dimension of the first parameter to the function.

Added destination flags and /FREE flag to MatrixLinearSolveTD.

Fixed indexing problems in MatrixOP trigonometric transform functions.

Added new MatrixBalance, MatrixReverseBalance and MatrixSparse operations.

### Curve Fitting Improvements

In the Curve Fitting dialog, the Graph Now button (Coefficients tab) now honors your choices in the Destination Wave menu (Output Options tab) and the Subrange settings (Data Options tab).

Curve Fitting now supports fitting to complex functions. See Fitting with Complex-Valued Functions for details.

In Igor Pro 8, due to a mistake, CurveFit/N=1 caused CurveFit to do no screen updates at all, even though the intention was to do one update at the very end. This turned out to be good, so it is now documented as the intended behavior.

CurveFit/N=1 in Igor Pro 8 did a screen update if you used the /X flag (which means “extend the fit curve to the full range of the graph"). Since /N=1 is documented to suppress all updates, and updates are slow, this was eliminated. That allows you to control this potentially slow behavior: if you write a user-defined function that creates a graph or adds a trace to a graph, and then your function calls CurveFit or FuncFit with the /X flag, you probably need to call DoUpdate before calling CurveFit/X or FuncFit/X.

Added new built-in fitting function, Log: y = a + b*log(x). See Built-in Curve Fitting Functions.

As a convenience to Igor programmers, the CurveFit operation now accepts as few as 1 fit coefficient for the Poly built-in fit function (a very slow way to compute the mean!).

#### Multipeak Fitting Improvements

Thanks to the hard work and generosity of Igor power user Stephan Thürmer (AKA “chozo” in the Igor Forums), the Multipeak Fitting package has undergone a long-needed facelift and enhancement. He has fixed a number of bugs and improved usability in many small ways.

In addition, the package has been renamed from “Multi-peak Fitting 2” to the simpler “Multipeak Fitting". We hope this will not create confusion or problems! There are so many changes to the package that we felt it deserved to be promoted to version 3. By removing the version number from the name, we hope to avoid future name changes.

Other changes include new peak shapes:

• GaussArea fits the peak area instead of peak height
• LorenzianHeight fits the peak height instead of area
• VoigtArea fits the peak area and Gauss and Lorentz FWHM instead of shape factor and a height and width that aren’t height and width.
• DoniachSunjic for those into X-ray photoelectron spectroscopy
• Post-Collision Interaction peak shape (optional)

new baseline functions:

• ArcTan
• Shirley, in two variants
• Tougaard (optional)

Implemented a new protocol for baseline functions that allows them to implement an automatic initial guess function. This was needed for both the ArcTan and Shirley background functions.

Implemented a method for loading the optional PCI peak shape and Tougaard baseline

Improved the initial guesses for several of the peak shapes

Implemented a method to find additional peaks by inspecting the residuals from a fit

Improved the automatic peak finder

Improved the ease of use of constraints, especially the Additional Constraints panel you get by clicking the More Constraints button in the Options area at the bottom of the main panel

Expanded the Start Multipeak Fit panel. It is now the Start or Resume Multipeak Fit panel

The Start or Resume Multipeak Fit item is at the top level of the Analysis menu so you don’t have to go chasing it into multiple submenus.

Moved the Multipeak Fit menu to the top level of the Analysis menu, and added some options to the menu. This was accomplished at the expense of removing the Multi-peak Fitting 1.4 menu item.

Added Expand All and Collapse All options to the popup menu in the peak list.

Added a way to create asymmetric peaks in the Add or Edit panel.

Created a GUI for the AutoMPFit() function, giving much easier access to automated batched Multipeak Fits

Added a utility to convert between the AutoMPFit batch results and a GUI-compatible fit set, allowing you to manually fit a set that failed during a batch fit.

Added a way to easily delete the latest fit set.

Added a way to easily delete all fit sets.

Added an option to export the fit curves when creating a results graph.

For more information about the Stephan’s changes you can read the Multipeak Fitting help, check out the comments in the Multipeak Fitting procedure file (select Windows→Procedure Windows→Multipeak Fitting.ipf), and check out the revised demo experiment.

### Image Processing Improvements

Added triangle path wave output in ImageTransform voronoi.

Added new flag (/PRTF) to ImageTransform ccsubdivision to add small perturbations to the input data in order to avoid data degeneracy.

### Data Import And Export Improvements

The LoadWave operation supports the /NAME flag which is primarily intended to make it easy to incorporate the file name in the name of loaded waves. You can access this feature through the Use File Name in Wave Names checkbox in the Load Waves dialog. See Using the File Name in Wave Names for details.

You can load multiple Igor binary files (typically .ibw) by choosing Data→Load Waves→Load Igor Binary and choosing multiple files in the resulting Open File dialog. See Copy or Share Wave Dialog for details.

As of Igor Pro 9, operations, functions, and structures for loading and saving HDF5 data are built into Igor. Previously the operations and functions were implemented by the HDF5 XOP and the structures were implemented in “HDF5 Browser.ipf". The HDF5 browser is still implemented in Igor procedures via the “HDF5 Browser.ipf” file but it is now an independent module.

See HDF5 Browser Changes in Igor Pro 9 for a discussion of new HDF5 Browser features.

Igor Pro 9 adds numerous features related to HDF5 compression. See HDF5 Compression for details.

Igor Pro 9 adds HDF5 default compression which can be applied to saving HDF5 packed experiment files. See HDF5 Default Compression for details.

The HDF5SaveGroup operation supports compression for HDF5 data files via the /COMP flag.

The SaveExperiment, SaveData, SaveGraphCopy, SaveTableCopy, and SaveGizmoCopy operations support compression for HDF5 packed experiment files via the /COMP flag.

Added to ImageLoad a new flag (/RONI) to only compute the number of images in a TIFF file containing multiple images.

Added to ImageSave support for reading/writing custom tags when saving in BigTIFF (/BIGT) format.

Added to ImageSave /C=compression to support saving compressed TIFF images when using /BIGT.

Added new UnzipFile operation to extract files from a zip archive.

#### HDF5 Browser Changes

The HDF5 Browser is now implemented as an independent module so it continues to work even if other procedures need to be compiled.

Added a Recent Files popup menu to the right of the Open HDF5 File button in the HDF5 Browser.

You can right-click the Datasets, Group Attributes, and Dataset Attributes lists to load data. You can also click the triangular icons above those lists. See HDF5 Browser Contextual Menus for details.

The HDF5 Browser includes a Sort By Creation Order If Possible checkbox. If checked, and if the file supports listing by creation order, the HDF5 Browser displays groups and datasets in creation order. Most HDF5 files do not contain creation-order information and therefore cannot be sorted by creation order. However, files written by Igor 9 do contain this information.

The HDF5 Browser has a new Show Properties in Dump checkbox. This checkbox appears in browsers created in Igor 9 only, not in browsers created in Igor 8 or before.

The HDF5 browser displays null bytes in strings as ␀(U+2400).

When you load a text wave containing control characters other than carriage-return, linefeed, and tab, the wave’s text data text encoding is set to binary instead of UTF-8.

If you open an Igor 9 experiment in Igor 8 or before, the Show Properties in Dump checkbox appears but does nothing.

In order to use, in Igor Pro 8, HDF5 Browser windows in experiments saved by Igor 9 or later, you need Igor Pro 8.04 or later. Igor Pro 8.04 includes “HDF5 Browser.ipf” version 1.26 which is required for compatibility with Igor Pro 9 HDF5 Browser windows. “HDF5 Browser.ipf” version 1.27 has some non-essential improvements in Igor Pro 9 compatibility. ">Download HDF5-Browser-Latest-for-Igor8.zip.

#### HDF5 Programming Improvements

The HDF5SaveData and HDF5SaveGroup operations now save 64-bit integer data as 64-bit integer if you use the new /OPTS=1 flag. Previously they saved 64-bit integer as double-precision floating point.

The HDF5SaveData and HDF5SaveGroup operations can now create datasets and groups such that attributes subsequently attached to them can be read back in creation order.

The HDF5LoadData and HDF5LoadGroup operations now load 64-bit integer data as 64-bit integer if you use the new /OPTS=1 flag. Previously they loaded 64-bit integer as double-precision floating point.

The HDF5LoadData and HDF5LoadGroup operations can check for binary data loaded into text waves from string datasets and mark such text waves as containing binary. If you load binary data from string datasets, see bit 1 of the /OPTS flag of those operations for details.

HDF5 VLEN arrays of references can now be read by HDF5LoadData. This is an obscure feature that will be of interest to few. It allows HDF5LoadData to load the DIMENSION_LIST attribute of a netCDF-4 dataset which uses HDF5 dimension scales to support netCDF coordinate variables.

HDF5 reference fields in compound data can now be read by HDF5LoadData. This is an obscure feature that will be of interest to few. It allows HDF5LoadData to load the REFERENCE_LIST attribute of a netCDF-4 dimension scales.

Added the HDF5DimensionScale operation of use mostly for working with netCDF-4 files.

Using the HDF5SaveData /GZIP flag sets the layout to chunked if compressionLevel or shuffle are non-zero. You can override this using the /LAYO flag but there is no reason to do so since chunked layout is required when using compression.

When using the HDF5SaveData /LAYO flag, if you specify fewer chunk sizes than there are dimensions in the wave being saved, or if you specify 0 for a dimension’s chunk size, HDF5SaveData uses the size of the corresponding wave dimension as the chunk size.

If you are satisfied with writing a compressed dataset as one chunk, you can use /GZIP and omit /LAYO.

The HDF5SaveGroup operation supports compression for HDF5 data files via the /COMP flag.

The HDF5SaveData and HDF5SaveGroup operations provide control over the format used for writing strings via the /STRF flag. This is needed only in rare cases. See HDF5 String Formats for details.

The SaveExperiment, SaveData, SaveGraphCopy, SaveTableCopy, and SaveGizmoCopy operations supports compression for HDF5 packed experiment files via the /COMP flag.

The HDF5SaveData and HDF5SaveGroup operations can now write attributes representing a wave’s creation and modification dates. The HDF5LoadData and HDF5LoadGroup operations load these attributes if present and set the creation and modification dates. For details, see bit 6 of the /IGOR=attributesMask flag for the HDF5SaveData operation.

The HDF5SaveData and HDF5SaveGroup operations can now create datasets and groups such that attributes subsequently attached to them can be read back in creation order.

Fixed a longstanding bug that caused HDF5SaveGroup to not save zero-point waves.

Previously HDF5ListGroup and HDF5LoadGroup listed and loaded groups and datasets alphabetically. That is the default behavior of the HDF5 library. As of Igor Pro 9, if a group includes creation-order information, and if you include /ORDR=1, HDF5ListGroup and HDF5LoadGroup list and load the group in creation order. Most HDF5 files do not include creation-order information and so are listed and loaded in alphabetical order. However, HDF5 files written by Igor Pro 9 or later include creation-order information and so are listed and loaded in creation order.

The /CONT and /ERR flags were added to the HDF5ListGroup operation. These are for use by the HDF5 Browser. Most applications will not need them.

The /SEP flag was added to the HDF5ListGroup and HDF5ListAttributes operations. This flag is for use by the HDF5 Browser. Most applications will not need them.

Added the HDF5LinkInfo operation. This is for use by the HDF5 Browser. Most applications will not need it.

The HDF5DataInfo function can now optionally return information about layout, chunking, and compression filters. These are of interest to advanced HDF5 users only.

The LoadData operation can load data from an HDF5 packed experiment file.

The HDF5Dump operation accepts a /PROP=dumpProperties flag. If provided and dumpProperties is 1, the dump shows HDF5 object properties. This is of interest to advanced HDF5 users only.

The HDF5MakeHyperslabWave function in “HDF5 Browser.ipf” now makes a free wave if you pass "" for path. It now returns a wave reference.

You can use /T=4 with SaveTableCopy, /T=1 with SaveGraphCopy, and /T=1 with SaveGizmoCopy to save as an HDF5 packed experiment file (.h5xp).

#### HDF5 Programming Changes

Because HDF5 is now built in, pre-existing procedures require some changes to work with Igor Pro 9 or later.

If you have definitions for these structures in your procedures, remove them since they are now built in: HDF5DataInfo, HDF5DatatypeInfo

When using the HDF5DatasetInfo, HDF5AttributeInfo, and HDF5TypeInfo functions, you must assign the result of the function to something. Previously this was accepted:

STRUCT HDF5DataInfo di
InitHDF5DataInfo(di)    // Set input fields.
HDF5DatasetInfo(bd.fileID, fullPath, 0, di)

Now you must change the last line to assign the result, even if you do not use it:

Variable result = HDF5DatasetInfo(bd.fileID, fullPath, 0, di)

The same goes for HDF5AttributeInfo and HDF5TypeInfo.

The file “HDF5 Browser.ipf” is now an independent module and is always loaded at startup.

The HDF5 constants and public utility routines previously provided by “HDF5 Browser.ipf” are now provided by a new public procedure file, “HDF5 Utilities.ipf", which is also always loaded at startup.

If you have experiments in which “HDF5 Browser.ipf” was #included, you will get an “Include File Not Found” error and you should remove the #include statement. If you have experiments in which “HDF5 Browser.ipf” was explicitly opened you will get “file not found” error on opening the experiment and you should skip loading the file.

### Miscellaneous Improvements

Windows: Some emoji characters (😀 for example) now display in color instead of black and white, as they did in Igor 8. We have not intentionally made any changes to allow this to happen, but suspect this is due to using a newer version of the Qt framework on which Igor is based.

### New And Improved Packages

The Color Wave Editor package has been updated to support transparency and to add a way to use it from your own procedure code.

The Multipeak Fit package has been renamed and greatly improved: Multipeak Fitting Improvements

Added a new package: Analysis→Packages→Hierarchical Clustering and Dendrogram

This new package provides a GUI for the new HCluster operation and provides a procedure to interpret the rather opaque dendrogram information from HCluster to draw a dendrogram and heat map in a graph window. See the new Example experiment, Heat Map and Dendrogram Demo.pxp listed in the next section.

Small update to the Batch Curve Fitting package: added two new built-in fit functions to the options for the package.

Added the “Reduce Matrix Size.ipf” WaveMetrics procedure file. It adds the ReduceMatrixSize function which reduces the number of rows and/or columns of a matrix (2D wave) by sampling or averaging.

The Transform Axis package has a new user interface, and some bugs fixed.

The Global Fit package has improvements to the user interface and now has some built-in functions for common needs.

### New And Improved Example Experiments

#### Modified Example Experiments

• Map Projection Demo
• Multipeak Fitting Demo

#### New Example Experiments

• Gizmo Waterfall Demo
• PolygonOp Demo
• Marker Size in Axis Units Demo
• Heat Map and Dendrogram Demo

Forum

Support

Gallery