title image
Research Institute for Microbial DiseasesImmunology Frontier Research CenterThe University of Osaka
Immunochemistry

NeoFlow User Manual

NeoFlow is an all-in-one application for flow cytometry analysis—including importing FCS files and FlowJo .wsp files, gating, and fluorescence compensation—and for creating publication-ready figures with powerful layout capabilities comparable to those of a dedicated graphics application. It can rapidly render up to 500 plots and 100,000 objects on a single page. Features include vector drawing, multi-page layouts, PDF/PPTX import and export, and highly compatible copy-and-paste with other applications.


Chapter 1 Workspace (1): FCS Import and File Management
1.1 What Is a Workspace?

A "workspace" is the basic unit of work in NeoFlow. A workspace stores, as a single unit, the list and locations of imported FCS files, gates created for each file, compensation (spillover) matrices, groups, axis-scale settings, and layouts (figures). Each workspace corresponds to one window, and multiple workspaces can be open at the same time. When a new workspace is created, its window title is automatically numbered as "Workspace 1," "Workspace 2," and so on. When a workspace file is opened or saved, the title changes to the file name without its extension.

1.1.1 Screen Layout

The Workspace window consists of the following four areas.

Area Location Main Contents
Toolbar Top edge of the window (42 px high) File import, save and load; opening various views; Auto Compensation; status display
Left panel (file list) Left side of the window "FCS Files" header row, group bar, column headers, file tree, and drop zone
Desktop area To the right of the left panel Workspace area for Graph windows and other items; displays operating hints when empty
Status Far right of the toolbar Number of loaded samples / drag-and-drop guidance

Toolbar order (left to right)

Position Element Description
1 Logo
2 Separator
3 "📥 Import FCS" Opens the FCS selection panel
4 "💾 Save" Saves the workspace
5 "📂 Open" Loads a workspace/FlowJo file into the currently open workspace
6 Separator
7 "🖼️ Layout" Opens the layout (figure editor)
8 "📊 Statistics" Opens the statistics table
9 「🎛️Compensation」 Opens the Compensation editor
10 Spacer Right-aligns the controls that follow
11 "Auto Compensation" checkbox See 1.3.4
12 Application-status label Auto Compensation application status (see 1.3.4)
13 Separator
14 Status label See 1.2.7

Left-panel order (top to bottom)

Position Element Description
1 "FCS Files" header row "Remove from Group" (or "Delete Selected") button and "↩ Undo" button on the right
2 Group bar Group tabs (pills) arranged in one horizontal row; "+" at the far right
3 Column-header row "Select All Samples" checkbox at the far left, followed by the "Name" and "Date" columns
4 File tree Sample rows with gate rows beneath them
5 Drop zone Dashed-outline label: "Drop FCS files or folders containing FCS files"
1.1.2 Hint Display in the Desktop Area

When no Graph windows are open, a two-line hint is displayed in the center of the desktop area.

  • Line 1 (14 pt): "Double-click a sample to open a graph"
  • Line 2 (12 pt): "(Double-click a gate to drill down further into that population)"

The color is #95a0ae, the text is centered, and a maximum of two lines is used. The display conditions are as follows.

Situation Hint Display
At least one Graph window is open Always hidden
Immediately after importing or deleting FCS files Displayed only when zero files are loaded
Other cases, such as immediately after closing a Graph window Displayed only when at least one file is loaded
1.1.3 Events That Open a Window
Trigger Action
App launch 0.3 seconds after launch, creates an empty Workspace window only if no file was opened at launch and there are no open windows
Click the Dock icon If there are no visible windows and no open windows, opens a new empty workspace
File > "New Workspace" (⌘N) Creates a new workspace and brings it to the front (1.5.1)
FCS import At the end of import, opens a Workspace window if none exists
Open a workspace file Reuses an empty workspace if available; otherwise creates a new one (1.5.7)

Difference from the Windows version: In NeoDraw, the layout-only application, returning via the equivalent of the Dock icon opens a Layout window.


1.2 Importing FCS Files
1.2.1 Import Methods

There are several ways to import FCS files, but the following three all open exactly the same "FCS selection panel." The result is the same regardless of which method you use.

Operation Location Shortcut Result
"Import FCS..." File menu in the menu bar ⇧⌘I Opens the FCS selection panel
"📥 Import FCS" Workspace-window toolbar Opens the FCS selection panel
Click the drop zone Dashed-outline area at the bottom of the left panel Opens the FCS selection panel

You can also import files by drag-and-drop (1.2.3/1.2.4).

"Import FCS..." is located below a menu separator, in the block following "Save As...." The drop-zone label is centered and limited to two lines. When the pointer is placed over it, the text changes from light gray to the normal text color and the cursor changes to a pointing hand.

1.2.2 FCS Selection Panel
Item Specification
Multiple selection Allowed
Folder selection Not allowed (files only)
Selectable extension fcs only
Initial folder Because no folder is explicitly specified, the macOS default folder opens (the previous folder is not restored as it is in save panels)
If canceled Nothing happens

Difference from the Windows version: In addition to the "FCS Files (.fcs)" filter, the Windows FCS selection dialog also provides an "All Files (.*)" filter. The Mac version supports only .fcs and does not provide an All Files option.

1.2.3 Drag-and-Drop onto the Workspace Window

The Workspace window accepts file drops over its entire area. Dropped files are classified into the following four categories based on the lowercased file-extension string.

Dropped Item What Happens
Folder Recursively scans the folder, collects only .fcs files, and imports them using the folder name as the group name. If a group with the same name already exists, the files are added to it; otherwise, a new group with that name is created. In either case, that group becomes active. If no .fcs files are found, an alert is displayed (see below).
.fcs extension Imports the files together. If the active group is not All Samples, the files are also added to that group; if the active group is All Samples, they are imported without a group assignment.
.neo / .faws / .wsp / .jo extension Opens as an independent document (1.5.7)
Anything else (PDF / PPTX / SVG / images, etc.) Opens a Layout window (or brings an existing one to the front) and places the item at paper position (40, 40)

Because classification is based solely on the file-extension string, FCS files without an extension (such as old Mac-format files) fall into the final "anything else" category.

Rules for collecting FCS files from a folder (common to Workspace and Layout windows)

  • Subfolders are scanned recursively with no depth limit.
  • Only files whose lowercased extension is "fcs" are collected.
  • To keep the import order stable, files are sorted by file name in localized ascending order before import.

"No FCS files were found in '(folder name)'"

This message appears when a folder is dropped onto the Workspace window but no .fcs files are found anywhere under that folder.

Button Result
OK Closes the alert (nothing is imported)
1.2.4 Drag-and-Drop onto the Layout Window

The Layout (figure-editing) window also accepts file drops. Classification is similar to that of the Workspace window, but folders are handled differently.

Dropped Item What Happens
Folder Recursively collects only .fcs files under the folder, combines them with any directly dropped .fcs files, and imports them. PDFs and other files inside the folder are ignored. No group is created from the folder name, and no alert is displayed even if zero .fcs files are found.
.fcs extension (including files collected from folders) Imports the file. If the active group is not All Samples, adds it to that group; if the active group is All Samples, imports it without a group assignment.
.neo / .faws / .wsp / .jo extension Opens as an independent document
Anything else Places the item at the actual drop position (paper coordinates). When multiple files are dropped, each subsequent file is offset by (18, 18).

In addition to files, the Layout window accepts drags from Graph windows, gate rows, and file rows. These payloads are processed first, and only the remaining files are placed according to the table above. The window configuration is reconsidered only when something is actually placed in the layout (if the workspace contains no FCS files, the file list is hidden and only the layout is displayed).

1.2.5 Place Files in Layout...
Item Description
Location File menu in the menu bar > "Place Files in Layout..."
Shortcut ⇧⌘O
Panel title "Select Files to Place in Layout"
Multiple selection Allowed
Folder selection Not allowed
Selectable extensions pdf / png / jpg / jpeg / gif / bmp / svg / webp / pptx
Placement position If no Layout window exists, opens one and places the file at the default position (40, 40)
1.2.6 When Import Fails

If FCS parsing fails

The following alert is displayed for each file. After you click OK, NeoFlow continues loading the remaining files. Failed files are never silently skipped.

Display Button
"Parsing failed (file name): (error details)" OK

This wording is the same for all three paths: through the FCS selection panel, drag-and-drop onto the Workspace window, and drop onto the Layout window (only the Layout-window path uses the standard OK button).

If placement in the layout fails

If a non-FCS file cannot be imported through "Place Files in Layout..." or by dropping it onto the Layout window, an alert whose title is always "Import" appears. There are four possible reason messages, shown below. The alert has a single standard OK button.

Reason Message Condition
"Could not read the file" The file contents could not be read
"Unsupported file format" The extension could not be interpreted as an image format
"Could not parse PDF" PDF parsing failed
"No importable vector elements were found in the PDF" The PDF could be read, but it contained no vector elements that could be imported
1.2.7 Displaying Import Results (Status Label)

The label at the far right of the toolbar (11 pt, light gray) is updated each time the file tree is redrawn.

Number of Loaded Samples Display
0 (including the initial state) "Drag & Drop FCS Files"
1 or more "(count) samples"

This count is the total number of files in the entire workspace. Even when the display is filtered by a group tab, the count shown is the workspace-wide total, not the number of files in the currently displayed group.


1.3 Automatic Processing During Import
1.3.1 Overall Import Flow

The following processing is common to both imports from the FCS selection panel and drag-and-drop imports.

Order Process
1 Push an undo snapshot only once. A batch import of multiple files can therefore be undone as a single operation (this history stores up to 10 levels).
2 Record the parent folder of the first file as the "last used FCS folder." This value is used for the next relink search, as the default folder in save panels, and for FCS-location information stored when the workspace is saved.
3 Load files one at a time. If a file fails, display an alert and continue to the next file.
4 Assign to groups (1.3.2)
5 If at least one file succeeds, mark the workspace as having unsaved changes and update the file list.
6 If no Workspace window exists, open one.
1.3.2 Group Assignment
Import Path Destination
FCS selection panel If the active group is not All Samples, add all imported files to that group and apply its template gates.
Drop .fcs files If the active group is not All Samples, add the files to that group, apply its template gates, and make that group active.
Drop a folder (Workspace window) If a regular group with the same name as the folder exists, add the files to it; otherwise create a new group with that name (its identification color is assigned automatically by cycling through the palette). In either case, make that group active.

Group assignment is mutually exclusive: a path that directly specifies a group takes precedence over group assignment based on the folder name. Regardless of the import path, every file is always also part of the entire workspace (All Samples).

1.3.3 What Happens When One File Is Loaded
Process Description
Read header only Reads only the HEADER and TEXT segments and does not load the actual event data (the DATA segment). Event data are populated lazily when drawing is required.
Determine date/time Uses FCS $DATE + $BTIM. If unavailable, uses the OS file modification time; if that is also unavailable, uses January 1, 1970.
Retain instrument fingerprint Retains $CYT / $CYTSN / $P1V through $PnV ($PnV scanning stops where the values become discontinuous; if the number of parameters is unknown, up to 100 are checked).
Auto Compensation Applied if the conditions are met (1.3.4)
Channel filtering Filters the imported channels according to the rules in 1.3.5
Apply template gates For manual import and drag-and-drop, automatically applies the All Samples template gates. They are not applied when restoring from a workspace file (1.3.6).
1.3.4 Auto Compensation

Checkbox

Use the "Auto Compensation" checkbox in the right-aligned area of the toolbar to turn the feature on or off. It is ON by default. Because this state is not saved in the workspace file, it always returns to ON whenever the app is launched.

Operation What Happens
OFF → ON Retries Auto Compensation for every loaded file, re-registers channels, and asynchronously repopulates the actual event data.
ON → OFF Only for files whose original spillover matrix has been backed up, restores the FCS-default matrix and similarly repopulates the event data.

In either case, the file list and application-status label are updated at the end.

Conditions for application

Auto Compensation is applied only when all of the following conditions are met.

  1. "Auto Compensation" is ON.
  2. The file contains a spillover matrix such as $SPILLOVER.
  3. A preset corresponding to the instrument fingerprint (a key constructed from the combination of $CYT, $CYTSN, and $P1V through $PnV) has been saved and can be read successfully.
  4. The saved preset and the file have channel-name lists with the same number of entries, and the names at each corresponding position match when compared in uppercase (the order must therefore also match).

When the preset is applied, if the original spillover matrix has not yet been backed up, NeoFlow backs it up first and then replaces it with the preset matrix.

Application-status label

To the right of the checkbox (10 pt font, green #1aa06d), NeoFlow displays the status for the file currently selected in the tree.

Condition Display
"Auto Compensation" is OFF / no file is selected / there is no spillover matrix / an instrument fingerprint cannot be generated (blank)
An instrument fingerprint exists, but no saved preset exists "(no saved data)"
A saved preset exists and can be read "Applied: saved (save date/time)" (example: "Applied: saved 2026/7/15 12:34:56")

The date/time is displayed using the Japanese locale and the format "y/M/d H:mm:ss."

1.3.5 Channel Filtering

The channels to import are filtered automatically. There are no user-configurable UI settings for this behavior.

Channel Import Behavior
Name contains "Imaging" (case-insensitive) Do not import
Starts with FSC / SSC (and does not contain Imaging) Import all -A / -H / -W / -T / -P channels
All others (fluorescence detectors) Import only -A. Exclude -H / -W / -T / -P only when an -A channel with the same base name actually exists (for older instruments without -A, channels such as -H are retained).
Channels explicitly marked for retention Import with priority over all rules above

"Channels explicitly marked for retention" are used to preserve channels referenced by gates or layouts imported from a FlowJo .wsp file. They are also recorded when the workspace is saved and restored the next time it is loaded. After excluded channels are removed, channel numbers are reassigned.

1.3.6 Automatic Application of Template Gates

When a new FCS file is loaded or a file is added to a group, root gates from existing files are automatically duplicated. There are two application scopes.

Scope Trigger Gates Duplicated
All Samples Immediately after a new FCS file is loaded (manual import and drag-and-drop only; not applied during workspace restoration) Among the gates in all loaded files, those that have no parent, no group assignment, and are not sample-specific
Group Any path by which a file enters a group (group specified during import, drag to a group tab, or adding checked files) Among gates in existing members of the destination group (excluding All Samples), those that have no parent, belong to that group, and are not sample-specific

In either case, gates from the same lineage (linkId) are deduplicated to one. If the new file already has a gate from the same lineage, that gate is skipped. Gates that were already present in the dragged file are never modified. Copies made in the All Samples scope have their group assignment removed, whereas copies made in group scope retain the original group assignment.


1.4 Group Features
1.4.1 Group Bar

The group bar is a single horizontal row of tabs (pills) immediately below the "FCS Files" header row in the left panel and above the file tree.

  • By default groups are ordered by creation time, with All Samples always first. Dragging a pill reorders it left or right (All Samples itself cannot be dragged and always stays leftmost). While dragging, the grabbed pill itself follows the cursor horizontally (it does not move vertically), and the other pills shift to show the insertion point. Selecting a group is committed on release, so you can grab and reorder a group that is not currently selected without selecting it.
  • A dashed-outline "+" pill appears at the far right.
  • Each pill has an 11 px corner radius, 2 px vertical and 9 px horizontal padding, and a 1 px border. The active pill has a blue background (approximately #2f6fed) with white text. Inactive pills have a white background, a #c5ccd6 border, and #1d2733 text.
  • The bar itself uses 4 pt spacing between pills, 8 pt horizontal padding, 5 pt vertical padding, and a minimum height of 34 pt.

Horizontal scrolling

Pills shrink down to the width of their longest unbreakable word. Only if they still do not fit does the bar become horizontally scrollable. For mouse-wheel input, whichever of the vertical or horizontal movement components has the larger magnitude is assigned to horizontal scrolling. When a scrollbar is actually displayed, the bar height increases by the scrollbar height so that the pills are not obscured. When switching tabs, the active pill scrolls to the center of the visible area with a 0.25-second animation (no scrolling occurs if it is already fully visible).

Difference from the Windows version: The Windows version renders the same pill row using D3D and uses a custom-drawn scrollbar. In addition, All Samples is not included in the internal group array on Windows, so group numbers differ from the Mac version by one.

1.4.2 Special Handling of the All Samples Tab

All Samples is a special group representing the entire workspace and is always listed first. It differs from regular groups as follows.

Item All Samples Regular Group
Position Always first (group 0) Listed afterward in creation order
Members All files in the workspace (does not maintain a member list) List of registered files
Display of count " (N)" Not displayed Displayed
Rename by double-click Not available Available
Delete by right-click Not available Available
Drop file rows Not accepted Accepted
Drop gate rows Accepted (promotes to All Samples) Accepted (applies to the entire group)
Identification color None (color-changing operation is disabled) Present
Tooltip "All samples (select with checkboxes → create a group to add)" "Double-click to rename / right-click to delete"

Group deletion, renaming, member addition, and member removal are never performed on All Samples. When a workspace file is loaded, if All Samples is not the first entry in the saved data, it is forcibly inserted at the beginning.

The "+" pill is created with the same handling as All Samples, so its tooltip is also "All samples (select with checkboxes → create a group to add)." It is drawn with a dashed border and does not accept drops of file rows or gate rows.

1.4.3 Count Display

For regular groups, the pill displays " (count)" immediately after the group name. The count is the number of files belonging to that group. Its text color and font (11 pt) are exactly the same as the group name: white when active and #1d2733 when inactive. All Samples does not display a count.

1.4.4 Creating a Group

Clicking the "+" pill at the far right of the group bar opens the New Group Name dialog.

Item Description
Message "New Group Name"
Input field Width 200 × height 22. The initial value is "Group (total number of groups)" (the count includes All Samples; if All Samples is the only group, the value is "Group 1").
Buttons "Create" / "Cancel"
Button Result
Create Creates a new group using the files whose checkboxes are currently on as its initial members
Cancel Does nothing

If the input field is empty when you click "Create," the group name becomes "Group." Leading and trailing spaces are not trimmed at this stage, so if the field contains only spaces, those spaces are used as the group name.

The following occurs when the group is created.

  • Pushes an undo snapshot (therefore marking the workspace as having unsaved changes).
  • Appends the group to the end of the array and immediately makes the newly created group active.
  • Automatically assigns an identification color by cycling through the palette using "number of existing regular groups modulo 8" (1.4.9).
  • Redraws not only the file tree but also every open Graph window using the scope of the new tab.

The same procedure is used automatically when a folder is dropped onto the Workspace window and no group with the same name exists (1.2.3).

Difference from the Windows version: The Windows dialog labels the input field "Group name:" (the Mac version has no label). The initial numeric value is the same as on the Mac version.

1.4.5 Renaming a Group

Double-clicking the pill for a regular group overlays an input field on the pill, with the current name fully selected for editing (11 pt; minimum width 60, maximum based on pill width minus 8).

Operation Result
Enter Commit
Move focus away Commit
Escape Cancel (the name is not changed)

When committing, the name is changed only if the result after trimming leading and trailing spaces is nonempty and different from the original name. Renaming is undoable (⌘Z).

On a double-click, the first click switches to the tab and the second click starts name editing. The tab switch itself is not undoable.

Difference from the Windows version: In Windows, a rename is committed only by pressing Enter; losing focus does not commit the change.

1.4.6 Deleting a Group

Right-clicking the pill for a regular group immediately opens a confirmation dialog (no menu is displayed).

Item Description
Message "Delete group '(name)'?"
Additional text "(The samples themselves will remain)"
Button Result
Delete Deletes the group. If the active-group index becomes invalid, the active group returns to All Samples. The workspace is marked as having unsaved changes, and the file tree and all Graph windows are redrawn. The samples themselves are not removed from the workspace.
Cancel Does nothing

Right-clicks are ignored while a group name is being edited inline.

Difference from the Windows version: The Windows version displays the same wording in a message box, with the text combined into a single body using line breaks.

1.4.7 Switching Group Tabs

Single-click a pill (including All Samples) to make that group active. Switching tabs causes the following actions.

  • The file tree and group bar are redrawn, and the tree displays only the files in that group (1.4.11).
  • All open Graph windows are redrawn, and their gate display immediately follows the scope of the new tab.
  • The active pill scrolls to the center of the visible area.

Switching tabs is not undoable (⌘Z) and does not mark the workspace as having unsaved changes.

As a side effect of switching tabs while a Graph window remains open, if the selected gate falls outside the scope of the new tab, its selection handles and selection outline disappear. The selection itself is retained, so returning to the original tab automatically restores the handles.

The sample-navigation buttons "◀" and "▶" in a Graph window also cycle through only the files in the active group, not the entire workspace. Populations are matched by name, and the buttons do nothing when there is one or fewer eligible files. Switching tabs changes this navigation range as well.

1.4.8 Adding and Removing Group Members

Add (drag a file row to a group pill)

Drag a sample row from the file tree and drop it onto the pill for a regular group.

Situation Files Affected
The dragged row is checked All checked files
The dragged row is not checked All file rows included in the drag (if multiple rows are selected in the tree, all of them)
  • Files already in the group and files that do not exist are automatically excluded.
  • The group's template gates are automatically applied when files are added (1.3.6).
  • Adding files is undoable (⌘Z).
  • A file can belong to multiple groups at the same time.
  • If the drag contains even one file row, any gate rows included in the same drag are completely ignored (file dragging and gate dragging are handled separately).
  • File rows can be dropped only on group pills. Dropping a file row onto another row within the tree is not accepted.

During a drag, an eligible destination pill changes to a #d7ffe7 background with a #1aa06d border and displays an outer 2 px ring (30% opacity #1aa06d, corner radius 12). The pill returns to its normal appearance when the drag leaves it or the drop completes. The drop operation type is copy.

The tooltip for a file row reads "Drag to a group tab above to add to the group (multiple selection: select with checkboxes, then drag)." The file-name portion has a separate tooltip showing the full name without the extension, because the center of the displayed name may be truncated to fit the column width.

Remove/Delete (button in the header row)

The button on the right side of the "FCS Files" header row at the top of the left panel (to the left of "↩ Undo") changes its label according to the active group.

Active Group Button Label Tooltip
Regular group "Remove from Group" "Remove from group (samples remain in All Samples)"
All Samples "Delete Selected" "Permanently delete selected samples"

When no files are checked, the button is disabled and cannot be clicked.

Button Confirmation Dialog Choices and Results
"Remove from Group" "Remove (count) samples from group '(group name)'?" "Remove" = remove the files from that group's membership (they remain in the overall workspace and other groups; their checkboxes are cleared after removal) / "Cancel" = do nothing
"Delete Selected" "Delete the selected samples?" + additional text: "Permanently delete (count) samples. (Their gates will also be deleted.)" "Delete" = permanently remove the files from the entire workspace / "Cancel" = do nothing

Removal is undoable (⌘Z) and marks the workspace as having unsaved changes. Selecting multiple rows in the tree and pressing Delete uses the same deletion confirmation.

Select All Samples checkbox

The unlabeled checkbox at the far left of the file-tree column-header row (tooltip: "Select All Samples") checks all files in the entire workspace when turned on and clears all checks when turned off. Because it applies to the whole workspace rather than only the displayed group, turning it on while the view is filtered by a group tab also checks files that are not currently visible. The checkbox itself appears on only when there is at least one file and the number of checked files equals the total number of files.

1.4.9 Group Identification Colors

Color dot in file rows

Each sample row in the file tree displays a 14 pt-diameter circle immediately to the right of the checkbox.

Displayed Tab How the Dot Is Drawn
Regular group Filled with the single color assigned to that group
All Samples Drawn as equal pie-slice segments using the colors of all regular groups to which the file belongs (0° = right, counterclockwise; for the i-th of n groups, the segment spans i/n × 360° through (i+1)/n × 360°)
(File belongs to no group) Single neutral gray color "#808080"

The cursor changes to a pointing hand when placed over the dot.

Changing the color

Right-clicking the color dot opens the standard macOS color panel. The target group is determined as follows.

Situation Target Group
A regular group is being displayed That group
All Samples is displayed and the file belongs to one group That group
All Samples is displayed and the file belongs to multiple groups The group corresponding to the angle of the clicked position (using the same pie-slice division as the dot: 0° = right, counterclockwise)
The file belongs to zero groups Nothing happens

Immediately before the color panel opens, one undo snapshot is pushed (pushing snapshots repeatedly while dragging would fill the 10-level history with identical states). Each time the color is changed in the panel, the group color is updated, the workspace is marked as having unsaved changes, and the file tree and all Graph windows are redrawn. Only the color dot in file rows changes; group colors are not used for any other drawing. Color settings are disabled for All Samples.

Because the macOS color panel has no cancel path, changes are committed immediately. Use ⌘Z to restore the previous color.

Difference from the Windows version: Windows uses a custom color picker (without gradients) instead of the standard color panel. In addition to live preview and Apply, Cancel restores the original color.

Automatic-assignment palette

New groups are assigned colors cyclically from a fixed 8-color palette using "number of existing regular groups modulo 8."

# Color
1 #2e8ce6
2 #1aa16e
3 #e67d21
4 #8f59d4
5 #d93d59
6 #21a1b2
7 #c9990d
8 #6670e6

If a saved color exists, it is used. Otherwise, the same palette is derived from the order in which regular groups appear (a compatibility behavior used only immediately after loading an older workspace that did not save colors). An out-of-range value falls back to "#808080."

Difference from the Windows version: The Windows version uses exactly the same 8-color palette.

1.4.10 Sorting the File Tree

Click a column header to sort the tree.

Column Tooltip Comparison Key
"Name" (initial width 177, minimum width 100) "Sort by name" Localized comparison of file names
"Date" (width calculated from the header text, minimum 32) "Sort by date" File date/time (falls back in order: $DATE+$BTIM → OS modification time → January 1, 1970)
  • The default order is Date ascending.
  • Clicking the same column again toggles ascending/descending order. Switching to a different column resets the order to ascending.
  • Files with equal comparison results retain their original import order (stable sort).
  • Only the selected column displays an arrow in its header, for example "Name ▲" (ascending) or "Name ▼" (descending). Unselected columns have no arrow.

This sort order is also used to arrange tiles during layout batch generation.

The column titles "Name" and "Date" remain in English and are not localized into Japanese.

1.4.11 Group Filtering and Where Group Scope Applies

The active group affects multiple screens, not just the file list.

Location How Group Scope Applies
File tree Builds rows only from files in the active group (all files for All Samples; for a regular group, files resolved in group-registration order). Row order follows the current sort settings.
Count in the status row Displays the count for the entire workspace (not filtered by group)
Recalculation of gate event counts Restricted to the active group's scope
Statistics table Rows are built from files in the active group, with the first file used as the reference file. If there are no samples, "No Samples" is displayed. Columns (populations) are built by traversing the reference file's gates in depth-first gate order; group-scope filtering is not applied to these columns.
Graph-window "◀" / "▶" Navigation is restricted to files in the active group (1.4.7)
Layout batch generation Select the target group from the pull-down to the right of "Batch:" (1.4.13)
1.4.12 Group and Gate Scope

Each gate records which group it belongs to, and its display, creation, and deletion are controlled by group scope.

Display filtering

Displayed Tab Visible Gates
All Samples Only gates with no group assignment
Regular group Gates with no group assignment (i.e., gates that apply to all groups) plus gates belonging to the displayed group. Gates specific to other groups are hidden.

This rule applies equally to gate rows in the file tree and to the outlines, labels, and hit testing of child gates drawn in floating Graph windows. Consequently, when you switch tabs, the gate display in Graph windows that remain open automatically updates to the new group's scope. Plot tiles in the Layout (figure) are intentionally excluded and always show all gates.

Stamping and propagating new gates

When a new gate (rectangle, range, ellipse, polygon, freehand, etc.) is created in a Graph window, the active group is stamped onto that gate. Under All Samples it receives "no group assignment"; under a regular group it receives that group. Immediately after creation, it is duplicated as the same gate lineage to other samples in scope (all files for All Samples, or the group's members for a regular group), creating a synchronized family thereafter. Quadrant gates and bisector gates are file-specific; no group is stamped onto them and they are not propagated.

Dragging a gate row onto a group pill

Drop Destination What Happens
Regular-group pill Creates an independent copy of the dragged gate and all its descendants on the source file as a new lineage, assigned to that group and marked non-Unique, then duplicates that copy to all other members of the group. Any ancestor gates needed for display are duplicated or reused only if they are visible in the target scope. The original gate and existing copies in other files are never modified (even a gate with the same name is not replaced; a new gate is added). When complete, the status row displays: "Applied gate '(gate name)' to all samples in '(group name)'."
All Samples pill "Promotes" the gate to All Samples. NeoFlow creates a new independent gate on the source file (no group assignment, non-Unique, including descendants), deletes the pre-promotion subtree from the source file, propagates the new gate to all other files while matching parents by population name, and finally deletes the pre-promotion lineage from all files, including synchronized copies held by other members of the original group. Thus this is effectively a move, not a copy. When complete, the status row displays: "Promoted gate '(gate name)' to 'All Samples' (group-specific gates were deleted)."

If the drag contains even one file row, this gate application is not triggered (adding files takes priority).

Editing an All Samples gate while viewing a group tab (automatic fork)

While viewing a regular-group tab, if you drag a gate with no group assignment (an All Samples gate) in a Graph window to change its shape and then commit the change, the following processing occurs immediately.

  1. Creates a new independent gate using the post-drag shape (new lineage, assigned to that group, non-Unique, including descendants).
  2. Restores the original All Samples gate to the shape it had when the drag began and leaves it unchanged thereafter.
  3. Names the new gate "original-name-1." Each subsequent fork from the same base name is numbered -2, -3, and so on (all members of the same group are scanned and the next number is one greater than the highest existing suffix).
  4. Changes the new gate to a random color.
  5. Duplicates the same new gate to every other member of the group.

The status row displays: "Edited '(original name)' and registered it for all samples as new gate '(new name)' in group '(group name)' (the original All Samples gate was not changed)," and selection moves to the new gate. If the conditions for forking are not met, the change is synchronized to gates of the same lineage as usual.

Gate-deletion scope

When you right-click a gate row in the tree and choose "Delete Gate," or select a gate row and press Delete, the confirmation wording changes according to the situation. The buttons are always "Delete" / "Cancel."

Situation Confirmation Message Effect of "Delete"
Gate unique to this sample "Delete gate '(name)' from this sample?" Deletes it from that file only
Non-Unique gate / All Samples tab "Delete gate '(name)' from all samples?" Deletes the non-Unique gate of the same lineage, including descendants, from all files in scope
Non-Unique gate / regular-group tab "Delete gate '(name)' from all samples in group '(group name)'?" Same as above (scope is that group)
1.4.13 Selecting a Group for Batch Generation

Use the pull-down to the right of the "Batch:" label on the first toolbar row of the Layout window (tooltip: "Batch Target Group") to select the group used for batch generation.

Item Description
Choices "All Samples," followed by the current group names in creation order
Default First item = "All Samples"
Synchronization The list is synchronized with the group list whenever the selection UI is updated (the current selection is retained by matching the name)

Clicking the "Batch" button creates a new layout containing a grid of the selected group's files (all files for All Samples, or members of a regular group), arranged in the sort order described in 1.4.10. If the group contains no files, the message "Batch Generation / Place template plots before running Batch." is displayed.

The adjacent controls on the same row are an arrangement-direction pull-down (choices: "Horizontal" and "Vertical") and a columns/rows pull-down (1–20, default 6).

1.4.14 Undo/Redo for Group Operations
Operation Location / Key
Undo "↩ Undo" button at the far right of the header at the top of the left panel, or the menu / ⌘Z
Redo ⇧⌘Z

The button tooltip is "Undo gate creation, copying, or changes (Cmd/Ctrl+Z)."

Creating, renaming, or deleting groups; adding or removing members; and changing group colors are stored in the file-related snapshot stack (which records loaded files, sort order, groups, the active group, and axis-scale settings together, up to 10 levels). This stack is separate from the gate-operation snapshot stack (up to 30 levels), but the chronological order of operations is recorded, so ⌘Z always undoes exactly one operation from the correct stack according to the most recent operation type. After undo or redo, the file list, group bar, and all Graph windows are updated.

The destination of ⌘Z is determined by the frontmost window, in the order Compensation editor → Layout → Workspace.

Only tab switching is not undoable.


1.5 Creating, Saving, and Loading Workspaces
1.5.1 New Workspace / New Layout
Menu Item Shortcut Action
"New Workspace" ⌘N Creates a new workspace, shows it in Workspace view in a single window, and brings it to the front. The title is automatically numbered "Workspace 1," "Workspace 2," and so on.
"New Layout" ⇧⌘N Opens a new workspace containing no FCS files as a Layout window (one empty layout). In this case, the left file list opens hidden.
1.5.2 Open...
Item Description
Location File menu in the menu bar > "Open..."
Shortcut ⌘O
Panel title "Select Workspace / FlowJo .wsp"
Multiple selection Not allowed
Create new folder Not allowed
Selectable extensions neo / faws / wsp / jo
Initial folder Restores the folder that was last opened in this panel

After selection, the file opens as an independent document (see 1.5.7 for how the destination window is chosen).

Difference from the Windows version: In addition to "NeoFlow / FlowJo Workspace (*.neo;*.faws;*.wsp;*.jo)," the Windows filter includes "All Files (*.*)" so that old Mac files without extensions can be opened. The Mac "Open..." panel filters by extension and therefore has no All Files option.

1.5.3 Toolbar "📂 Open"

The toolbar "📂 Open" command supports the same selectable extensions as the menu "Open..." command (neo / faws / wsp / jo, single selection), but loads the file into the currently open workspace without creating a new window. The previous folder is not restored. Before loading, the file is added to Recent Files and its folder is recorded. Depending on the detected file type, FlowJo formats are converted in the background before being loaded.

1.5.4 Recent Files

This is File > "Recent Files" in the menu bar, a submenu immediately below "Open...."

Item Description
Order Newest first
Maximum 15 items
Display for each item File name without extension; tooltip shows the full path
When there are 0 items Only one disabled item, "No Recent Files"
When there is 1 or more item A separator and "Clear Menu" are appended at the end

A file is registered both when a workspace is opened and when it is saved successfully. The same path is not duplicated; it is moved to the top of the list.

Selecting "Clear Menu" deletes the stored history, after which the menu displays "No Recent Files."

"File Not Found"

This message appears when an item in Recent Files is selected but no file exists at the recorded path.

Item Description
Message "File Not Found"
Additional text "'(file name)' may have been deleted or moved."

After the alert is closed, that path is removed from the Recent Files list and the menu is rebuilt. If the file exists, it opens normally.

1.5.5 Save / Save As
Item "Save" "Save As..."
Location File menu in the menu bar and toolbar "💾 Save" File menu in the menu bar
Shortcut ⌘S ⇧⌘S
When a save destination is already defined Silently overwrites the same file without showing a panel (an alert appears only if saving fails) Always displays the save panel, regardless of whether a save destination already exists
When the save destination is undefined (new unsaved workspace) Displays the save panel Same as left
Extension used by the save panel neo neo
If the panel is canceled Does not save (the caller is informed that no save occurred) Does not save

Default file name in the save panel

Priority Condition Default Name
1 A source file has already been saved or loaded That name without the extension (if empty, "flow_layout")
2 No source file exists The name of the folder containing the first imported FCS file (if nonempty)
3 Neither exists "flow_layout"

The initial value is the selected name with ".neo" appended.

Default folder in save panels (also common to the various export panels)

Priority Candidate
1 Last used FCS folder (a folder from which an FCS file was opened or one selected during relinking). It must exist as a directory.
2 Parent folder of the most recently opened or saved workspace file. It must exist.
3 User's Documents folder

Each candidate is checked for existence; if it does not exist, the next candidate is used.

"Could Not Save Workspace"

This is the warning (critical) alert displayed when writing fails. It is common to every save path, including "Save," "Save As...," and "Save and Close."

Item Description
Message "Could Not Save Workspace"
Additional text "Could not write to '(file name)'. Check available disk space and write permissions at the destination. Your changes have not been lost."
Button OK

If saving fails, the caller does not close the window and does not quit the app.

1.5.6 Saved Contents and .neo / .faws

The saved file is a version 7 JSON file. It is written atomically, so a partially written, corrupted file is not left behind. The previously loaded content is used as the base, so fields not managed by this version of NeoFlow are carried forward rather than lost.

The main saved contents are as follows.

Category Contents
Layouts All layouts and the current layout. Each plot item and overlay-histogram series stores the name of the referenced FCS file.
Per-file information Gates, gate order, spillover matrix, channels hidden in Compensation, and channels explicitly marked for retention (keyed by file name)
File list List of file names in display order and the mapping from file name to folder
FCS folder Last used FCS folder (empty if none)
Groups All Samples stores only its name and a flag indicating that it represents the whole workspace. Regular groups store the name, the list of member file names, and the identification color.
Axis settings Axis scale type, biex parameters, log parameters, and Compensation-screen axis scaling
Layout defaults Default text styles (bold, italic, superscript/subscript)

Group members are saved by file name, not by internal ID, so they are remapped by file name when loaded. Identification colors are normally always saved, but for an older file whose colors were never finalized and that has never been resaved, the color field itself may be absent.

Only after a successful save are the save destination recorded, the "unsaved changes" state cleared, the workspace name changed to the saved file name without its extension, the window title updated, and the file registered in Recent Files. None of these updates occurs if export or writing fails.

Difference between .neo and .faws

Item Description
Format Completely identical (version 7 JSON). The only difference is the file extension.
Saving Always saves as .neo (the new default extension). There is no UI method for saving as .faws.
Loading Supports both .neo and .faws (backward compatibility)
Document type .neo is declared as "NeoFlow Workspace" and .faws as "NeoFlow Workspace (Legacy Format)." Both are handled by a single document type that is editable and owned by this application.

The actual file-type determination is based on the contents at the beginning of the file, not the extension (1.6.1).

1.5.7 Choosing the Window When Opening a Workspace

When a file is opened through the menu "Open...," a Finder double-click, a drop onto the Dock, or drag-and-drop onto a window, the destination is chosen in the following order.

  1. If a reusable "completely empty workspace" exists (no files loaded, no unsaved changes, and all layouts empty), use it. Search order is first the frontmost window, then the first registered workspace that meets the conditions.
  2. If none exists, create a new workspace.
  3. Set the workspace name to the opened file name without its extension, then load the file.

After loading finishes, the window configuration is adjusted according to the loaded contents.

Loaded Contents Window
Contains no FCS files Hide the file list and show only the Layout window (the existing Workspace window is closed. No save confirmation is shown during this automatic switch).
Contains FCS files Ensure that a Workspace window is available and show the file list again

Finally, the destination window is brought to the front.

1.5.8 Opening a Workspace from Finder

When you open files by double-clicking them in Finder, dropping them onto the Dock icon, or choosing "Open With," all supplied paths are opened in sequence. In this case, the empty new window that would normally be created automatically at startup is suppressed.

The document types associated with the app are as follows.

Extension Role
.neo / .faws Editable; owned by this app (the document icon is generated automatically from the app icon)
.wsp FlowJo Workspace; viewer/alternate role

.jo is not declared as a document type. Therefore, .jo files can be opened from a panel or by drag-and-drop, but .jo cannot be associated with NeoFlow for Finder double-click or "Open With".

1.5.9 Contents Restored When Loading a Workspace

After the FCS file locations have been resolved (1.7), the following contents are restored.

Category Restored Contents
Files Clear the currently loaded files and reload each FCS file. Template gates are not applied automatically during this process. Channels explicitly marked for retention by a FlowJo import are passed in before the files are loaded.
Gates Overwrite with the saved gates and gate order, normalize legacy geometry information for all gates, resynchronize the gate-ID numbering counter, and repair lineage-ID collisions.
Compensation If a saved spillover matrix exists, restore it in preference to the FCS file's own $SPILLOVER matrix.
Layouts Restore the layouts (falling back to the legacy format if the saved data contains no layouts). References are remapped from file names to new IDs, selection is unconditionally reset, the layout undo history is discarded, and numbering counters are resynchronized.
Groups Remap file names to new IDs, forcibly insert All Samples at the beginning if it is not already first, and always reset the active group to All Samples (the first group).
Other Default text styles (left unchanged if absent from the saved data), axis scale types, biex/log parameters, and the axis scaling used in the Compensation screen.
FCS Folder Apply the saved value only if a different folder was not selected in the relink dialog during this load.

After loading, the workspace is in the "no unsaved changes" state because it has just been loaded. The workspace name and window title are also updated to the opened file name without its extension.


1.6 Importing FlowJo (.wsp / .jo)
1.6.1 Import Methods and File-Type Detection

A FlowJo workspace can be imported through File > "Open...", the toolbar "📂 Open" button, or by dropping or double-clicking it in Finder (.wsp only; 1.5.8).

The type is determined by the contents at the beginning of the file, not by its extension.

Detected Type Condition
FlowJo .jo The first 6 bytes are "FlowJo"
FlowJo .wsp After skipping up to 8 bytes of leading whitespace or BOM data, the next byte is '<'
NeoFlow Workspace Anything other than the above

Files other than NeoFlow workspaces are converted to NeoFlow format in the background, and normal loading begins after conversion is complete. The main interface remains responsive during conversion.

1.6.2 Contents Imported from .wsp
Category Imported Contents
Groups Created from the FlowJo groups. All Samples is fixed at the beginning; groups named "All Samples" or "Compensation" are excluded. Groups for which no sample reference can be resolved are also excluded.
Gates Each sample's population tree is converted into gates (samples are parsed in parallel, and lineage colors are assigned in encounter order). Gates whose type or shape differs between samples despite belonging to the same lineage are marked as "sample-specific."
Compensation Matrix If a spillover matrix is present, the matrix with -H and -P channels removed is assigned as the compensation matrix for all files.
Display Scale Imported for all channels regardless of -H / -W / -A. For linear, the upper bound is the maximum range. For log, the minimum is offset and the maximum is offset×10^decades (default offset 1.0, default decades 6.0). For biex, pos / width / neg / length (default 256) and max are imported (max defaults to 262144 when the attribute is absent, and to 1048576 when it is 0 or non-numeric).
Layout Window positions and similar values are multiplied by 96/72 to convert pt to px during import. If no layout exists, one blank 794×1123 layout named "Layout 1" is created.
FCS Locations The first folder in the detected set of folders is used as the default FCS folder, and the file-name-to-folder mapping is also recorded.

The conversion result records that it was converted from a FlowJo .wsp file.

1.6.3 "Workspace Conversion Error"

This is displayed when conversion of a .wsp or .jo file fails. The behavior is the same whether the file was opened through the menu/Finder or with the toolbar "📂 Open" button.

Item Description
Message "Workspace Conversion Error"
Additional Text The reason for the failure. If XML parsing fails, it reads "Failed to parse WSP XML"; if JSON conversion fails, it reads "Failed to convert to JSON."

If .jo conversion fails, the reason is not displayed in Japanese. The Japanese explanatory messages prepared for .jo ("This is not a FlowJo .jo file...", "The file ended unexpectedly: ...", "Unsupported structure: ...") are not shown. Instead, the fixed English message "The operation couldn't be completed. (FlowCore.JoImportError error N.)" appears.


1.7 Relinking When FCS Files Cannot Be Found
1.7.1 Automatic FCS Search (Three Stages)

When loading a workspace (.neo / .faws / converted .wsp / .jo), the required FCS files are searched for in the following order. Missing files are resolved incrementally as the process proceeds.

Stage Search Location
0 The folder recorded for each individual file
1 The saved "FCS Folder" (single folder)
2 The same folder as the workspace file itself

Files in a folder are matched by file name, but for files whose extension is not "fcs," the file is accepted if the first 6 bytes match an FCS magic value (FCS1.0 / FCS2.0 / FCS3.0 / FCS3.1). This supports extensionless FCS files from older Mac systems.

If all files are found, loading continues immediately. If any are missing, the relink dialog appears.

1.7.2 Relink Dialog

This appears as a warning alert. The wording varies according to how many files are missing.

Situation Message Additional Text
None found "FCS Files Not Found" "The required (required count) FCS files could not be found." + line break + "Example: (first 5 missing names, comma-separated)"
Some found "Some FCS Files Not Found" "(missing count) of (required count) files could not be found." + line break + "Files not found: (first 5; append ' …' if there are more than 5)"

There are three buttons.

Button Result
"Choose Folder" Opens a folder-selection panel (title: "Select Folder Containing FCS Files"; message: "Select a folder containing the (missing count) missing FCS files"; directories only, single selection). After a folder is selected, the "last used FCS folder" is updated and any newly found files are added. If files are still missing, this dialog appears again. Canceling this folder-selection panel cancels the entire workspace load.
"Skip Missing Files" Continue loading with only the files that were found
"Cancel" Cancel the entire workspace load and apply nothing

NeoFlow is brought to the front before the dialog is displayed.

1.7.3 "Workspace Load" (List of Files Not Found)

This warning alert is displayed when some FCS files could not actually be loaded, for example after choosing "Skip Missing Files."

Item Description
Message "Workspace Load"
Additional Text After "FCS files not found ((count)):" it lists all missing file names, one per line.

1.8 Closing or Quitting with Unsaved Changes
1.8.1 Closing a Window

When you attempt to close a Workspace window or Layout window with the red × button, it closes immediately without confirmation only if there are no unsaved changes and no files are loaded. Otherwise, a three-choice confirmation dialog appears.

Item Description
Message "Close Window?"
Additional Text (one or more samples) "(count) samples are loaded." + line break + "There are unsaved changes." + line break + "You can save the workspace before closing."
Additional Text (0 samples) "There are unsaved changes." + line break + "You can save the workspace before closing."
Button Result
"Save and Close" Save the workspace and close the window only if the save succeeds. If saving fails or the save panel is canceled, the window remains open.
"Close Without Saving" Close without saving
"Cancel" Do not close
1.8.2 Quitting the App

When "Quit NeoFlow" (⌘Q) is chosen from the app menu, only open workspaces with unsaved changes require confirmation. If there are none, the app quits immediately. If there are any, they are confirmed one at a time in sequence.

Item Description
Message "Quit App?"
Additional Text (one or more samples) "(count) samples are loaded." + line break + "There are unsaved changes." + line break + "You can save the workspace before quitting."
Additional Text (0 samples) "There are unsaved changes." + line break + "You can save the workspace before quitting."
Button Result
"Save and Quit" Save the workspace and, if successful, proceed to the next workspace confirmation. If saving fails (including cancellation of the save panel), the quit operation itself is canceled.
"Quit Without Saving" Do not save this workspace; proceed to the next confirmation
"Cancel" Cancel quitting

If a workspace's unsaved changes are resolved during the confirmation sequence—for example, by saving it from another window—its confirmation is skipped.


Chapter 2 Workspace (2): Graph Windows and Gates

This chapter describes Graph windows, which display sample plots in the Workspace screen, and the gates created and edited within them. A Graph window is opened from the tree in the left panel; axis settings, graph-type switching, and gate drawing are all performed inside this window. Created gates appear hierarchically in the left-panel tree and can be propagated to other samples or groups.


2.1 Opening and Closing Graph Windows
2.1.1 Opening by Double-Clicking a Sample Row

Double-click a sample (file) row in the left-panel tree to open a floating Graph window in the desktop area on the right. The population initially displayed is ungated (all cells in that file).

  • A single click only selects the row; it does not open a window.
  • Before the Graph window opens, NeoFlow automatically switches to the desktop view. Even if the Statistics or Layout screen is currently displayed, double-clicking returns to the desktop before opening the window.
2.1.2 Opening by Double-Clicking a Gate Row

Double-click a gate row in the tree to open a Graph window whose population is that gate. The gate-row right-click menu has no equivalent "Open in Graph Window" command; this action is available only by double-clicking.

The gate-name field shows a tooltip reading "Click to display plot," but the actual behavior is "double-click to display; single-click only selects" (since the specification change on 2026-07-30, the tooltip text no longer matches the actual behavior).

2.1.3 Duplicate Windows for the Same Plot Are Not Opened

If a Graph window for the same file and same population is already open, no new window is created; the existing window is simply brought to the front.

2.1.4 Initial Window Size and Cascaded Placement
Item Value
Overall Window Size 430 × 430 px (fixed)
Title-Bar Height 26 px
Content Area (toolbar + plot) 404 px
Placement For n currently open windows, cascade at 60 + (n mod 6) × 38 px from the left edge and 50 + (n mod 6) × 34 px from the top edge.

Because n is the number of windows open at that moment, closing a window moves the placement of the next newly opened window back accordingly; this is not an ever-increasing counter.

2.1.5 Guidance When No Graph Windows Are Open

When no Graph windows are open, two lines of guidance are displayed in the center of the desktop.

Line Text Formatting
Line 1 "Double-click a sample to open a graph" 14 pt
Line 2 "(Double-click a gate to further expand that population)" 12 pt

The text color is #95a0ae, centered, with a maximum of two lines.

The display conditions are as follows.

  • If even one Graph window is open, the guidance is always hidden.
  • When the last window is closed so that no windows remain, the guidance is shown if one or more samples are loaded.
  • Conversely, when the tree is rebuilt while no windows are open (not only after loading or deleting files, but whenever the tree is reconstructed), the guidance is hidden if one or more samples exist. It is shown only when there are zero samples.

In other words, it is correct that "closing the last window makes the guidance reappear," but if the tree is rebuilt while still in that state, the guidance disappears.

2.1.6 Closing a Window
  • Click "✕" at the right end of the title bar to close that window.
  • File > "Close Plot" (⌘W) closes only the frontmost Graph window. It does not close the Workspace window itself.

Also, when a gate (population) is deleted, any Graph window displaying that population closes automatically.


2.2 Graph Window Layout
2.2.1 Panel Appearance

A Graph window is a floating panel placed within the desktop area.

Element Specification
Background White
Border 1 px in the accent color (#2f6fed)
Corner Radius 8
Shadow Black 22%; blur radius 8; offset (0, −4)
2.2.2 Title Bar

A 26 px-high dark-blue bar (sRGB 0.16, 0.32, 0.60).

  • The displayed text is "file name without extension · population name" (single spaces around a middle dot). The population name is the gate name; for the root (ungated), it is always displayed as ungated.
  • The format is white Bold 11 pt; long text is displayed with middle truncation.
  • The title text is positioned 8 px from the left and 5 px from the top, with a width of "Window width − 110," and follows changes in window width.
  • Each button on the right is 20 × 20 px, positioned 3 px from the top, and remains anchored to the right edge when the window width changes.

Four buttons are arranged on the right side of the title bar.

Button Position Action
Fourth from right Open the parent population plot (tooltip: "Open parent population plot")
Third from right Switch to the previous sample
Second from right Switch to the next sample
Far right Close this window

▲ (Open parent population plot) Opens a new Graph window whose population is the parent of the gate for the current population. Nothing happens if the current population is the root (ungated) or if the relevant gate cannot be found. When the window opens, its axes are taken from a child gate of the parent population if one exists; otherwise from the "last displayed axes"; otherwise from the gate's own definition axes. This is the only operation that moves upward through the gate hierarchy and is the reverse of the drill-down operation in 2.8.6, which moves downward.

◀ / ▶ (Previous/Next Sample) Cycles through the file list in the current group and switches to the previous/next file, wrapping from either end to the other. Nothing happens if there is only one file.

  • The population is matched to the destination file by population name.
  • The selected X/Y channel positions are retained.
  • The title is updated when the sample changes.
  • If the destination file does not contain a population with the same name, that sample is displayed as ungated (and the title becomes "... · ungated").
2.2.3 Moving Windows and Z-Order

A Graph window is not an OS-level window but a component within the desktop area, so multiple windows can overlap freely. Clicking anywhere in a window (the title bar, the toolbar, the axis controls, the plot area, the resize handle, and so on) always brings that window to the front. Only pressing the title bar (within the top 26 px) also lets you drag to move it.

2.2.4 Bottom-Right Resize Handle

The bottom-right corner of the window has a 16 × 16 px handle consisting of three diagonal stripes (#9aa6b6, line width 1.6).

  • Drag it to resize freely.
  • The minimum size is clamped to 300 × 300.
  • The left and top edges remain fixed, and the window expands toward the bottom right.
  • During dragging, the plot and axis controls are reconstructed every frame using the new dimensions.
2.2.5 Two-Row Toolbar

A two-row toolbar sits directly below the title bar.

Row Contents Placement
Upper Graph type / Resolution / H / Size Centered across the full window width
Lower Gate-drawing tools (8) Centered

The gap between rows is 3, and the outer margins are top 4 / left 6 / bottom 4 / right 6. Only the "⤴" button is separated from the centered button group and placed independently at the right edge of the window (right margin 6), at the same height as the upper row.

2.2.6 Plot-Area Layout

The entire remaining area below the toolbar becomes the plot box.

  • The plot-box dimensions are calculated by subtracting the toolbar's measured height + 2 from the window dimensions.
  • After subtracting margins of left 60 / right 10 / top 8 / bottom 52, the plot itself is centered as a square whose side equals the smaller of the available width and height (minimum 10).
  • It is recalculated whenever the window is resized.
2.2.7 Rendering Occurs in Two Stages

Plot rendering is divided into two stages. First, a "frame" consisting of the border, tick marks, gate outlines, and axis text is generated in the background and displayed. Then the "cloud" containing density, point-cloud, or histogram data is generated and drawn over it. As a result, for large files the border and tick marks appear first, followed shortly by the plot contents. The Graph window background is opaque.

2.2.8 Graph Window Right-Click Menu

Right-clicking the plot area of a Graph window (not the toolbar or a dropdown) shows a context menu with a single checkable item, "Show cell count." When enabled, the current population's name and event count (e.g. "ungated: 1234") are shown in the plot's top-right corner. It is off by default. This is an app-wide setting: toggling it updates every open Graph window immediately, and the choice is remembered across restarts. Gate context menus (rename / change color / delete gate) remain available only on gate rows in the left-panel tree, as before (see 2.12).


2.3 Controls in the Upper Toolbar Row
2.3.1 Graph Type (Pull-Down)

This pull-down is at the far left of the upper toolbar row. Selecting an item changes which gate-drawing tools are displayed (2.7.2) and redraws the plot. Its width is not fixed; it is wide enough to show the longest item, "Pseudocolor," without truncation.

Choice Description
Pseudocolor Default
Dot plot
Contour
Density
Histogram One-dimensional histogram. Only the range and bisector gate tools are available.
2.3.2 Resolution (Pull-Down)

Located immediately to the right of Graph Type (width 62 pt). Specifies the binning resolution (number of grid cells per axis). The tooltip is "Resolution."

Choice Default
64ch
128ch ● Default
256ch
512ch
1024ch

For Density and Contour, density textures or contour lines are generated on a grid containing resolution² (resolution × resolution) cells. Point-rendering size is also determined by "plot width ÷ resolution."

2.3.3 H (High-Resolution Toggle)

Located immediately to the right of Resolution (28 × 23). Each press toggles it on or off; when on, it is filled with the accent color. The default is off. The tooltip is "Add to Layout at high resolution (300 dpi)."

State Resolution of Plot Added to Layout
Off (default) 96 dpi
On 300 dpi

This setting affects both clicking and dragging the "⤴" button.

Difference in the Windows version: The same H toggle is used, but when pressed it is rendered as a flat rectangle filled with the accent color.

2.3.4 Size (Pull-Down)

Located at the far right of the upper toolbar row (width 46 pt). This is the plot-size preset used when adding a plot to a layout with "⤴". The tooltip is "Plot size when adding to layout."

Choice Dimensions (design px)
Large 230 × 240 (default)
Medium 180 × 190
Small 140 × 150

This value has no effect on the Graph window display itself and is referenced only when adding the plot to a layout.

Difference in the Windows version: Instead of a pull-down, Windows uses a cycling button that advances Large → Medium → Small → Large with each click. The preset dimensions themselves are identical.

2.3.5 ⤴ (Add This Plot to Layout / Drag to Drop)

A 30 × 23 accent-colored rounded button (corner radius 4) at the right edge of the window, aligned with the upper row. Its tooltip is "Add this plot to layout (click = current layout / drag = any position in layout)." One button provides two actions.

Click = Add Immediately to the Current Layout

Adds a plot to the layout using the current X/Y channels, graph type, population, size preset, and H setting (300 dpi / 96 dpi). For n existing items, placement uses column = n mod 3 and row = n ÷ 3, giving a position of 12 + (column × (width + 12)) from the left and 12 + (row × (height + 20)) from the top. After the plot is added, NeoFlow automatically switches to the Layout screen.

Drag = Drop Anywhere in the Layout

Dragging more than 3 px starts a drag carrying a "completed plot configuration" that includes file, population, X/Y channels, graph type, resolution, and output dpi. It can be dropped at any position in the layout.

Difference in the Windows version: Because the "⤴" symbol is not available in the default Windows font, it is drawn using a dedicated vector arrow icon.


2.4 Axis Settings
2.4.1 Selecting X- and Y-Axis Channels

The X axis is positioned at the center below the plot area (plot center x, plot bottom + 28 px). Its controls form one horizontal row—channel selection, scale, and gear—from left to right, with a gap of 4.

The Y axis is positioned to the left of the plot area at the greater of 20 px from the left edge or "plot left − 40 px," and is rotated −90°. Its vertical position is 58% of the plot height.

Both pull-downs list all channel names in the FCS file. Changing a channel causes the following three actions.

  1. The Scale pull-down automatically follows the global transformation method configured for that channel.
  2. The gear button's visibility and tooltip are updated.
  3. The plot is redrawn.

Even when the graph type is Histogram, the Y-axis channel selector, Scale control, and gear remain visible (the Y channel is not used for histogram rendering).

2.4.2 How Axes Are Chosen When a Graph Window Opens

Axes are determined in the following order.

  1. First, default axes are selected by uppercasing channel names and testing for exact matches. For X, the order is FSC-A → FSC-H → first channel. For Y, the order is SSC-A → SSC-H → third channel (or the last channel if there are fewer than three).
  2. If the caller does not explicitly specify X/Y, and the current population contains a child gate that is drawn in it, that child gate's axes are used (so that the gate is visible and clickable). The same applies when a file is opened as ungated: if the root has a gate, that gate's axes are used. If there is no gate, the default FSC/SSC axes remain.
  3. If the selected child gate has no Y channel (a one-dimensional histogram gate), the graph type is also switched automatically to Histogram.
  4. Finally, if the caller explicitly specified X/Y or graph type, those values override the preceding choices.
2.4.3 Axis Transformation Method (Scale)

For the X axis, this pull-down is immediately to the right of the channel selector. For the Y axis, it is part of the rotated controls and is positioned at 28% of the plot height, but no higher than plot top + 58 px. The tooltip is "Scale (applies to all data)."

Display Label Transformation
Lin linear
Log Log
Biex biexponential

This is a global setting shared by all files. Changing it is reflected immediately in every open Graph window and layout that uses that channel.

For channels with no explicit setting, the default is determined automatically: if the channel name contains FSC or TIME, linear is used; otherwise log is used.

Difference in the Windows version: The pull-down labels are "Linear / Log / Biexponential," rather than the macOS labels Lin/Log/Biex. The behavior is identical.

2.4.4 Conditions for Displaying ⚙ (Detailed Axis Settings)

A "⚙" button appears next to the scale control for each axis (for the Y axis, next to the rotated control, with a gap of 2).

  • It is shown only when the transformation for that axis is log or biex, and hidden for linear.
  • The tooltip shows the current setting. For log it reads "Log settings: (minimum)–(maximum)"; for biex it reads "Biex settings: Positive Decades (value, 2 decimal places)."
  • Clicking opens a popover above the anchor. Clicking outside closes it. Values are committed and saved as soon as a slider is moved.

Difference in the Windows version: The same settings panel is displayed as a floating window. It appears below the gear for the X axis and to the left of the gear for the Y axis. Slider ranges are identical to the macOS version.

2.4.5 Gear Panel (Log Settings)

A 280 × 128 panel titled "Log: (channel name)" (Bold 12 pt). It contains two control rows, each consisting of a continuous slider (width 256) plus an editable numeric field at the right (width 92, right-aligned, 11 pt).

Item Slider Range Default
Minimum 0 to ceil(log10(max(1, channel range))) in log10 space 1
Maximum Same as above The channel range
  • The numeric fields display real values. Values of 1000 or greater are shown as integers; smaller values are displayed to approximately four significant digits. An entered value is converted to log10 and then clamped to the allowed range.
  • Moving a value is reflected live in all plots immediately.
  • The minimum is clamped to 1–range, and the maximum is clamped to "minimum × 1.01"–range.
2.4.6 Gear Panel (Biex Settings)

A 280 × 176 panel titled "Biex: (channel name)." Three FlowJo-style parameters are adjusted with sliders.

Item Slider Range Effective Value Display Format Default
Positive Decades 2 〜 7 Same value 2 decimal places Calculated automatically from the channel range (see below)
Width Basis 0–3 in log10 space Negative powers of 10 = −1 to −1000 Integer −1000
Extra Neg. Decades 0 〜 2 Same value 2 decimal places 0

The default Positive Decades value is not fixed. It is calculated from the channel range (default fjMax = channel range) as max(1, min(7, log10(range) − 1)). For example, a channel with a range of 262144 initially displays approximately 4.42.

When values are saved, Positive Decades is clamped to 0.5–7, Width Basis to −1 or lower, and Extra Neg. Decades to 0 or higher. Every change is reflected live in all plots immediately.

2.4.7 Synchronizing Transformations with Other Windows and Layouts

When the transformation method or log/biex parameters are changed, all open Graph windows perform the following actions.

  1. Update the Scale pull-down for the displayed channel to the global value.
  2. Update the gear button visibility and tooltip.
  3. Redraw.

No filtering is performed according to whether a window uses that channel; every open window is redrawn unconditionally.

2.4.8 Recording the Last Displayed Axes

Whenever a plot is rendered, the "last displayed X axis, Y axis, and graph type" are recorded for that population. This record is used to restore axes when opening a parent with ▲, drilling down, or dragging to a layout. When opening a population with no child gate, this record takes precedence over the gate's own definition axes.


2.5 Statistics Displayed on the Plot

The Graph window displays the following two statistical elements on the plot. Neither label intercepts clicks. Clicking on a label still allows selection or drill-down of a gate underneath it.

2.5.1 Population Count (Upper Right)

A read-only label in the upper-right corner of the plot area (right-aligned 2 px from the right edge, top + 2 px) showing "population name: count."

  • The population name is the current gate name; for the root it is ungated.
  • Arial 15 pt, color #333333, right-aligned.
  • Updated on every render.
  • It is not displayed on layout tiles; it appears only in Graph windows.
  • This count is also used as the denominator for each gate's "% Parent" value.
2.5.2 Gate Name + % Parent (Inside Plot)

Near each child gate drawn on the plot, NeoFlow displays "gate name %Parent%."

Item Specification
Font Arial-BoldMT 18 pt
Color The gate color (or #e11 if no color is set)
Outline 2 pt white halo (two-pass rendering that preserves the apparent weight of the text)
% Calculation 100 × gate count ÷ parent-population count
% Format Two decimal places if below 1; one decimal place if 1 or greater

The label anchor position differs by gate type.

Gate Type Label Position
Rectangle / Quadrant Slightly inside the upper-left corner (left + 2, top − 1; baseline below)
Ellipse The highest on-screen point among 48 subdivisions of the ellipse boundary (so the correct top point is used even when the ellipse is rotated)
Polygon / Freehand First vertex
Range / Bisector Slightly to the right of boundary x, plot top + 2 (baseline above)

Labels are clamped so they do not extend outside the plot rectangle: horizontally within the plot width and vertically no higher than the plot top. While a gate is being dragged, only the one gate being edited has its percentage recalculated every frame; other gates retain their text while their label positions follow the plot.


2.6 Filtering Which Gates Are Displayed on a Plot

A child gate is drawn with an outline and label and is available for clicking only if it satisfies all of the following conditions.

  1. Its parent matches the current population.
  2. It is visible within the scope of the currently active group tab (see 2.11.4).
  3. Matches the graph type.
    • For Histogram display: its type is range or bisector, and its X channel matches.
    • For 2D display: range and bisector gates are excluded, and both the X and Y channels match.

If switching group tabs puts the selected gate outside the current scope, only its handles disappear; the selection itself is retained. Switching back restores the selected appearance.

While a gate-drawing tool is selected (anything other than "Operate"), the selected gate's handles are not displayed at all. A blue bounding rectangle is never drawn around the selected gate. Handles are the only visual indicator of selection.


2.7 Creating Gates
2.7.1 Gate-Drawing Tools (Eight Buttons in the Lower Toolbar Row)

Eight 28 × 23 mode buttons are centered in the lower toolbar row with a gap of 3. They are mutually exclusive; the selected button is filled with the accent color and its icon becomes white. The default is "Operate."

Tool Display Tooltip Display Condition
Operate ↖(15 pt) "Operate" Always displayed
Rectangle Rectangle icon "Rectangle" 2D plots only
Polygon Polygon icon "Polygon" 2D plots only
Ellipse Ellipse icon "Ellipse" 2D plots only
Quadrant ✛(16 pt) "Quadrant" 2D plots only
Freehand ✎(16 pt) "Freehand" 2D plots only
Range ▭(14 pt) "Range" Histogram only
Bisector ┃(16 pt) "Bisector" Histogram only

Selecting anything other than "Operate" enters drawing mode. Returning to "Operate" restores handles for the selected gate and allows existing gates to be selected, moved, resized, and edited by vertex.

Difference in the Windows version: The tooltip text (Operate / Rectangle / Polygon / Ellipse / Quadrant / Freehand / Range / Bisector) is identical. Because the symbol glyphs are unavailable in the default Windows font, the icons are replaced by dedicated vector drawings.

2.7.2 Switching Tool Visibility with Graph Type

Changing the graph type automatically changes which gate-drawing tools are shown.

Graph Type Displayed Tools
Pseudocolor / Dot plot / Contour / Density Operate / Rectangle / Polygon / Ellipse / Quadrant / Freehand
Histogram Operate / Range / Bisector

"Operate" is always displayed. If switching graph type hides the currently selected tool, NeoFlow automatically returns to "Operate".

2.7.3 Rectangle (rect)

Procedure

  1. Set the graph type to a 2D type (Pseudocolor / Dot plot / Contour / Density).
  2. Select the Rectangle tool in the lower toolbar row.
  3. Drag on the plot to draw a rectangle. During the drag, a dashed red preview (#e0004d equivalent, line width 1.5) is displayed.
  4. Release the mouse button. The gate is committed only if both width and height exceed 4 px (preventing tiny gates from accidental clicks).
  5. The "Enter Gate Name" dialog opens. The initial value is "R(sequence number)."
  6. Press "OK" to create the gate. Press "Cancel" to create nothing.

What Happens After Creation

  • Coordinates are stored in data space, with left/right and top/bottom automatically normalized so that the smaller value is the start point.
  • The tool automatically returns to "Operate," and the newly created gate becomes selected (handles displayed). It can immediately be deleted with the Delete key.
  • Its own identifier is written as the link identifier, and the currently active group is written as the group identifier (no group assignment when the All Samples tab is active).
  • It is automatically replicated to other samples within scope (see 2.11.1).
2.7.4 Polygon (poly)

Procedure

  1. Use a 2D graph type and select the Polygon tool.
  2. Each click on the plot adds a vertex.
  3. Once there are at least three vertices, close it using either of the following methods.
    • Double-click.
    • Click within 12 px horizontally and vertically of the starting point.
  4. The "Enter Gate Name" dialog opens. The initial value is "P(sequence number)."
  5. Press "OK" to create the gate; press "Cancel" to create nothing.

Display While Drawing

Element Display
Committed edges Solid #e8123a line (width 2.4)
Live edge from final vertex to cursor Solid #e8123a line (width 2.4)
Guide from cursor to starting point Semi-transparent red dashed line (width 1.4)
Committed vertices Red dots with radius 3.2 px
Cursor-position marker An 8 px-diameter #e8123a dot with a 3.2 px-diameter white dot at its center (double circle)
Closure indication With at least three vertices, moving the cursor within 12 px of the starting point displays a green (#1aa06d) snap ring (diameter 16, line width 2.5, 25% fill)

If closure is attempted with fewer than three vertices, the drawing is discarded and no gate is created.

2.7.5 Ellipse

Procedure

  1. Use a 2D graph type and select the Ellipse tool.
  2. Drag on the plot to draw the bounding rectangle. A dashed ellipse is previewed during the drag.
  3. Release the mouse button. The gate is committed only if both width and height exceed 4 px.
  4. The "Enter Gate Name" dialog opens. The initial value is "O(sequence number)."
  5. Press "OK" to create the gate; press "Cancel" to create nothing.

What Happens After Creation

  • The ellipse is stored in display coordinates (center x/y and radius x/y represented from 0 to 1). Its initial rotation angle is 0.
  • If the dragged rectangle reaches or extends beyond a screen axis (0 or 1), the ellipse is extended without limit in that direction. This prevents the counterintuitive case where an ellipse reaching the axis would produce a lower percentage than a rectangle gate reaching the same axis.
2.7.6 Freehand

Procedure

  1. Use a 2D graph type and select the Freehand tool.
  2. Hold down the mouse button on the plot and trace the shape you want to enclose. During dragging, a dashed polyline (line width 1.5) is drawn.
  3. Release the mouse button. The gate is committed only if at least four points have been collected.
  4. The "Enter Gate Name" dialog opens. The initial value is "P(sequence number)" (the same sequence used for polygons).
  5. Press "OK" to create the gate; press "Cancel" to create nothing.

The resulting gate is of the Freehand type, but its geometry, hit testing, and vertex editing are exactly the same as for a polygon. Only the creation gesture differs.

2.7.7 Quadrant (quad)

Procedure

  1. Use a 2D graph type and select the Quadrant tool.
  2. Click once on the plot. The clicked position becomes the center of the crosshair.
  3. No gate-name dialog appears; four gates named Q1 / Q2 / Q3 / Q4 are created immediately.

What Happens After Creation

  • The four gates are grouped by a shared identifier, and each outward direction is represented by a sentinel coordinate meaning "infinity."
  • Each of the four gates receives its own independent random color.
  • No group identifier is assigned (they are always visible on every group tab).
  • They are not automatically replicated to other samples; these gates are specific to that file.
  • Only one undo snapshot is pushed before the four gates are created, so a single ⌘Z removes all four.
  • The tool automatically returns to "Operate."
2.7.8 Range (Histogram Only)

Procedure

  1. Set the graph type to Histogram.
  2. Select the Range tool (▭).
  3. Drag horizontally on the plot to specify an X interval. The preview is a dashed band (line width 1.5) spanning the full plot height.
  4. Release the mouse button. The gate is committed only if the horizontal movement exceeds 4 px.
  5. The "Enter Gate Name" dialog opens. The initial value is "R(sequence number)" (the same "R" prefix as Rectangle, but Range gates use a separate sequence that counts only Range gates).
  6. Press "OK" to create the gate; press "Cancel" to create nothing.

The resulting gate is a Range gate with no Y channel (no upper or lower Y boundary is stored). This type affects histogram filtering, handle type, and automatic candidate-name numbering.

2.7.9 Bisector (Histogram Only)

Procedure

  1. Set the graph type to Histogram.
  2. Select the Bisector tool (┃).
  3. Click once on the plot. The clicked X position becomes the split position.
  4. No gate-name dialog appears; two gates, lower and upper, are created immediately.

What Happens After Creation

  • The names are "X channel name -" (lower) and "X channel name +" (upper).
  • No group identifier is assigned, and the gates are not automatically replicated to other samples; they are specific to that file.
  • Only one undo snapshot is pushed before the two gates are created, so a single ⌘Z removes both.
  • The tool automatically returns to "Operate."
2.7.10 "Enter Gate Name" Dialog

A modal dialog appears when committing any of five gate types: Rectangle, Polygon, Ellipse, Freehand, and Range. Quadrant and Bisector gates are created immediately without this dialog.

Item Description
Message "Enter Gate Name"
Input Field 220 × 22. The candidate name is prefilled, selected in full, and the field receives focus.
Buttons "OK" / "Cancel"
  • Press "OK" to create the gate.
  • Press "Cancel" to create nothing. The selected tool is not changed.
  • If trimming leading and trailing whitespace leaves the input empty, the gate name becomes "Gate (internal ID)" (for example, Gate g7).
2.7.11 Automatic Candidate-Name Numbering

The proposed candidate name is generated by counting existing gates of the relevant type in that file and adding 1.

Gate Type Candidate Name What Is Counted
Rectangle R(sequence number) Rectangle gates only
Ellipse O(sequence number) Ellipse gates only
Polygon / Freehand P(sequence number) Combined count of Polygon and Freehand gates
Range R(sequence number) Range gates only
Quadrant Q (Fixed; no dialog is actually shown, and the names are fixed as Q1–Q4)

If no file exists, the candidate name is "Gate."

2.7.12 Colors of New Gates

New gates are automatically assigned a random color (integer hue from 0–359, saturation 70%, brightness 42%). Each of the four Quadrant gates receives its own independent random color. A new random color is also assigned when Unique is turned on or when editing an All Samples gate from a group tab causes a fork.

The fallback color used for a gate with no assigned color differs depending on where it is displayed.

Display Location Fallback Color
Color swatch in the tree #3a7bd5
Initial value in the color-change panel #e0004d
Gate-name label on the plot #e11

2.8 Editing Gates

Gate selection, movement, and transformation are performed while "Operate" (↖) is selected in the lower toolbar row.

2.8.1 Selecting a Gate

When the plot is clicked, the target is determined in the following priority order.

  1. Handles of the currently selected gate (highest priority).
  2. Then, gates are checked one at a time in reverse drawing order (front to back), testing "that gate's handles → that gate's body" for each gate.

Because this second step is not a two-pass process that tests all gate handles first and then all gate bodies, the body of a frontmost gate takes priority over the handles of a gate behind it.

  • Clicking a location that hits nothing clears the selection.
  • Only gates that satisfy the filtering conditions in 2.6 are eligible.
2.8.2 Handle Appearance and Hit Testing
Item Specification
Normal Handle 8 × 8 square, white fill, #2f6fed border, line width 1.5
Ellipse Rotation Handle Only Circular outline + rotation-arrow glyph (radius is 13 × 0.8 × 0.75)
Hit Test Less than 7 px horizontally and vertically from the handle center

The ellipse rotation handle is positioned 20 px outside the e handle so that it does not overlap this 7 px hit-test region.

2.8.3 Handles by Gate Type
Gate Type Handles
Rectangle Eight: nw / n / ne / e / se / s / sw / w
Ellipse e / w / n / s / center, plus rot (rotation) 20 px farther outside e
Polygon / Freehand Each vertex (v0, v1, …; one per vertex)
Range x0 / x1 (vertically centered in the plot)
Bisector c (also centered vertically)
Quadrant center only

Resizing a Rectangle If the handle name contains "w," the left edge follows the mouse; "e" controls the right edge; "n" the top; and "s" the bottom (corner handles control two axes simultaneously). When dragging ends, left/right and top/bottom are automatically normalized if they have crossed.

Resizing and Rotating an Ellipse e / w change the major radius, while n / s change the minor radius (calculated in local coordinates that account for the rotation angle; minimum 0.01). If a handle is dragged to or beyond a screen axis (normalized coordinate ≤0 or ≥1), that radius is extended without limit, following the same principle used when a rectangle gate reaches an axis. The center does not move in this case. The center handle translates the center, and rot sets the rotation angle according to the drag direction.

Editing Polygon/Freehand Vertices A handle appears at each vertex, and dragging moves only that vertex. There is no UI for adding or deleting vertices. Inside/outside testing is performed in data space using the same space and algorithm as population calculation, so hit classification remains consistent even on log or biex axes.

Range/Bisector Handles A Range gate has two handles, one for each X boundary. A Bisector gate has one handle for changing the split position. The lower and upper Bisector gates each store their own split position rather than sharing one directly, so the two are kept synchronized through their link.

Quadrant Center Handle A Quadrant has no resize handles; it has only a single center. Dragging it updates the coordinates on the "center-facing side" of all four gates in the same quadrant set to the new center, while preserving the outward infinite directions. Thus all four quadrants move together. When dragging ends, each of the four gates is synchronized individually to other samples.

2.8.4 Moving a Gate (Dragging the Body)

Dragging inside a gate moves it. Behavior by gate type is as follows.

Gate Type Movement When Body Is Dragged
Rectangle Translate all four corners by the on-screen movement amount
Ellipse Translate the center by the movement amount
Polygon / Freehand Translate all vertices
Range Translate both boundaries
Quadrant Does not move (use the center handle)
Bisector Does not move (there is no body hit test)
  • An undo snapshot is pushed only on the first frame of the drag, so a single ⌘Z reverts one complete drag.
  • During dragging, the plot is redrawn every frame, handles follow the gate, and the gate-name/% label position and percentage are updated live. To prevent flicker, only gate outlines are rebuilt synchronously during dragging; the existing density or point cloud is retained.
2.8.5 Cursor on Hover

With the "Operate" tool active, the cursor changes according to the handle hit whenever the mouse moves.

Hit Target Cursor
Nothing hit Arrow
Body / center Move
rot (rotation) Grab
Vertex (v0, v1, …) Pointing hand
n / s Vertical resize
e / w / x0 / x1 / c Horizontal resize
ne / sw NE–SW resize
nw / se NW–SE resize
Other Pointing hand

The cursor is set again on every event even if it is unchanged from the previous event, preventing an external factor from leaving the cursor stuck as an arrow.

2.8.6 What Happens When a Drag Is Committed (Normalization, Forking, Propagation)

When the mouse button is released, the following processing runs only if actual movement occurred. A simple click with no movement merely selects the gate.

  1. Normalization: If left/right or top/bottom have crossed, they are swapped back into normalized order.
  2. Fork (exceptional branching): If the currently active tab is a specific group (other than All Samples) and the edited gate originates from All Samples (has no group identifier), the original gate is not modified. Instead, the following occurs.
    • A new independent gate is created with the current shape (new ID, new link identifier, non-Unique, assigned to that group, including descendants).
    • Its name becomes "original name-1" (or -2, -3, … if already used).
    • It receives a new random color.
    • The original All Samples gate is restored to its pre-edit shape and is not changed at all.
    • The new gate is replicated to all other member files in that group.
    • The status message reads: "Edited '(original name)' and registered it for all samples as the new gate '(new name)' in group '(group name)' (the original All Samples gate was not changed)."
  3. Normal propagation: If the condition above does not apply, the shape is propagated as-is to all non-Unique copies with the same link identifier, including copies in other files.

Finally, all open Graph windows are redrawn. However, when editing a gate that does not propagate to other samples, such as a Quadrant or Bisector gate, only windows for that file are redrawn.

Whenever a gate's shape is modified, any grid-raster classification rule imported from a .wsp file is cleared. This prevents an obsolete rule from remaining active and causing the population to stay unchanged even after the gate is dragged.

2.8.7 Drill-Down by Double-Clicking

With the "Operate" tool active, double-clicking inside a gate opens a new Graph window using that gate as the population.

  • Which gate was hit is determined in data space; if gates overlap, the frontmost one is selected.
  • If a window for the same file and population is already open, no new window is created; the existing window is simply brought to the front.
  • The axes used when opening are taken from a child gate if the gate has one; otherwise from the gate's "last displayed axes"; otherwise from the gate's own definition axes.
  • The graph type is not inherited. The new window uses the default graph type (Pseudocolor). However, if the selected child gate has no Y channel, it automatically switches to Histogram.

For Graph windows opened on the Workspace desktop, drill-down always opens a new floating window on the desktop. As a fallback for non-desktop paths (when opening as a floating window is not explicitly requested), NeoFlow can also open an independent 468 × 500 OS window (minimum 300 × 300, centered on screen, offset slightly when a population is specified), but this window does not have the ▲ ◀ ▶ navigation bar.

2.8.8 Deleting a Gate with the Delete Key

When a gate is selected on the plot, press Delete or Forward Delete (⌦) to delete it.

  • A confirmation dialog appropriate to the scope is displayed (see 2.12.3). The buttons are "Delete" and "Cancel."
  • Choosing "Delete" removes the gate according to its link scope. An undo snapshot is pushed, so the operation can be reverted with ⌘Z.
  • Clicking the plot makes the plot the recipient of keyboard input, so a gate selected in the tree is not accidentally deleted.
  • If no gate is selected, the Delete key is passed to normal key processing.

2.9 Gate Tree (Left Panel)
2.9.1 Hierarchical Display

In the "FCS Files" tree in the left panel, each file row is followed by that file's gates displayed as a parent-child tree.

  • Only gates visible in the current group context are displayed (see 2.11.4).
  • The gate hierarchy is always fully expanded. There is no collapse/expand operation, and all disclosure triangles are hidden.
  • Indentation is 8 pt per level and row height is 20 pt.
  • Multiple rows can be selected with Shift-click, ⌘-click, or drag-range selection.
  • A single click selects only. Double-clicking opens a Graph window for that gate (population), or brings the existing window to the front if it is already open.
2.9.2 Columns (Name / Date / Count / %)
Column Width Sorting Header Tooltip
Name 177 (minimum 100; only this column expands when the panel is widened) Click to sort by name "Sort by Name"
Date Measured width required for "Date ▲" / "Date ▼" (minimum 32) Click to sort by date "Sort by Date"
Count 46 Not available None
% 46 (header is "%" only) Not available None

Columns cannot be resized or reordered. Horizontal spacing between columns is 0.

2.9.3 Count Column (Event Count)
Row Type Displayed Value
File row Total number of events in that file
Gate row Number of events in that population
  • Counts are cached by file, gate, and data version. All gates are calculated together in the background before the results are reflected in the interface.
  • Until calculation is complete, "…" is displayed.
  • The format is right-aligned, tabular numerals, 12 pt, in a muted color.
2.9.4 % Column (% Parent)
Row Type Displayed Value
File row Always "100%"
Gate row Gate count ÷ parent count × 100, shown to one decimal place plus "%" (for example, "12.3%")
  • The denominator is the parent gate's count if a parent gate exists; for a root gate directly under the file, it is the file's total event count.
  • The denominator is guarded to a minimum of 1, so even when the parent has 0 events there is no division by zero; "0.0%" is displayed.
  • The field is blank while counts have not yet been calculated.
  • The format is right-aligned, tabular numerals, 12 pt, in a green accent color.
2.9.5 Color Swatch

A 9 × 9 pt square (corner radius 2) to the left of the gate name shows the gate color. Its tooltip is "Click to change color."

  • A single click opens the system color picker directly (the swatch receives the click before row selection).
  • Every color change in the picker, including continuous changes while dragging, pushes an undo snapshot and applies the color. Unlike the "Change Color" command in the right-click menu, no extra snapshot is pushed before opening the picker.
  • A gate with no assigned color is displayed as #3a7bd5.
2.9.6 Axis Label

Immediately to the right of the gate name, the gate's definition axes are shown in small text in the form "X/Y" (9 pt, #888 gray), for example "FSC/SSC."

  • Only a trailing "-A" (case-insensitive) is removed from a channel name. "-H" and "-W" are not removed.
  • For gates with no Y channel, such as Range and Bisector, only X is displayed.
  • If the X-channel index is out of range, "?" is displayed.
2.9.7 Unique Checkbox (U)

At the right edge of a gate row is a 9 pt "U" label (#aaa) and a mini checkbox.

Element Tooltip
"U" label "Unique: ON = independent gate"
Checkbox "Unique: When ON, changes are not reflected in other samples (independent gate)"
State Meaning
On Independent gate
Off (default) Linked shared gate

Switching the checkbox takes effect immediately, without a confirmation dialog. See 2.11 for details.


2.10 Drag Operations in the Tree
2.10.1 Drag Within the Same File = Reparenting (Move)

Drag and drop a gate row onto another gate row within the same file, or onto that file's row, to perform a "move" operation (the drag image shows a move badge).

Drop Target Result
Gate row Becomes a child of that gate
File row Becomes top-level (no parent)
  • Only the parent-child relationship changes. ID, link identifier, group identifier, Unique state, and shape are all unchanged.
  • Descendants follow their parent, so the entire subtree moves together.
  • The operation is invalid in the following cases: dropping onto itself; dropping onto one of its own descendants (which would create a cycle); or when the parent would not change (in this case no undo history is consumed).
  • On success, the status message reads either "Moved gate '(name)' under '(parent name)'" or "Moved gate '(name)' to top level."
  • If the moved gate is non-Unique, the same reparenting is propagated to non-Unique copies with the same link identifier in other files. The new parent is resolved by name path; files in which the parent cannot be resolved or the move would create a cycle are skipped individually. A Unique gate is moved only within its own file.

This feature was not present in the original JavaScript version and was added at the user's explicit request.

2.10.2 Drag to a Different File = Copy to Another Sample

Drag and drop a gate row onto a file row or gate row in a different file to perform a "copy" operation (the badge indicates copy).

Drop Target Result
Gate row Add as a child of that gate
File row Add as a top-level gate
  • The gate and its descendants are replicated to the destination as a subtree.
  • New IDs are issued for the copies, but the link identifier is preserved. Therefore shape, name, and color remain synchronized as members of the same lineage.
  • The group identifier and Unique flag are preserved unchanged.
  • Even if a gate with the same name already exists, it is never replaced; the copied gate is always added. Existing gates are never modified or deleted.
  • When complete, the status message reads "Applied gate to (file name without extension)," and the tree, all Graph windows, and the layout are updated.

Dragging a file row does not copy gates; the only drop target for a file row is a group pill. Rows within the tree accept only gate-row drags.

2.10.3 Drop on a Group Tab = Copy to Group Scope

Drag and drop a gate row onto a group tab at the top of the left panel (other than All Samples) to copy it as a gate specific to that group. During the drop, the pill is shown with a green background (#d7ffe7), green border, and 2 px outer ring.

The following occurs.

  • The original gate, and any existing copies in other files, are not changed at all.
  • The dragged gate and its descendants are duplicated with new IDs and a new link identifier (not linked to the original or siblings), Unique off, and assigned to the target group.
  • The ancestor hierarchy required for display is resolved or duplicated so that it is visible within the target scope. Existing visible ancestors are reused to prevent unnecessary duplication of the hierarchy.
  • The duplicate is then added unconditionally to all other member files in the target group. No collision detection is performed, and existing gates are not modified.
  • Even if the source gate was Unique, the newly generated lineage is always non-Unique.
  • File membership in groups is not changed.
  • When complete, the status message reads "Applied gate '(name)' to all samples in '(group name).'"

If a multi-row drag contains even one file row, it is treated as a "file drag" and all gate rows are ignored completely, preventing unintended gate duplication. Applying a gate to a group occurs only when the drag selection consists solely of gate rows.

2.10.4 Drop on the All Samples Tab = Promote to All Samples

Dragging and dropping a gate row onto the "All Samples" tab performs a promotion. This is not a copy; it is effectively a move.

Processing occurs in the following order.

  1. First record all link identifiers used by the subtree before promotion.
  2. Create a new independent gate on the source file (new ID, new link identifier, no group assignment, non-Unique, including descendants).
  3. Delete the pre-promotion subtree from the source file.
  4. Replicate the new independent gate to all other files (the ancestor hierarchy is resolved or duplicated by name in each file).
  5. Delete the pre-promotion linked lineage from all files, including synchronized copies held by other members of the group.

In other words, the group-specific gate disappears and becomes a gate shared by all samples. When complete, the status message reads "Promoted gate '(name)' to '(group name)' (group-specific gates were deleted)."

The dashed "+" pill for adding a new group does not accept drops.


2.11 Unique Gates and Link-Based Propagation
2.11.1 Automatic Propagation of New Gates Within Scope

When a new Rectangle, Range, Ellipse, Polygon, or Freehand gate is created, it is automatically replicated to every other file within the active group's scope (all files on the All Samples tab, or files belonging to the current group on a group tab).

  • Each copy receives a new ID while preserving the link identifier; the group identifier and Unique flag remain unchanged.
  • The parent position at the destination is resolved using a name path. If it cannot be found, the gate is placed at the root (top level).
  • If a gate with the same name already exists, it is not replaced; the new gate is added.
  • Quadrant and Bisector gates are excluded from this automatic propagation; they are specific to the file in which they are created.
2.11.2 How Propagation Works Through Link Identifiers

A new gate is created with "link identifier = its own ID," and this link identifier is preserved when the gate is replicated to other samples. The link identifier therefore acts as a lineage identifier indicating that copies represent the same gate.

Synchronization applies to gates whose link identifiers match and that are not Unique.

Operation Synchronized?
Shape changes Yes
Name changes Yes
Color changes Yes
Changing parent-child position in the tree Yes
Deletion Yes (but limited to files within the active group's scope)
Last displayed axes / graph type Propagated to all copies with the same link identifier without checking Unique (the sole exception)

For Quadrant gate shape synchronization, each of the four quadrants belonging to the same quadrant set is synchronized individually.

Only lineages created by copying to a group scope (2.10.3) or promoting to All Samples (2.10.4) receive a new link identifier, so they are not linked to the original lineage.

2.11.3 When Unique Is Off vs. On

Unique determines whether a gate is an independent gate belonging only to this sample. Toggle it with the "U" checkbox at the right edge of the gate row.

Differences in the Propagation Range of Changes

Operation Unique Off (linked shared gate; default) Unique On (independent gate)
Shape (move, resize, vertex editing) Reflected in all copies in other samples with the same link identifier Only this sample changes
Name change Reflected in all copies with the same link identifier Only this sample changes
Color change Reflected in all copies with the same link identifier Only this sample changes
Reparenting in the tree The same reparenting is reflected in copies in other files with the same link identifier Only this sample moves
Deletion From each file within the active group's scope, the gate with the same link identifier is deleted together with its descendants Deleted only from this sample
Deletion Confirmation Text All Samples tab: "Delete gate '...' from all samples?" / Group tab: "Delete gate '...' from all samples in group '...' ?" "Delete gate '...' from this sample?"
Last displayed axes / graph type Propagated to all copies Propagated to all copies even when Unique is on (the sole exception)

What Happens When the Setting Is Toggled

Turn Unique On Turn Unique Off
Undo History Always push one snapshot at the beginning Always push one snapshot at the beginning
Name Derive a base name by removing a trailing "-number" from the current name, scan all files for other Unique gates with the same link identifier, find the largest trailing "-N," and rename this gate to "base name-(max+1)" ("-1" for the first independent copy) Restored to the shared name during the rejoin procedure below (any "-N" added while Unique was on is overwritten)
Color Assign a new random color so it can be distinguished from the linked gate Copy the color from the sibling being rejoined
Shape Unchanged Copy the shape from the sibling being rejoined
Subsequent Behavior Shape, name, color, tree position, and deletion are confined to this sample Returns to the shared-gate lineage

Detailed Procedure When Turning Unique Off

  1. First, NeoFlow searches all files for a "non-Unique sibling" with the same link identifier. If one is found, its shape, color, and name are copied directly, returning this gate to the shared-gate state.
  2. If no siblings are found (an isolated case that has never been shared since creation), NeoFlow first removes the "-N" suffix from the name. It then searches other files for a gate with a matching name path (root to leaf), non-Unique status, and the same group identifier.
    • If a sibling is found, this gate (including descendants) is deleted and replaced at the same position by an independent copy of that template. Because the replacement inherits the template's link identifier, it truly becomes a member of that lineage thereafter.
    • If no such sibling exists anywhere, NeoFlow simply clears Unique and removes the "-N" suffix; shape and color are left unchanged.

After either toggle, the tree, all Graph windows, and the layout are updated.

2.11.4 Gate Visibility by Group Scope

A gate receives a group identifier when it is created (no group assignment if created on the All Samples tab; assigned to that group if created on a group tab). Visibility is determined as follows.

Display Location Visible Gates
Layout, Statistics, etc. All gates are always visible
All Samples tab Only gates with no group assignment
Group tab Gates with no group assignment (All Samples gates) are always visible; otherwise, only gates assigned to that group are visible

Graph windows also follow tab switching, changing gate outlines, click targets, and labels. Layout tiles are intentionally excluded from this filter and always display all gates.

If switching tabs places the selected gate outside scope, its handles disappear but the selection itself is retained; switching back restores the selection display.


2.12 Gate-Row Right-Click Menu

Right-clicking a gate row in the gate tree displays three items, with a separator between each item.

Item
Rename
───────
Change Color
───────
Delete Gate

Right-clicking a sample (file) row displays no menu items at all.

"Open in Graph Window" is available by double-click, "Add to Layout" by drag-and-drop, and Unique through the checkbox in the row, so these commands are not duplicated in the menu.

Difference in the Windows version: None. The same three items—"Rename," "Change Color," and "Delete Gate"—are provided, and sample rows likewise show no menu.

2.12.1 Rename

Procedure

  1. Right-click the gate row and choose "Rename."
  2. A dialog opens (message: "Gate Name"; 220 × 22 input field prefilled with the current name).
  3. Enter a name and press "OK." Press "Cancel" to leave it unchanged.

Result

  • Leading and trailing whitespace is trimmed. If the result is empty or identical to the current name, nothing happens and no undo snapshot is pushed.
  • If the name changes, an undo snapshot is pushed before the new name is assigned.
  • The name is propagated to all non-Unique copies with the same link identifier, including other files, and the tree, all Graph windows, and the layout are updated. A Unique gate changes only itself.
2.12.2 Change Color

Procedure

  1. Right-click the gate row and choose "Change Color."
  2. The system color picker opens (initial color is the current gate color; #e0004d if no color is assigned).
  3. Choose a color. There is no OK/Cancel; every color change is applied immediately.

Result

  • One undo snapshot is pushed when the menu command is chosen, and additional snapshots are pushed every time the color changes, continuously during dragging.
  • The color is propagated to all non-Unique copies with the same link identifier, and the tree, all Graph windows, and the layout are updated.
2.12.3 Delete Gate (Single Gate)

This can be invoked by choosing "Delete Gate" from the right-click menu, selecting one gate in the tree and pressing Delete, or selecting a gate in a Graph window and pressing Delete (⌦ behaves the same).

The confirmation message has three variants depending on the situation.

Situation Message
Target is Unique "Delete gate '(name)' from this sample?"
Non-Unique; active tab is All Samples "Delete gate '(name)' from all samples?"
Non-Unique; a specific group tab is active "Delete gate '(name)' from all samples in group '(group name)'?"

The buttons are "Delete" and "Cancel."

  • Choosing "Delete" pushes an undo snapshot and performs the deletion. For a Unique gate, only the current file is affected. For a non-Unique gate, within the active group's scope (all files on the All Samples tab), NeoFlow finds gates that have the same link identifier and are non-Unique in each file and deletes each gate together with its descendants.
  • Choosing "Cancel" does nothing.
  • Any Graph window displaying a deleted population closes automatically.
2.12.4 Delete Gates (Multiple Selection)

This describes what happens when multiple rows are selected in the tree and the Delete key is pressed.

Selection Contents Behavior
Contains at least one file row Treated as "file deletion" and deletes only the selected files. Any gate rows included in the same selection are not deleted.
Gate rows only; one gate Scope-specific confirmation dialog described in 2.12.3
Gate rows only; two or more gates A single confirmation asks "Delete the selected (count) gates?" (buttons: "Delete" / "Cancel"). If "Delete" is chosen, one undo snapshot is pushed and then all selected gates are deleted, so a single ⌘Z restores them all.

2.13 Undo and Redo

Gate operations can be undone.

Access Method Description
"↩ Undo" button at the right end of the "FCS Files" header in the left panel Tooltip: "Undo gate creation, copying, or changes (Cmd/Ctrl+Z)"
Edit menu > "Undo" ⌘Z
Edit menu > "Redo" ⇧⌘Z
  • When Layout view is not active, the menu's "Undo" and "Redo" commands perform the same gate undo/redo as the left-panel button.
  • Undo reverses gate operations and file/group operations one at a time in reverse chronological order of when they actually occurred.
  • Gate snapshots retain gate information for all files for up to 30 levels; older snapshots are discarded when this limit is exceeded.
  • ⇧⌘Z performs the corresponding Redo operation.

Gate Operations That Push Undo History

Operation Snapshot Unit
Gate creation One snapshot (for Quadrant, one before all four are created; for Bisector, one before both are created)
Editing drag One on the first frame of each drag
Deletion One (multiple-selection deletion uses one for the entire operation)
Rename One (none if there is no change)
Color change One when opened from the menu, plus one for every color change
Toggling Unique One
Move within the tree One (none if the parent does not change)
Copy to another sample One
Copy to group scope / Promote to All Samples One

Gate operations set the unsaved-changes flag and therefore trigger save confirmation. If you try to close a window with unsaved changes, the "Close Window?" confirmation appears (buttons: "Save and Close" / "Close Without Saving" / "Cancel"). If you try to quit the app, the "Quit App?" confirmation appears (buttons: "Save and Quit" / "Quit Without Saving" / "Cancel").


2.14 Other Gate-Display Settings
2.14.1 Display Gates in Color (View Menu)

A checkable "Display Gates in Color" item in the menu bar's View menu. Its tooltip is: "When on, gate lines and gate names in layouts are displayed using each gate's color (legacy display). When off (default), all are displayed in black. This setting is retained the next time the app starts."

Choice Result
On Display gate lines and gate names in layouts using each gate's color
Off (default) Display everything in black (#000000)
  • The setting is saved and retained the next time the app starts.
  • Switching it redraws all open Layout windows immediately.
  • This affects only layout rendering and export to PDF, PPTX, and similar formats. Workspace Graph windows are not affected and are always displayed in color.
  • NeoDraw does not have this menu item.
2.14.2 Gate-Line Thickness in Graph Windows and Layouts
Display Location Line Thickness
Workspace Graph window 2 pt (white halo extends 0.5 px on each side)
Plot tile in a layout 1 pt (unless manually overridden)
2.14.3 Gate Style (Per-Tile Settings in Layouts)

In the Layout editor, right-click a plot tile and choose a gate name from the "Gate Style" submenu to change the color and line width of only that gate in that tile.

  • The submenu lists all gates in the tile by name, including sibling gates in Quadrant and Bisector sets. If a gate has no name, its internal ID is shown.
  • For a tile containing no gates, the menu item itself is disabled (grayed out); it is not hidden.
  • Selecting an item opens a 220 × 130 px floating panel (corner radius 7, with shadow). It can be moved by dragging the header. The header shows "Gate: (gate name)" and a "✕" close button.
Control Description
"Color:" Color well (44 × 22)
"Line Width:" Slider (minimum 0.5, maximum 8, step 0.1) + numeric input field (width 40)
  • A 10.5 pt note at the bottom reads "Changes only the gates in this plot."
  • There is no OK/Cancel; both color and line-width changes are applied immediately.
  • During a single operation session, an undo snapshot is pushed only for the first change.
  • Left- or right-clicking outside the panel closes it; the click itself is not consumed.
  • The slider initially uses the manual override if one exists; otherwise it uses the layout default of 1 pt.
2.14.4 Convert Gates to Shapes (PPTX Export)

This checkbox appears in the Options area of the export dialog only when PPTX is selected as the format.

Item Default Description
"Convert Gates to Shapes" On When on, gates are exported as editable shapes in the PPTX
"Convert Tick Labels to Text (exponents as superscript)" On The other option listed vertically in the same area

When a format other than PPTX is selected, this entire area is hidden.

2.14.5 Population (Gate) Pull-Down (Layout Plot Settings)

This is the "Population (Gate)" pull-down at the top of the plot-tile settings panel in the Layout editor.

Choice Description
"ungated (all cells)" No population specified (first item)
(Subsequent items) All gates in that file, in registration order (display name is the gate name, or the internal ID if unnamed)
  • Changing the selection switches the tile's population.
  • If multiple tiles are selected, the selected gate is matched in each target file by name and applied to each tile. Thus tiles from different files follow the change if they contain a gate with the same name.
  • For a tile with overlays, the populations of overlays from the same file are updated at the same time.
2.14.6 How Gates Are Handled When Deleting Files

The behavior of the "Delete Selected" button in the left panel, or pressing Delete (⌦ behaves the same) with file rows selected in the tree, depends on the active tab.

Active Tab Button Name Confirmation Dialog Result
All Samples "Delete Selected" Message: "Delete selected samples?" / Description: "Permanently delete (count) samples. (Gates will also be deleted.)" / Buttons: "Delete" and "Cancel" "Delete" permanently deletes the samples and their gates
Specific group "Remove from Group" Message: "Remove (count) samples from group '(group name)'?" / Buttons: "Remove" and "Cancel" "Remove" only removes the samples from the group. Neither files nor gates are deleted.

Chapter 3 Compensation (Fluorescence Compensation)

NeoFlow's Compensation editor is a dedicated window for directly adjusting the compensation matrix ($SPILLOVER) contained in an FCS file while viewing pairwise scatter plots of fluorescence channels. Coefficients can be changed in three ways—dragging scatter plots, using sliders, or entering numeric values—and committed values are generally propagated by matching channel names to all loaded files. An adjusted matrix can be exported as a JSON file or saved as a preset linked to an instrument fingerprint (model name, serial number, and parameter configuration), allowing it to be applied automatically the next time an FCS file from the same instrument is loaded.

This chapter explains, in order, how to open the editor, its screen layout, the three adjustment methods, display filtering, reset functions, export/import, presets, Auto Compensation, undo (⌘Z), and the exact behavior of propagation to all files.


3.1 Opening the Compensation Editor
3.1.1 How to Open It

Click the "🎛️ Compensation" button in the toolbar at the top of the Workspace. The toolbar is arranged from left to right as follows.

Position Contents
Left Logo | "📥 Import FCS" "💾 Save" "📂 Open" | "🖼️ Layout" "📊 Statistics" "🎛️ Compensation"
Right (Spacer) "Auto Compensation" checkbox, application-status text, separator, status display

"🎛️ Compensation" is a button with the icon above the label "Compensation." Clicking it opens an independent modeless editor window for one target file.

On macOS, this button is the only entry point; the application menu has no command for opening the Compensation editor.

Note that while the Layout screen is displayed, this button is hidden together with "📊 Statistics". It reappears when you return to the Workspace screen.

3.1.2 How the Target File Is Chosen

When the button is clicked, the editor's target file is chosen in the following order.

Condition Target File
A file row is selected in the left tree The selected file
A gate row is selected in the left tree The parent file of that gate
Nothing is selected The first file in the active group
No files are loaded Nothing happens (no window opens)

After the editor opens, the target can also be switched with the "File:" pull-down in the second header row (see 3.3.1).

3.1.3 Window Title and Size

The window title is "Compensation — " followed by the file name without its extension. When the target is changed with the "File:" pull-down, the title updates accordingly.

The window has a title bar and can be closed, resized, and minimized. Its dimensions are determined as follows.

Item Value
Minimum Size (content) 700 × 420 pt. It cannot be reduced further; this explicit minimum prevents controls such as the fine-adjustment sliders in the footer from being hidden.
Initial Width Calculate 32 for the row header + maximum cell size 160 × number of displayed channels + 16, then clamp to a minimum of 700 pt and a maximum of "screen width × 0.9"
Initial Height Sum the height including header/footer and the grid body, then clamp to a minimum of 420 pt and a maximum of "screen height × 0.8"
Position Center on screen after determining width and height

90% of screen width and 80% of screen height are upper limits; with few channels, the window opens smaller when a larger size is unnecessary.


3.2 Screen Layout
3.2.1 Overall Arrangement

From top to bottom, the editor window consists of the following elements.

Section Contents
Header Row 1 Title label "Compensation Editor" and operation buttons
Header Row 2 "File:" pull-down, "Population:" pull-down, and "Axis Dots:" slider and numeric field
Channel Display Filter Checkboxes for showing/hiding channels (wrap to multiple lines)
Grid N × N scatter plots (horizontal and vertical scrolling)
Footer H / V fine-adjustment panel (fixed height 64 pt, always visible)
Status Row Message display at the bottom
3.2.2 Header Row 1 (Operation Buttons)

At the far left is a fixed Bold 13 pt label, "Compensation Editor." To its right, rounded 11 pt buttons are arranged left-aligned in the following order.

Order Button Reference
1 "Restore FCS Defaults" 3.7.1
2 "Reset All to 0" 3.7.2
3 "↩ Undo" 3.8
4 "💾 Save" 3.10.1
5 "📂 Load" 3.10.2
6 "📌 Save Preset" 3.11.1
7 "🗂 Preset List" 3.11.3
3.2.3 N×N Scatter-Plot Grid

The grid contains fluorescence channels whose names match entries in $SPILLOVER and whose detector names do not begin with FSC / SSC / TIME. The same channels appear as rows and columns, producing all pairwise combinations of row channel (Y axis) × column channel (X axis).

Element Specification
Column Header (top) Fixed 32 pt-high row. Pale-blue background (RGB 0.80 / 0.87 / 0.94), Bold 16 pt, centered horizontally and vertically. Tooltip shows the channel name.
Column-Header Scrolling Does not move vertically; its horizontal position follows grid-body scrolling in one direction only
Wheel Input Over Column Header The header itself does not scroll; the same wheel/trackpad input is forwarded to the grid body, preventing the header from drifting to a separate position
Row Header (left) Width 32 pt; same appearance as the column header. Text is rotated 90° so it reads from bottom to top.
Cell Side Length max(70, min(160, floor((window width − 32 − 16) ÷ number of displayed channels))), i.e. within 70–160 pt
Diagonal Cell (same row and column channel) Blank view in gray 0.95 rather than white; no scatter plot is drawn
Scroll-View Margin Background Gray 0.8
Cell Drawing Area White
Scroll Bars The grid body has both horizontal and vertical scroll bars. When many channels do not fit on one screen, scroll in both directions to see the remaining cells. The column-header area has no scroll bar.
What Becomes Hidden When Resized Smaller Because the origin is at the top edge, reducing the window size hides content from the bottom edge upward
Minimum Grid Height 140 pt. Together with the 700 × 420 minimum window size, this ensures that the fine-adjustment UI in the footer remains visible even when the window is made small.
When the Grid Is Rebuilt After FCS loading is complete, the grid is reconstructed whenever the window width changes by at least 1 pt
3.2.4 Reading an Individual Cell

Every off-diagonal cell is drawn with a fixed Log scale on both axes. Display coordinates are calculated as (log10(max(value, 1)) − log10(1)) ÷ (log10(max(1.01, $PnR)) − log10(1)), using the column channel's $PnR for the X axis and the row channel's $PnR for the Y axis.

Element Appearance
Background White
Normal Points 1.2 × 1.2 squares, dark navy semi-transparent RGBA(20, 30, 50, 0.55)
Points in Selected Cell Opaque black
Axis Dots Points stuck to exactly one of the left edge (X display coordinate ≤ 0) or bottom edge (Y display coordinate ≤ 0) are drawn as red circles, RGBA(220, 40, 40, 0.82). See 3.6 for radius.
Border Gray 0.6, line width 1
Upper-Right Label Two right-aligned lines over a semi-transparent white background: "H xx.xx%" and "V xx.xx%"

"H" is 100 times the matrix component at row = row (Y-axis) channel and column = column (X-axis) channel. "V" is 100 times the transposed component at row = column channel and column = row channel.

Difference in the Windows version: Points in unselected cells are opaque gray RGB(140, 140, 140), rather than the semi-transparent dark navy used on macOS.

3.2.5 Status Row

The bottom row of the window displays status information in 11 pt gray text.

Display Meaning
"Loading FCS..." FCS is being parsed asynchronously
"Failed to Load FCS" Parsing failed
"This file does not contain a Compensation matrix ($SPILLOVER)." In this case, the grid and channel display filter are empty
"Insufficient fluorescence channels for compensation." There are 0 eligible fluorescence channels
"Drag within each plot: horizontal → column compensation, vertical → row compensation. Release to apply to all files." Normal guidance
Other Result messages for JSON Save/Load and Preset Save/Delete operations (see 3.10 and 3.11)

3.3 Selecting the Target File and Population
3.3.1 "File:" Pull-Down

At the left end of Header Row 2 are an 11 pt "File:" label and a pull-down with a maximum width of 220 pt.

Item Description
Enumeration Order The order currently displayed in the Workspace file list, including Name/Date header sorting
How It Updates A snapshot taken when the window opens or when the file is switched; it does not follow changes live
Scope All loaded files; group filtering is not applied
Display Name The extension is removed, then the middle is truncated (start…end) to fit a measured width of 190 pt. Truncation is applied only once.

Changing the selection rebuilds the editor for the target file and always resets the "Population:" selection to "ungated (all cells)".

3.3.2 "Population:" Pull-Down

Immediately to the right of "File:" are an 11 pt "Population:" label and a pull-down with a maximum width of 220 pt. This filters the population drawn in the scatter plots using gates from the selected file.

Choice Description
"ungated (all cells)" The first and default item. Uses all events without gate filtering.
(Subsequent items: gates in that file) Lists all gates in gate order. Each item is indented by the gate's parent depth using full-width spaces " ". An unnamed gate is displayed by ID.

Changing the selection behaves as follows.

  • If FCS loading is still in progress and data are not finalized, nothing happens immediately; the selection is reflected when the editor is rebuilt after loading completes.
  • If loading is complete, the population is recalculated, compensated values are recalculated, and the grid is redrawn.
  • If the population cannot be resolved, NeoFlow falls back to all events.
  • If the population exceeds 2500 events, it is downsampled to 2500 by evenly spaced sampling for display.
  • Gate inside/outside testing uses data in the committed compensation state, not the uncompensated data loaded separately by the editor for preview.

3.4 Adjusting Compensation Values — Three Methods

The Compensation editor provides three ways to adjust the same coefficients. With any method, a committed value is immediately propagated to all loaded files (see 3.9).

3.4.1 Meaning of H and V

Each scatter-plot cell corresponds to a pair of a row channel (Y axis) and a column channel (X axis). Two coefficients can be edited for each pair.

Symbol Corresponding Matrix Component Description in Footer Header Drag Direction
H Row = row (Y-axis) channel × column = column (X-axis) channel "H: Compensation into <X-axis name>" Horizontal drag = "compensation into the column"
V Row = column (X-axis) channel × column = row (Y-axis) channel "V: Compensation into <Y-axis name>" Vertical drag = "compensation into the row"

The "H xx.xx%" and "V xx.xx%" values overlaid at the upper right of the cell are these two components multiplied by 100.

3.4.2 Method 1: Drag the Scatter Plot

Procedure

  1. Press the mouse button over the off-diagonal cell you want to adjust. The cell becomes selected immediately; points in the previously selected cell return to gray/normal color, and points in the newly selected cell become opaque black. At the same time, the footer fine-adjustment panel displays that cell's H and V values.
  2. Continue dragging. While |dx| < 3 px and |dy| < 3 px, the direction is not yet determined and nothing changes.
  3. Once movement exceeds 3 px, the direction is locked. If |dx| > |dy|, the drag is horizontal and edits H; otherwise it is vertical and edits V. At the moment the direction becomes fixed, exactly one undo snapshot is pushed.
  4. During the drag, only the two channels associated with that cell are recalculated and redrawn live. The footer slider, display bar, and numeric field follow simultaneously.
  5. Releasing the mouse commits the value, propagates it to all files, then recalculates and redraws all cells.

How the Target Value Is Calculated

The drag starts from the display-coordinate position of that cell's median at mouse-down. "Movement in pixels ÷ cell side length" is added to this position, the result is clamped to 0–1, and then converted back through the inverse Log transform to obtain the target value. A binary search then finds the coefficient for which the median of the compensated target channel equals that target value. The search range is the original coefficient ± 0.8, with 30 iterations. If no solution exists within the range, the coefficient is clamped to the nearer endpoint.

Note

If the mouse is released before a direction is determined—that is, the cell was clicked without dragging—no commit occurs and no undo snapshot is added. Only the cell selection and footer display change.

3.4.3 Method 2: Move the Footer Slider

The fine-adjustment panel in the footer is always visible at the bottom of the window between the grid and status row, with a fixed height of 64 pt.

When No Cell Is Selected

Only the guidance "Click a cell in the plot to fine-tune compensation coefficients here." is displayed. Sliders and numeric fields safely do nothing because they are not associated with any component.

When a Cell Is Selected

The header becomes "Fine Tune: <Y-axis name> ← <X-axis name> (H: compensation into <X-axis name>, V: compensation into <Y-axis name>)" in Bold 10 pt, gray 0.27. Beneath it, equally wide H and V rows are arranged side by side.

From left to right, each row contains an "H:" or "V:" label (Bold 11 pt, width 18 pt), slider + display bar, keyboard hint, numeric field, and "%" label.

Component Specification
Slider Range −1 to 1 (continuous)
Mapping Between Slider and Coefficient Nonlinear (square-root mapping). From slider position s to coefficient: if s ≥ 0, s²; if s < 0, −s². From coefficient c to slider position: if c ≥ 0, √min(1, c); if c < 0, −√min(1, −c). This expands the movable range near 0, making fine adjustment easier.
Display Bar A display-only bar directly beneath the slider, height 4 pt, not interactive. The track is gray 0.87; blue fill (#4a8ee8) extends from the center 50% toward the side corresponding to the sign of the coefficient.
Slider + Bar Width Fixed proportionally to 70% of the remaining row width after subtracting fixed elements (label 18 + numeric field 56 + "%" label width + spacing 18)
Numeric Field Width 56 pt, right-aligned, 11 pt, bordered. Displays "coefficient × 100" to two decimal places; the unit "%" is a fixed label immediately to the right.

Procedure

  1. Click the cell you want to adjust to select it.
  2. Drag the slider in the H or V row. At mouse-down, exactly one undo snapshot is pushed for that drag.
  3. During dragging, the coefficient updates, the numeric field and display bar stay synchronized, and only that cell is redrawn live.
  4. Releasing the mouse commits the value and propagates it to all files.
3.4.4 Method 3: Enter a Numeric Value Directly (Including ↑/↓ Keys)

Procedure

  1. Select a cell, then click the numeric field in the H or V row to edit it.
  2. Enter a percentage value; the display uses two decimal places.
  3. Press Enter or move focus elsewhere to commit. On commit, NeoFlow performs the following sequence: add an undo snapshot (with 500 ms deduplication from the first edit) → apply the coefficient → resynchronize the slider/display bar → redraw live → immediately commit to all files.
  4. If the entered text cannot be interpreted as a number, the field is restored to the current value.

Keyboard Increment/Decrement

Between the numeric field and slider, a 9 pt gray hint is always shown: "↑/↓ ±1; Shift+↑/↓ ±0.1".

Key Increment
↑ / ↓ ±1.00% (= coefficient ±0.01)
⇧↑ / ⇧↓ ±0.10% (= coefficient ±0.001)

When pressed while editing the numeric field, the displayed value changes by that amount, and each key action follows the normal commit path: apply coefficient → resynchronize → redraw live → commit to all files.


3.5 Filtering Displayed Channels

When there are many channels, the grid becomes very large, so you can restrict which channels are displayed.

Location: Below Header Row 2 and above the grid column headers.

Display

  • One checkbox is shown for every fluorescence channel included in $SPILLOVER, including channels currently hidden.
  • Each 11 pt label is the channel display name with a trailing "-A" removed.
  • Items that do not fit wrap to the next line (horizontal gap 8, vertical gap 4, row height 20). The area's height changes automatically with wrapping.

Operation and Result

State Result
Checked Show that channel
Unchecked Completely remove that channel from both rows and columns of the grid
All unchecked The grid displays "All channels are hidden. Select channels to display using the checkboxes above."
The file has no $SPILLOVER No checkboxes are displayed; the filter itself is empty

Toggling a checkbox rebuilds the grid. This setting is saved and restored in the workspace file (.faws) as a per-file setting (files[].compHiddenChans). However, because this is only a display filter, toggling it does not set the workspace's unsaved-changes flag.


3.6 Axis Dots (Red-Dot Size)

At the right end of Header Row 2, to the right of the "Population:" pull-down, are a 10 pt gray "Axis Dots:" label, slider, and numeric field.

Component Specification
Slider Small control size, width 90 pt, minimum 0.1, maximum 1.5
Numeric Field Width 44 pt, right-aligned, editable
Step Snap and clamp in increments of 0.05 (displayed to two decimal places)
Default 0.5
Synchronization Slider and numeric field synchronize bidirectionally

What This Value Affects

In scatter plots, points stuck to exactly one of the left edge (X display coordinate ≤ 0) or bottom edge (Y display coordinate ≤ 0) are drawn as red circles. Their radius is

r = max(1.0, axis-dot value × √(number of points overlapping the same pixel))

Increasing the value makes highly overlapping points on an axis appear larger.

Saving and Scope

  • Changing the value distributes it to every cell in that window and redraws immediately.
  • The value is treated as a global application setting and is saved/restored in the workspace file (.faws) as the global setting extras["compAxisRedScale"].
  • However, the value held by an editor window is a copy of the global value from the moment that window was opened. A change is written back to the global value, but only the current window's cells are redrawn; other Compensation editor windows that are already open are not updated immediately.

3.7 Resetting — Difference Between the Two Buttons

Header Row 1 contains two reset buttons with completely different behavior. Note especially that their scopes differ.

3.7.1 "Restore FCS Defaults"

Behavior

  1. Push the current matrix onto the undo stack (the redo stack is cleared).
  2. Restore the matrix to the FCS-default $SPILLOVER captured when this editor window was opened.
  3. Commit the change to only the one file currently being edited.

Scope: This file only. Other files' compensation matrices are not changed. This is intentionally asymmetric with "Reset All to 0" and "↩ Undo," which propagate to all files, so do not confuse these operations.

This button has no tooltip.

3.7.2 "Reset All to 0"

Tooltip: "Reset all values except diagonal components (100%) to 0%"

Behavior

  1. Push the current matrix onto the undo stack.
  2. Replace the matrix with an N × N identity matrix (diagonal = 1.0, all other elements = 0.0).
  3. Propagate and commit to all files.
3.7.3 Comparison of the Two Reset Functions
"Restore FCS Defaults" "Reset All to 0"
Reset Target FCS-default $SPILLOVER captured when the window opened Identity matrix (diagonal 100%, all others 0%)
Scope Current file only All loaded files
Undoable with ⌘Z Yes Yes
Tooltip None Yes

3.8 Undo (⌘Z) and Redo (⇧⌘Z)
3.8.1 How to Use
Operation Method
Undo "↩ Undo" in Header Row 1, or ⌘Z, or Edit > "Undo"
Redo ⇧⌘Z, or Edit > "Redo"

The "↩ Undo" button tooltip is "Undo the last change (⌘Z)." When a Compensation editor is frontmost, the Edit menu's Undo/Redo commands are routed to the editor's compensation history.

Difference in the Windows version: The same button's tooltip reads "Undo the last change (Ctrl+Z)."

3.8.2 What Can Be Undone (Six Paths That Push History)

Only the following six operations are added to the undo history.

# Operation Snapshot Granularity
1 Dragging a scatter-plot cell Once when direction is determined (= one per drag)
2 Dragging a footer slider Once at drag start (= one per drag)
3 Editing a footer numeric field Fixed 500 ms deduplication from the first edit (small continuous edits are grouped into one)
4 "Restore FCS Defaults" Once per press
5 "Reset All to 0" Once per press
6 JSON import with "📂 Load" Once per load
3.8.3 History Limit and Redo
Item Specification
History Limit 30 levels; older entries are discarded when exceeded
When a New Change Is Pushed The entire redo history is cleared
Undo Behavior Pop one matrix from undo history, push the current matrix immediately before it onto redo history, then apply the popped matrix
When History Is Empty Nothing happens. The button itself is not grayed out.
3.8.4 Scope of Undo (Easy to Misunderstand)

Undo with "↩ Undo" / ⌘Z does not restore only the current file; it propagates through the same path as a commit and therefore updates all files. In other words, the matrix after undo is copied again to all loaded files by matching channel names.

By contrast, only "Restore FCS Defaults" applies to a single file. The combinations are therefore as follows.

Operation Propagation Scope
Commit scatter-plot drag (mouse up) All files
Commit slider (mouse up) All files
Commit numeric field (Enter / focus out / ↑↓ key) All files
"Reset All to 0" All files
"↩ Undo" / ⌘Z / ⇧⌘Z All files
"📂 Load" All files
"Restore FCS Defaults" Current file only

3.9 What Happens When Changes Are Propagated to All Files
3.9.1 Copying by Matching Channel Names

Propagation to all files performs the following processing.

  1. Mark the workspace as changed (unsaved). Compensation changes are treated as saveable changes even if the layout itself was not modified.
  2. Apply the new compensation matrix to the file being edited.
  3. Then, for every other file, use that file's own $SPILLOVER channel names (uppercased) as an index and copy only components whose names match the source matrix's row and column names.

Because of this method:

  • Files with different matrix sizes or channel orders retain the shape of their own matrix.
  • Rows and columns whose names do not match retain their existing values.
3.9.2 What Is Updated After Propagation

Each file receives the new compensation matrix, increments its data version by one, enables compensation use, is re-registered with the data store, and is recompensated in the background.

Screen updates are batched into a single notification at the end, which performs the following actions.

  • Notify the file list to update
  • Traverse all layout tabs, including those not currently visible, and invalidate GPU caches for plot items that reference affected files
  • Redraw Graph windows
  • Rebuild the currently displayed layout

A single-file commit from "Restore FCS Defaults" similarly increments the data version, re-registers the file, and recompensates it in the background, then issues a compensation-change notification limited to that file (invalidate relevant plot GPU caches + redraw Graph windows/layout).

3.9.3 What Is Not Updated by Propagation (Other Open Editor Windows)

A Compensation editor does not automatically follow compensation changes made externally. If a file's matrix changes in another Compensation editor window or by toggling "Auto Compensation," the matrix displayed in an already-open editor is not updated. To reflect the latest state, reselect that file in the "File:" pull-down so the editor is rebuilt.


3.10 Exporting and Importing Matrices
3.10.1 "💾 Save" (Export Matrix JSON)

Tooltip: "Export matrix to a JSON file (including $CYT/$CYTSN/$PnV)"

("(.json)" is intentionally omitted from the button label; the tooltip indicates that the format is JSON.)

Procedure and Result

  1. When the button is pressed, the current matrix is first saved simultaneously as a preset under the instrument-fingerprint key (see 3.11.2). This always happens before exporting the file.
  2. A save dialog then opens. The initial file name is "compensation_matrix.json," the allowed extension is json, and the initial directory is the application's default save location.
  3. On successful save, the status row reads "Matrix saved (also updated preset)."
Situation Display
Success Status: "Matrix saved (also updated preset)"
Export Failed Alert: "Save Error: <details>"
Target matrix unavailable Alert: "No matrix available"

Contents of the Exported JSON

Item Contents
savedAt Export time (ISO 8601 format)
cyt $CYT (instrument model)
cytsn $CYTSN (serial number)
pnvs Dictionary of $PnV values (for example {"$P1V": …})
spillover Array of channel names (names) and matrix (mat)

The file is pretty-printed with indentation, and keys are written in name order.

3.10.2 "📂 Load" (Import Matrix JSON)

Tooltip: "Load matrix from a saved JSON file"

Procedure

  1. Click the button and select one JSON file in the Open dialog (json only; no multiple selection; no directory selection).
  2. If the file is not in the correct format or the channel-name list or matrix is empty, an "Invalid matrix file" alert appears and loading stops.
  3. If the channel count in the file differs from the current file, a confirmation alert appears.
Dialog Contents
Message "Channel counts differ (file: N, current: M). Load by matching channel names?"
"Load" Continue loading by matching channel names
"Cancel" Stop without doing anything
  1. If loading continues, one undo snapshot is pushed, then current channel names and loaded channel names are matched case-insensitively by uppercasing, and only matching components are assigned into the current matrix. Unmatched rows and columns retain their current values.
  2. The result is then propagated to all files, committed, and the grid is redrawn.

Result Display

The status row reads "Matrix loaded." If the saved date in the file can be interpreted as ISO 8601, it appends " (Saved: <date/time in Japanese locale format>)."


3.11 Presets

A preset stores a compensation matrix linked to an instrument fingerprint (model name, serial number, and parameter configuration). The next time an FCS file from the same instrument is loaded, the preset is applied automatically when all conditions are met (see 3.12).

3.11.1 "📌 Save Preset"

Tooltip: "Save current matrix as a setting (automatically applied next time an FCS file from the same instrument is loaded)"

Situation Result
File has no $SPILLOVER Nothing happens
$SPILLOVER is present A preset is saved under the instrument-fingerprint key, and the status row reads "Saved as preset (automatically applied next time an FCS file from the same instrument is loaded)."

This button does not export a file. To save a file as well, use "💾 Save"; "💾 Save" also saves the preset at the same time.

3.11.2 Instrument Fingerprint — How a Preset Is Linked to an Instrument

Preset saving, automatic application, listing, and deletion all use the same "instrument-fingerprint key." It is not shown in the UI, but understanding it makes the behavior easier to follow.

Item Contents
How the Key Is Built Prefix fca_comp_ + a Base64 encoding of key-sorted JSON {"cyt": $CYT, "cytsn": $CYTSN, "pnvArr": [$P1V, $P2V, …]}
Retrieving $CYT / $CYTSN / $PnV Leading and trailing whitespace is trimmed and the values are retained when the FCS file is loaded
$PnV Order Collected in numeric order from $P1V and stops at the first missing number. Parameter count is taken from $PAR, or 100 if unavailable.
Storage Location (macOS) Application preferences (UserDefaults)
Safety Guard Only keys with the prefix fca_comp_ are listed or deleted. Unrelated preferences are never enumerated or removed.

Difference in the Windows version: Presets are stored at %LOCALAPPDATA%\NeoFlow\comp_presets\*.json, and the key is the preset JSON file's absolute path. Formatting and ordering of list contents use the same implementation as macOS and therefore match across both operating systems.

3.11.3 "🗂 Preset List"

Tooltip: "Show saved presets (instrument model, serial number, save date, parameter types / select to delete)"

Clicking opens a separate window titled "Compensation Preset List."

Item Specification
Number That Can Be Open Simultaneously One only. If already open, its contents are reloaded and the window is brought to the front.
Window Title bar; closable and resizable; initial size 860 × 420; centered on screen
After Closing The window object is retained inside the app rather than immediately discarded. When reopened after being closed, a new window is created.

Top Bar and Table

The top bar contains three buttons—"Select All," "Clear Selection," and "Delete Selected"—plus a status string. "Delete Selected" uses red text and is disabled (grayed out and not clickable) while no rows are checked.

The table has alternating row backgrounds, does not allow multi-row selection, and uses a row height of 20.

Column Width (Default / Minimum) Contents
Checkbox 24 / 24 Selects the preset for deletion
Instrument Model 180 / 80 $CYT; "-" if empty
Serial Number 150 / 80 $CYTSN; "-" if empty
Saved Date 160 / 100 "y/M/d H:mm:ss" in Japanese locale format; "-" if unavailable
Parameter Types 320 / 120 Displayed as "N types: ch1, ch2, …"
  • Rows are ordered by newest saved date first. Rows without a date are placed last; ties are stably ordered by instrument model → serial number → internal key.
  • Each cell truncates overflowing text at the end and shows the full untruncated string in a tooltip.
  • The status string reads "No saved presets." when there are 0 entries; otherwise it reads "Total N / Selected M."
  • Deletion targets are determined only by the checkboxes inside cells. Clicking or double-clicking a table row has no assigned action and does not change its checkbox.
Button Action
"Select All" Check every row
"Clear Selection" Clear all checkboxes
"Delete Selected" Delete checked rows (3.11.4)
3.11.4 Deleting Presets
  1. Check one or more rows in the list. When none are checked, "Delete Selected" is grayed out and does nothing.
  2. Click "Delete Selected" to display a warning alert.
Dialog Contents
Message "Delete the selected N presets?"
Additional Text "This action cannot be undone."
"Delete" Delete the selected presets
"Cancel" Close without doing anything
  1. If "Delete" is chosen, only keys with the prefix fca_comp_ are removed. After deletion, all checkboxes are cleared and the list is reloaded.
  2. The number actually deleted is shown in both the list-window status and the editor's status row as "Deleted N presets."

This deletion cannot be undone and is not part of the Compensation editor's ⌘Z history.


3.12 Auto Compensation
3.12.1 Checkbox

Location: On the right side of the Workspace toolbar, after the spacer and immediately before the application-status text, separator, and status display. The label is "Auto Compensation" (11 pt).

Item Contents
Default ON
Saving Not saved in the workspace file (.faws). It returns to ON every time the app starts.
While Layout Screen Is Displayed Hidden together with the application-status text, separator, and status display
3.12.2 Behavior When Turned ON and Conditions for Automatic Application

When turned ON, NeoFlow searches all loaded files for saved presets whose instrument fingerprints ($CYT / $CYTSN / $PnV) match. Even if a preset is found, its matrix replaces the current matrix only when the following condition is satisfied.

The preset's channel-name sequence and the current file's channel-name sequence must match completely in both count and order, using uppercase comparison.

When this condition is met, the compensation matrix is replaced. If that file's FCS-default matrix has not yet been recorded, it is recorded before replacement so it can be restored when Auto Compensation is turned OFF.

The same automatic-application process runs when a new FCS file is loaded.

Difference from "📂 Load"

"📂 Load" (manual) Auto Compensation
Matching Condition Copy only components with matching channel names; differing counts/order are allowed Replace the entire matrix only when both channel count and order match exactly
Unmatched Rows/Columns Remain unchanged (No application occurs at all)
3.12.3 Behavior When Turned OFF

When turned OFF, every file for which an FCS-default matrix has been recorded is restored to that FCS-default matrix.

Whether turning ON or OFF, affected files are re-registered with the data store, recompensated in the background, and then a file-list update notification is issued.

An already-open Compensation editor window does not automatically follow changes made by this toggle (see 3.9.3).

3.12.4 Application-Status Text

Immediately to the right of the "Auto Compensation" checkbox, the current application status appears in green 10 pt text. The target is the file currently selected in the left tree.

Condition Display
Auto Compensation is ON, $SPILLOVER exists, an instrument-fingerprint key can be created, but there is no saved data for that key "(No saved data)"
Same conditions, and saved data exists for the key "Applied: " + saved date/time in Japanese locale format "y/M/d H:mm:ss" + " Saved"
Auto Compensation is OFF Blank
No target file / saved data is corrupted Blank

This display updates when the tree reloads, when the tree selection changes, and when Auto Compensation is toggled.


3.13 Preview Calculation and Window Behavior
3.13.1 Data Used for Preview

Scatter-plot values are calculated when the editor opens and when "File:" or "Population:" is changed.

Item Contents
FCS Parsing Performed asynchronously; the status row shows "Loading FCS..." during processing
Population Size Maximum 2500 events; larger populations are reduced by evenly spaced sampling
Compensation Calculation The submatrix for target channels is inverted once and reused. Singular columns that cannot be solved by the Gauss-Jordan method are skipped.
Data Used for Gate Testing Data in the committed compensation state (not uncompensated preview data)

When Channel Names Cannot Be Matched

For a file in which fewer than two pairs can be matched between $SPILLOVER matrix names and actual channel names, the bulk calculation used for initial rendering returns empty, so no points are drawn in any cell; uncompensated raw values are not substituted. By contrast, in the path that retrieves channels one at a time, if fewer than two pairs match or the target channel is absent from the mapping, the uncompensated raw value is returned unchanged.

3.13.2 Relationship Between a Compensation Editor and Its Workspace

When multiple workspaces are open, a Compensation editor is bound to the workspace that was frontmost when the button was pressed. Every operation in the editor—file list, gate list, propagation targets, preset saving, and so forth—is performed against that bound workspace. Closing the editor window releases the binding.


Chapter 4 Layout (1): Placing and Configuring Plots

The Layout screen is used to arrange analyzed plots on pages and finish figures for publication. This chapter covers ways to place plots in a layout; selecting, moving, and resizing placed plot tiles; every item in the Plot Settings panel; editing labels on plots; histogram overlays; copying formatting; batch reports; decomposing plots; and gate styles.


4.1 Layout Screen and Terminology
Opening the Layout Screen

Clicking the "⤴" button at the right end of a Graph window toolbar adds one plot to the currently active layout, then automatically switches to the Layout screen. If the Layout screen is already open, you can also drag directly from the Workspace list or a Graph window onto the layout page (see 4.2).

Page and Grid Snap

Plot tiles and annotations are placed on the page. The page has a grid-snap setting, off by default. When grid snap is enabled, a tile's landing position is rounded to the grid during dragging. Holding Option while dragging temporarily disables grid snap for that operation.

Toolbar

The main toolbar elements relevant to this chapter are as follows.

Element Position Purpose Reference
"Batch:" group/direction pull-downs, "Columns" pull-down, "Batch" button Toolbar Row 1 (to the right of layout name) Generate reports in bulk 4.9
Line-width field (numeric input + ▼ presets) Toolbar Thickness of plot borders and tick lines 4.6
Font-size field (numeric input + ▼ presets) Toolbar Font for selected labels, or plot tick-number font 4.6
Ungroup icon button Toolbar Ungroup objects and decompose plots 4.10
"Bring to Front" / "Send to Back" Toolbar Change stacking order, including plot tiles 4.3
Floating Panels

The following floating panels are used in Layout.

Panel How to Open Contents
Plot Settings Double-click a plot tile, or right-click > "Plot Settings" Drawing settings for one plot, or all currently selected plots
Legend ("Histogram Legend" / "Plot Legend") Click a tile containing two or more overlay series (shown automatically) Series order, color, line width, fill opacity, deletion
Gate Style Right-click plot tile > "Gate Style" > gate name Color and line width of gate lines drawn in that plot
Adjustment Panel Annotation inspector. Automatically switches to plot-item mode when a plot tile is selected. Numeric X/Y and W/H settings plus "Gloss"

4.2 Placing Plots in a Layout

There are three ways to place a plot in a layout.

  1. Click the "⤴" button in a Graph window
  2. Drag from the "⤴" button in a Graph window onto the layout page
  3. Drag a row from the Workspace file list or gate tree on the left onto the layout page

With any path, if an existing plot tile is at the drop location and the conditions match, the plot is added as an overlay series to that tile instead of creating a new tile (4.2.5).

4.2.1 Transfer to Layout by Clicking the "⤴" Button

The "⤴" button is an independent 30×23 px button at the right end of the Graph window toolbar, filled with the accent color and drawn with a corner radius of 4. Its tooltip is "Add this plot to layout (click = current layout / drag = any position in layout)."

Clicking it adds one plot tile to the currently active layout, then automatically switches to the Layout screen. The added tile has the following settings.

Item Value on Click Transfer
Position For n existing tiles, column = n mod 3 and row = n ÷ 3; X = 12 + column×(width+12), Y = 12 + row×(height+20)
Tile Dimensions Value of the toolbar "Size" pull-down (Large = 230×240 / Medium = 180×190 / Small = 140×150)
Graph Type Current value of the Graph window "Type" pull-down
X-/Y-Axis Channels Current values of the Graph window X/Y pull-downs
Population Population in the Graph window
Resolution Fixed at 256 (the Graph window "Resolution" pull-down is not used)
Background Opaque
Stacking Order z = 1
Output Resolution (dpi) 300 if the "H" toggle is ON; 96 if OFF
4.2.2 Dragging the "⤴" Button to Place at Any Position

Holding the "⤴" button and moving more than 3 px starts a drag. The drag carries the completed Graph-window plot configuration (file, population, X axis, Y axis, graph type, resolution, output resolution). Dropping on the layout page creates a new tile centered on the drop point. Axes are not resolved again; the Graph-window settings are used as-is.

If released within 3 px of the press point, the action is treated as a normal click rather than a drag (= "Add to current layout" in 4.2.1).

A new tile created by drag-and-drop has fixed dimensions of 230×230; the "Size" pull-down is not used.

4.2.3 Upper Graph-Window Controls That Affect Transfer

Three controls in the upper row of the Graph-window toolbar affect transfer to Layout.

Control Type Choices Default Effect
Size Pull-down (width 46 px, right end of upper toolbar row) Large / Medium / Small Large Tile dimensions for "⤴" click transfer. Large = 230×240, Medium = 180×190, Small = 140×150. Tooltip: "Plot size when adding to layout"
Resolution Pull-down (width 62 px) 64 channels / 128 channels / 256 channels / 512 channels / 1024 channels 128 channels Tile resolution for "⤴" drag transfer. Tooltip: "Resolution"
H Toggle button ON/OFF OFF When ON, sets the output resolution of tiles added to the layout to 300 dpi (96 dpi when OFF). Applies to both click and drag transfer. Tooltip: "Add to Layout at high resolution (300 dpi)"

"Size" affects only click transfer, "Resolution" only drag transfer, and "H" affects both. Note the asymmetry: click transfer fixes resolution at 256, whereas drag transfer fixes tile dimensions at 230×230.

4.2.4 Dragging and Dropping Workspace File/Gate Rows

Rows from the Workspace file list or gate tree on the left can be dragged onto the layout page. A new plot tile is created centered on the drop point.

Item Value
Tile Dimensions Fixed at 230×230
Position X = drop X − 115, Y = drop Y − 115 (negative values are clamped to 0)
Resolution 128 (default)
Output Resolution 96 dpi (default)

Axes (X/Y channels and graph type) are resolved in the following order.

  1. If a Graph window is displaying that file/population, use the live axis settings from that window.
  2. Otherwise, use the last axis settings recorded on that gate.
  3. If none exist, walk upward through parent gates and repeat the same check.
  4. If no settings are found by the root, use default axes: X = FSC-A → FSC-H if absent → second channel if absent; Y = SSC-A → SSC-H if absent → third channel (or the last channel if there are too few). The graph type is Pseudocolor.
4.2.5 Dropping onto an Existing Tile Creates an Overlay

If an existing plot tile is at the drop point and its overlay category matches the dropped configuration, the series is added to that tile instead of creating a new tile. When merging occurs, the target tile's Legend panel is displayed.

Graph Type Overlay Category Merge
Histogram hist Can merge with another hist
Pseudocolor/Dot plot points pseudo and dot can merge with each other
Density None Cannot merge
Contour None Cannot merge

4.3 Selecting, Moving, and Resizing Plot Tiles
4.3.1 Selection
Operation Result
Click without modifier Replace selection (clear previous selection and select only that tile)
Shift + click Add to selection
⌘ + click Toggle selection (remove if selected; add if not selected)
Click empty area without modifier Clear selection and close the Legend panel
Drag empty area Marquee selection

Where a plot and annotation overlap, whichever is frontmost in the unified stacking order is selected. Immediately after selecting a tile, if it contains multiple overlay series, the Legend panel is shown automatically.

4.3.2 Dragging to Move

Drag the body of a selected plot tile to move it.

  • Nothing occurs until screen movement exceeds 4 px (the sum of the absolute horizontal and vertical movement multiplied by display scale). At that point, exactly one Undo snapshot is pushed.
  • The entire selection (plot tiles and annotations) moves, not just the tile grabbed. Movement is based on a snapshot taken at drag start.
  • While Shift is held, movement is constrained to the axis with the larger displacement, locking it horizontally or vertically.
  • If grid snap is enabled, the landing position is rounded to the grid; holding Option temporarily disables snapping.
  • A tooltip showing movement distance is displayed during the move.
  • During dragging, only tile frames are repositioned; plot data are not recalculated, keeping movement responsive even with many tiles.

When dragging ends, overlay-merging is evaluated (4.7.1).

4.3.3 Selection Frame and Handles

The selection frame is the outer rectangle formed by adding framePad to the plot surface. Handles appear at its eight points (nw / n / ne / e / se / s / sw / w). Handle hit areas remain a constant 11 px on screen regardless of zoom (±5.5 px from the center).

Plot tiles have no rotation handle. If the selection contains even one plot tile, the rotation handle for the selection as a whole is also disabled.

4.3.4 Handle Operations (Edges/Corners × Shift)
Handle Modifier What Changes Aspect Ratio Fixed Element
Corner (nw/ne/sw/se) None Actual plot size (position and dimensions) Always locked (even without Shift) Opposite corner remains fixed
Edge (n/s/w/e) None Actual plot size Free (also commits the tile to "free aspect ratio") Opposite edge remains fixed
Edge (n/s/w/e) Shift Only the corresponding one side of framePad Actual plot size does not change at all
Corner (nw/ne/sw/se) Shift All four framePad sides (recalculated while preserving outer-frame ratio) Outer-frame aspect ratio locked Actual plot size does not change. The two padding sides opposite the grabbed corner also remain unchanged.

Annotation objects lock aspect ratio only while Shift is held, whereas plot items always lock aspect ratio when a corner handle is used.

Corner Handle (No Modifier) The opposite corner remains fixed, and the original aspect ratio is preserved according to whichever of the relative width/height changes is larger. Minimum size is 4 px. During dragging, the frame and point cloud are cheaply reprojected; a full redraw occurs on mouse release.

Edge Handle (No Modifier) Changing the actual plot size also commits that tile to "free aspect ratio." While in free-aspect mode, the graph itself is drawn not as the traditional centered square, but across the full non-square tile area after subtracting margins (left 60 / right 10 / top 8 / bottom 52). The cursor is the normal resize cursor.

4.3.5 Numeric Settings and "Gloss" in the Adjustment Panel

When a plot tile is selected, the annotation Adjustment panel switches to plot-item mode. In this mode, rows for line color, fill, line width, opacity, and rotation are hidden, and the following are shown instead.

Row Contents Effect
X/Y Numeric fields On commit, moves the entire selection
W/H Numeric fields On commit, changes the tile's actual size
Gloss Enable checkbox + color well (34×20) + "Radius" size field (40 px) + "Opacity" field (40 px) Applied in bulk to all selected plot items. Default "Radius" = 3 pt, default "Opacity" = 100

Gloss changes push Undo only once per operation session.

4.3.6 Bring to Front / Send to Back (Unified Z-Order)

Toolbar commands "Bring to Front" and "Send to Back" also apply to plot items. Because they reorder items and renumber the unified stacking order, they change both which object is selected and which is drawn on top where plots and annotations overlap.


4.4 Adjusting Frame Padding (framePad)

Frame padding is space reserved outside the plot surface. It is independent of the plot's actual X/Y/W/H and is used for:

  • Selection-frame size
  • Bounds for Special Copy and selection-range export
  • Cell dimensions in batch reports
4.4.1 Shift + Edge Handle = Adjust One Side Only

Holding Shift while dragging an edge handle of a selected plot tile changes only that side of framePad without changing the actual plot size.

  • Any unset side is filled with defaults at drag start (left = 29, top = 0, right = 0, bottom = 45).
  • Thereafter, "start value + cumulative movement" is applied as an absolute value every frame: top = start − vertical movement; bottom = start + vertical movement; left = start − horizontal movement; right = start + horizontal movement.
  • No side can become less than 0.
  • No plot recalculation occurs; only the selection frame is updated.
4.4.2 Shift + Corner Handle = Adjust While Preserving Ratio

Holding Shift while dragging a corner handle leaves the actual plot size unchanged and applies "opposite corner fixed + aspect ratio locked" resizing to the outer rectangle including framePad. The four padding values are recalculated absolutely from the difference between the resulting rectangle and the plot rectangle (left = plot left − outer left; top = plot top − outer top; right = outer right − plot right; bottom = outer bottom − plot bottom; each clamped at 0). The two padding sides opposite the grabbed corner always remain unchanged.


4.5 Plot Settings Panel
4.5.1 Opening the Panel, Scope, and Undo

Open the panel by double-clicking a plot tile or right-clicking a plot tile > "Plot Settings". It opens centered on screen as a modeless window with a title bar and close button, not resizable. Content width is 280 pt and the scroll area is 296×560 pt.

Situation Scope Window Title
Multiple items are selected and the right-clicked/double-clicked target is included in the selection Apply to all selected plot items "Plot Settings (N items)"
Otherwise Only that one tile "Plot Settings"

Control changes are applied immediately to the target tiles and redrawn. Undo is not pushed when the panel opens; exactly one snapshot is pushed when the first actual change occurs, and further changes in the same session do not push additional snapshots.

When applying changes to multiple plots, channels are re-resolved by channel name to each file's index, and gates by gate name to each file's gate.

4.5.2 Complete Control List
Item Type Choices / Range Default Effect Display Condition
Population Pull-down (width 250 pt, first row) ungated (all cells) / all gate names in that file Current population of that plot (ungated if unset) Change plot population Always
X Axis Pull-down All channel names in the file (index order, raw names) Current X axis of the plot (first channel if unset) Change X-axis channel Always
Y Axis Pull-down All channel names in the file Current Y axis of the plot (first channel if unset) Change Y-axis channel Always (disabled when graph type is Histogram)
Graph Type Pull-down Pseudocolor/Dot plot/Contour/Density/Histogram Pseudocolor Change rendering type Always
Resolution Pull-down 64 channels / 128 channels / 256 channels / 512 channels / 1024 channels 128 channels Binning resolution Always
Show tick number labels Checkbox ON / OFF ON Show/hide the axis tick number labels (the tick marks themselves stay) Always
Show minor ticks (Log/Biex axis) Checkbox ON / OFF OFF Add minor tick marks between the major ticks Only when the X axis or Y axis is Log or Biex
Color Scheme Pull-down Grayscale / Color Grayscale Density color scheme Only when graph type is Density
Color Scheme Pull-down Grayscale (with dots) / Grayscale (no dots) / Color (with dots) / Color (no dots) Grayscale (with dots) Combination of color scheme and outlier-dot display Only when graph type is Contour
Number of Contours Slider + numeric field (width 52 pt, bordered) 2–12 (step 1) 6 Number of contour levels Only when graph type is Contour
Contrast Slider + numeric field 0.15–1 (step 0.01; displayed to two decimals) 0.42 Gamma of density colors Only when graph type is Pseudocolor or Density
Cell Count Normalization Checkbox ON/OFF OFF Normalize color differences caused by cell count (full explanation shown in the checkbox's tooltip) Only when graph type is Pseudocolor or Density
Height Normalization Pull-down Maximum (global) / Maximum (each series) / Area Maximum (global) Normalization method for overlay histograms Only when graph type is Histogram and there are at least two series
Height Adjustment (%) Slider + numeric field 20–200% (internal 0.2–2, step 0.05; displayed as integer percent) 85% (internal 0.85) Histogram height multiplier Only when graph type is Histogram
Smooth Checkbox ON/OFF ON Smooth histogram Only when graph type is Histogram
Smooth Amount Slider + numeric field 1–20 (step 1) 1 Moving-average radius; window width = 2×amount+1 Only when graph type is Histogram
Statistics Display (% of all cells in the plot) Section label (11 pt, secondary-label color) Header for the following statistics checkboxes and MFI Axis Always (regardless of graph type)
Show % Checkbox ON/OFF OFF Add one line to each gate statistics box showing % of parent population Always
Show MFI Checkbox ON/OFF OFF Add one MFI line (implementation uses median) Always
Median Checkbox ON/OFF OFF Add one Median line Always
Geo Mean Checkbox ON/OFF OFF Add one geometric-mean line Always
Mode Checkbox ON/OFF OFF Add one Mode line Always
Statistics Values Only Checkbox ON/OFF See the explanation below the table Display statistics rows as values only Always
Gate Names Checkbox ON/OFF OFF Show name labels for each gate drawn in the plot Always
Axis Name Checkbox ON/OFF ON Show the plot's X-axis and Y-axis name labels Always
File Name Checkbox ON/OFF ON Show the file-name label below the plot Always
Shorten File Name Checkbox ON/OFF ON Shorten the file-name label below the plot Always
MFI Axis Pull-down (bottom row) X-axis channel name / Y-axis channel name (displayed without trailing "-A") X axis Choose the channel used to calculate statistics Always

"Median," "Geo Mean," "Mode," and the five graph types (Pseudocolor / Dot plot / Contour / Density / Histogram) remain in English even in a Japanese environment.

4.5.3 Details of Population, X Axis, Y Axis, and Graph Type

Population The first item has an empty value and means "ungated (all cells)." Subsequent items list all gate names in that file's gate order. Selecting one makes each target tile search its own file for a gate with the same name and sets it as the population; if not found, the population becomes unset. For tiles with series, populations of series from the same file are updated simultaneously.

X Axis / Y Axis Choices are all channel names in the file, in index order using raw names including suffixes such as "-A." When applying to multiple plots, each file's index is re-resolved by the selected channel name; if that name is not found, the selected index itself is used. The Y Axis control is disabled for Histogram and changes enabled/disabled state immediately when graph type changes.

Graph Type When graph type changes, overlay series are discarded if the overlay category (hist / points / other) changes. Series are retained for changes within the same category, such as Pseudocolor ↔ Dot plot. After a change, the entire panel is rebuilt so type-dependent sections such as gamma, histogram, and contour controls appear appropriately.

Show tick number labels / Show minor ticks (Log/Biex axis) Turning off "Show tick number labels" removes only the axis tick number labels (e.g. 10², 10³ or 100, 200); the tick marks themselves remain. Default is on.

"Show minor ticks (Log/Biex axis)" adds minor tick marks between the major ticks. This setting only appears when the X axis or Y axis uses a Log or Biex transform, since a Linear axis has no notion of minor ticks. Minor ticks are half the thickness and half the length of a major tick, except the "5×" position within each decade (e.g. the 5 among 2,3,4,5,6,7,8,9), which is half the thickness and 75% the length. Default is off. On a Biex axis, minor ticks are only generated for the positive-side decades.

4.5.4 Details of Type-Dependent Sections

Color Scheme (Density) Choose "Grayscale" or "Color." Default is Grayscale.

Difference in the Windows version: Windows provides the same setting as a checkbox, "Color display (off = grayscale)," rather than a pull-down.

Color Scheme (Contour) This combines color scheme (grayscale/color) and outlier-dot visibility into one pull-down. The selected value is decomposed into color scheme and whether outliers are shown as dots. Default is "Grayscale (with dots)."

Difference in the Windows version: Windows separates this into two independent checkboxes: "Color display (off = grayscale)" and "Show outliers as dots."

Number of Contours Range 2–12, step 1, default 6. Slider changes apply continuously while dragging. When a value is typed directly into the numeric field on the right (width 52 pt, bordered), it is rounded to the step and clamped to range on Enter or focus loss before being applied.

Contrast Gamma for density colors. Range 0.15–1, step 0.01, default 0.42. The numeric field displays two decimal places.

Cell Count Normalization When checked, plots with the same distribution use the same colors even if total event counts differ. Default is off.

Height Normalization This row appears only for overlay histograms containing at least two series; it is hidden entirely for one or zero series.

Choice Meaning
Maximum (Global) (default) Normalize using the maximum across all series
Maximum (Each Series) Normalize each series by its own maximum
Area Normalize by area

Height Adjustment (%) The internal multiplier ranges from 0.2–2 in steps of 0.05; the numeric field displays the value multiplied by 100 as an integer percent (20–200). Default is 85%.

Difference in the Windows version: The Windows panel displays a default of 100% when unset, differing from the macOS default of 85%.

Smooth / Smooth Amount "Smooth" enables/disables smoothing and defaults to on. "Smooth Amount" is the moving-average radius; actual window width is 2×amount+1. Range 1–20, step 1, default 1.

4.5.5 Statistics Display Section

The checkbox group and MFI Axis pull-down following the heading "Statistics Display (% of all cells in the plot)" are always shown regardless of graph type.

Checkbox Line Added When ON When Statistics Values Only Is ON Default
Show % One line in each gate statistics box showing % of the parent population. Below 1% uses two decimals; 1% or more uses one decimal; "%" is appended. OFF
Show MFI "MFI <channel name> <value>" (MFI is implemented as median) Value only OFF
Median "Median <channel name> <value>" Value only OFF
Geo Mean "GeoMean <channel name> <value>" Value only OFF
Mode "Mode <channel name> <value>" Value only OFF

Statistics Values Only When on, statistics rows contain only the value (for example, "1234"). When off, they include descriptive text such as "MFI FITC 1234." The default differs by creation path.

  • New plot tiles created in a layout: on
  • When loading an older saved file (.faws) that has no "Statistics Values Only" field: treated as no value and displayed as off in the panel

Gate Names When on, name labels are shown for each gate drawn in the plot. Labels are bold, use the gate color effective for that tile, and follow the statistics font size (default 9 pt). Default is off.

Axis Name When off, both the plot's X-axis and Y-axis name labels are hidden (tick marks and tick-number labels are unaffected). Default is on, and an unset value in an older saved file (.faws) is also treated as on. While off, the label does not exist, so it is also not a target for the double-click inline editing described in 4.6.3.

File Name When off, the file-name label below the plot is hidden. Default is on, and an unset value in an older saved file (.faws) is also treated as on. This setting is independent of "Shorten File Name" (which controls whether a shown label is abbreviated, not whether it is shown at all).

Shorten File Name When on (default), the file-name label below the plot removes the extension and keeps only the portion after the final "_". When off, only the extension is removed. An unset value is treated as on. When "File Name" is off, the file-name label is not shown regardless of this setting.

MFI Axis Chooses whether MFI/Median/GeoMean/Mode statistics are calculated on the X- or Y-axis channel. Choice labels are the X/Y channel names with a trailing "-A" removed. If the X channel cannot be resolved, the label is "X Axis"; if Y is unset, "Y Axis." Default is X. For Histogram, the X-axis channel is used even if MFI Axis is set to Y.


4.6 Labels, Fonts, and Line Widths on Plots
4.6.1 Selecting and Dragging Labels

The following labels drawn on a plot tile can be selected and moved individually.

  • X-axis name / Y-axis name
  • File name
  • Gate name (per gate)
  • Statistics box (per gate)

A click without Shift, ⌘, or Control selects a label. Existing object selection is cleared, and the label's four corners are marked with a pale-blue fill (rgba(100,160,255,0.20)) and blue border (#2f6fed, constant 1.5 px on screen regardless of zoom). The toolbar font-size field simultaneously shows that label's current font size.

Dragging then records the label position as an absolute position within the plot. Axis locking and grid snap do not apply to label movement. One Undo entry is pushed per drag.

Label hit testing occurs before tile-body and annotation hit testing because the label overlay is always frontmost.

4.6.2 Changing Label Font Size

While a label is selected, changes made in the toolbar font-size numeric field or its ▼ preset menu apply to that label.

Selected Label Applied Font Default Size
X-axis / Y-axis name Axis-name font 11pt
File name File-name font Follows the axis-name font (see below)
Gate name / Statistics box Statistics font 9pt

The first time the axis-name font is changed, if the file-name font is still unset, the file-name font is first fixed at the previous axis-name size (default 11), then only the axis-name font changes. Thus increasing axis-name size leaves the file name at its original size.

Every font-size change pushes an Undo entry. The ▼ menu provides presets, and direct numeric entry is also allowed.

6 / 8 / 9 / 10 / 11 / 12 / 14 / 16 / 18 / 20 / 24 / 28 / 32 / 36 / 40 / 44 / 48 / 54 / 60 / 66 / 72 / 80 / 88 / 96

4.6.3 Editing Axis Names

Double-click an X- or Y-axis label on a plot tile to display an in-place editing overlay (92% white background, 1 px #2f6fed border, Arial at the same pt size and color as the label) and edit it directly.

  • Editing preserves the displayed angle. The Y-axis label remains rotated −90° rather than becoming horizontal.
  • Enter, Escape, or losing focus all commit the edit; there is no cancel action.
  • Leading/trailing whitespace is trimmed on commit. If the result is empty, the label returns to its default text (channel name).
  • While editing, normal rendering of that label is removed, preventing duplicate display.

Double-click hit-test order is: axis-name label → annotation → plot tile (opens Plot Settings) → empty area (creates new text).

For X-axis-name edits, the Undo-recording check compares the new value against the Y-axis-name value, so Undo may not be pushed correctly for some X-axis-name changes.

4.6.4 Plot Border and Tick-Line Width

The line width field in the toolbar (numeric input + ▼ presets) is enabled when plot tiles are selected. Changing the value applies it to the border and tick-mark line widths of all selected plot tiles. An Undo entry is created only when there is a target. When a plot tile is selected, the line width field shows that tile's current value (or the default value of 1 if it is not set).

Preset choices: 0.5 / 1 / 1.5 / 2 / 3 / 4 / 6 / 8

4.6.5 Tick-label font size

When plot tiles are selected and neither a label nor a text annotation is selected, changing the font-size field in the toolbar applies to the tick-label font size (px) of all selected plot tiles. Values of 0 or less are ignored.

If not set, the tick-label font size is determined automatically from the tile size (8 multiplied by the shorter side of the tile divided by 126, capped at 1; the result is rounded to one decimal place with a minimum of 5).


4.7 Histogram/plot overlays and series editing
4.7.1 Combining tiles by dragging

Dropping a plot tile on top of another tile in a layout combines their series. The check is performed at the end of the drag, and only if the tile was actually moved.

  • For each selected tile, NeoFlow looks for a different, unselected tile in the same overlay category whose bounds contain the center point of the selected tile.
  • If one is found, the selected tile's series are added to that tile and the selected tile is deleted.
  • Selected tiles are not combined with one another.
  • After combining, the destination tiles are selected and the legend panel for the first tile opens.
  • Undo is consolidated into the single entry for the drag operation (the combining operation does not add a separate Undo entry).

The only combinations that can be merged are Histogram with Histogram and Pseudocolor/Dot plot with Pseudocolor/Dot plot. Density and Contour plots cannot be combined.

4.7.2 Option+drag to combine while keeping the source (copy-like behavior)

When dragging to combine tiles, if the Option key is held when the mouse button is released, the source tile is not deleted; instead, it returns to and remains at its position at the start of the drag (so the operation appears to create a copy). If no start-of-drag snapshot exists, the tile remains at its current position.

Difference from the Windows version: The Windows version provides the same function, using the Alt key instead of Option.

4.7.3 Legend panel ("Histogram Legend" / "Plot Legend")

Clicking a tile that has an overlay category and two or more series automatically displays the legend panel. Clicking any other tile closes it.

  • The panel is positioned automatically at a non-overlapping location in the following priority order: right → left → below → above the target tile. Drag the header margin to move the panel.
  • The header title is "Histogram Legend" for the hist category and "Plot Legend" for the points category (Pseudocolor/Dot plot).
  • Click ✕ at the upper right to close the panel. Closing it also ends the Undo session for series-style editing.
  • Each row is labeled "abbreviated file name / population name" (or "ungated" if no population is set), and the tooltip shows the full file name.

The columns depend on the category.

Category Columns
hist(Histogram) "Sample/Population" (130px) + "Line" + "Fill" + "Width" + "Opacity"
points(Pseudocolor/Dot plot) "Sample/Population" (130px) + "Color" (there are no "Fill," "Width," or "Opacity" columns)

The column-header tooltips are: "Line" = "Line Color," "Fill" = "Fill Color," "Width" = "Line Width," and "Opacity" = "Fill Opacity."

4.7.4 Changing series order (▲▼)

At the left edge of each row are two vertically stacked bordered buttons, each 16×13px.

Button Action Disabled for Tooltip
Bring Forward (swaps that series with the next series) Last row "Bring Forward (display above overlapping series)"
Send Backward (swaps that series with the previous series) First row "Send Backward (display below overlapping series)"

Each press creates one Undo entry, redraws the tile, and rebuilds the legend. Series order matches drawing order, with the first series at the back.

4.7.5 Deleting a series (✕)

Click ✕ at the right edge of a row to delete that series. If there is only one series, the button itself is not shown and the series cannot be deleted. Clicking it creates one Undo entry, redraws the tile, and rebuilds the legend.

4.7.6 Series line and fill colors

Clicking a color swatch in a row (22×16px, 3px corner radius, gray border) opens the color picker (44-color palette + HSB/RGB specification, with live preview), and the selected color is immediately applied as that series' line or fill color.

  • The points category (Pseudocolor/Dot plot) has no fill, so only the line-color swatch is shown; it controls the dot color.
  • The default color when no value is set is #2f6fed.
  • A newly added series is assigned a color from an eight-color palette (#2f6fed, #e8453c, #1aa06d, #f0a000, #9b59b6, #16a2b8, #e91e8c, #555555), using the remainder of the existing series count divided by 8 as the palette index.
  • Changes made during one legend session (including color dragging) are combined into a single Undo entry.

The swatch tooltips are "Line Color" for the line swatch and "Fill Color" for the fill swatch.

4.7.7 Series line width

For the hist category only, each row contains a numeric field (36px wide, right-aligned). The entered value is clamped to 0–6; if it cannot be interpreted as a number, it becomes 1.6. The default is 1.6. The tooltip is "Line Width."

The points category does not have this field because dot diameter is controlled only by a value shared by the entire tile.

4.7.8 Series fill opacity

For the hist category only, each row contains a slider (44px wide) and a numeric field (36px wide). The internal value ranges from 0 to 1 in steps of 0.05, while the numeric field displays the percentage multiplied by 100 (0–100). If no value is set, the slider initially appears at 0.2. When a series is actually created, the value is 0.22 when the source tile itself becomes a series during a merge, and 0.16 for an added series. The tooltip is "Fill Opacity."


4.8 Copying/pasting formatting
4.8.1 Copy Formatting

Right-click a plot tile and choose "Copy Formatting" (shown only when a plot item is right-clicked, and always enabled). Only the tile's display style is stored, and it can also be pasted into another Layout window.

The following settings are stored:

Graph type, resolution, axis-title font, statistics font, file-name font, tick-label font, border/tick-line width, show tick number labels, show minor ticks, histogram height multiplier, histogram height matching method, smoothing, smoothing amount, cell-count correction, intensity (gamma), color scheme, background opacity, MFI axis, MFI display, Geo Mean, Median, Mode, % display, gate name, statistics values only, axis name, file name, abbreviated file name, gloss, and the fill color, fill opacity, line color, and line width of each series.

The following are not stored: file, population, axis channels, position, size, and group.

4.8.2 Paste Formatting

Right-click a plot tile and choose "Paste Formatting." The command is disabled when the formatting clipboard is empty.

  • If multiple objects are selected and the right-clicked tile is part of that selection, the formatting is applied to all selected plots. Otherwise, it is applied only to the right-clicked tile (the same target-resolution rule used by the Plot Settings panel).
  • One Undo entry is created for each paste operation. If there are no applicable targets, that Undo entry is canceled.
  • Series styles are applied by series position (first to first, second to second, and so on). If the destination does not have a corresponding series, nothing is done; no new series is created.

4.9 Batch reports (Batch)

A set of controls in row 1 of the Layout Editor toolbar (to the right of the layout name) uses the plots in the current layout as templates to generate layouts for all samples in a group at once.

Control Type Choices Default Tooltip
"Batch:" Group Pull-down menu Workspace group names 「All Samples」 "Batch Target Group"
Direction Pull-down menu Horizontal / Vertical Horizontal "Arrangement Direction"
"Columns" Pull-down menu 1〜20 6 "Columns/Rows"
「Batch」 Button "Generate Batch"

The "Batch" button label itself is displayed in English.

How the template is determined

  1. If any plots are selected, only those plots are used as templates.
  2. If nothing is selected, all plots in the current layout are used as templates.
  3. If both are empty, NeoFlow synthesizes a single 170×182 Pseudocolor plot from the most recently selected target in the sidebar and uses it as the template.

Generated content

  • A new layout is created and named "Batch: <population name of the first template>."
  • For each sample, tiles are created by matching the template population by its name path.
  • Cell dimensions are the bounding rectangle of the frame rectangles of all templates plus a 5px gap. For each frame rectangle, NeoFlow uses the manually adjusted frame padding if available, otherwise the measured auto-fit frame, and otherwise the default values (left 29 / top 0 / right 0 / bottom 45).
  • For "Horizontal," columns = the specified value and rows = the sample count divided by that value, rounded up. For "Vertical," rows = the specified value and columns = the sample count divided by that value, rounded up.
  • After generation, the new layout is automatically fit so that the entire layout is visible on screen.

When the generated count is 0

The warning dialog "Batch Generation / Place template plots before running Batch." is displayed and no layout is generated. Close the dialog and place the template plots again.


4.10 Decomposing plots (Ungroup)

Run this command with the Ungroup icon button in the toolbar or the keyboard shortcut ⇧⌘U (⌘U alone also works). The button tooltip is "Ungroup (Shift+Cmd+U)."

The operation is divided into three cases according to the current selection.

Selection state Action
The selection contains a group Ungroup only. The objects are not redrawn; only the selection display is updated.
There is no group, but the selection contains plot tiles Decompose all selected tiles into editable vector annotations (one Undo entry for the entire operation).
Neither of the above Nothing happens.

Objects generated by decomposition

Original element Generated annotation
Data content (Histogram) Both single and overlaid histograms are vectorized into polygons for each series (if vectorization fails, a PNG image annotation is created).
Data content (scatter, density, pseudocolor, contour) PNG image annotation (z-order z=1)
Outer frame Rectangle (line color #333333, line width 1, no fill)
X-axis ticks Tick marks and numeric text (scientific notation expresses powers of 10 using superscript)
Y-axis ticks Generated for scatter plots
Outline of each gate rect/quad → rectangle, ellipse → ellipse, poly/freehand → polygon, range → rectangle, bisector → straight line. The color matches the gate display mode on screen (#000000 in black mode), and the line width is either the on-screen default of 1pt or the manually overridden value.
Axis titles, file name, statistics, gate names Text annotations

After decomposition is complete, the original plot tiles are deleted and the selection is cleared.


4.11 Gate styles
4.11.1 Gate Style submenu

Right-click a plot tile and choose "Gate Style," immediately below "Plot Settings." All gates drawn in that tile (including sibling gates of quad and bisector gates) are listed in a submenu. Selecting one opens the style panel for that gate. If a gate name is empty, the gate's id is used as the menu item name.

If there are no gates, or if the file or tile cannot be resolved, the menu item itself is disabled (it remains visible).

Previously, the style panel could be opened by directly clicking a gate line on the plot. Because this could open an unintended gate for quad/bisector gates, opening the panel was changed to the context-menu method and direct-click activation was removed.

4.11.2 Gate Style panel

This is a 220×130 floating panel over the layout view. It opens near the clicked position and is clamped to a 4px margin at the edges.

  • The header contains "Gate: <gate name>" (bold, 12pt) and an ✕ button. Drag the header to move the panel.
  • Left- or right-clicking outside the panel closes it. The click itself passes through to the underlying element.
  • There are no OK/Cancel buttons. Changes take effect immediately and are stored as an override for only that gate in that plot tile.
  • During a sequence of operations (one session), an Undo entry is created only for the first change.
  • An explanatory label, "Changes only gates in this plot" (10.5pt, secondary-label color), is always shown at the bottom of the panel.
Item Type Range Initial value Effect
"Color:" Color well (44×22px) Effective style color for the hit gate (determined in the order: override for this tile → gate's own color → default color) The selected color is stored as #rrggbb, becomes the color override for that gate in that tile, and the tile is redrawn.
"Line Width:" Slider (110px wide) + numeric field (40px wide) 0.5–8pt (step 0.1) Effective line width for that gate (manual override if present; otherwise the layout default of 1pt) Immediately applied to that tile's gate line

When the gate display mode is "Black" (default), gate lines are drawn in black on screen, so color changes are visually reflected only in color display mode.

4.11.3 Display Gates in Color

This is a checkable item in the "View" menu in the menu bar.

State Color of gate lines and gate names in layouts
OFF (default) All are drawn in black (#000000)
ON Drawn using each gate's color (override for that tile → gate's own color → default color)

This setting is saved and retained the next time the application is launched. Changing it immediately updates all open Layout windows. Graph windows in the workspace are not affected by this setting and always display gates in color.

The tooltip is: "When enabled, gate lines and gate names in layouts are displayed using each gate's color (legacy display). When disabled (default), all gates are displayed in black. This setting is retained the next time the application is launched."


Chapter 5 Layout (2): Editing, Menus, and Input/Output

This chapter comprehensively describes the commands available in the Layout screen. It covers every item in the menu bar, toolbar, and context menus; paper and view settings; drawing procedures; copy/paste; importing external files; and export to PNG/PDF/PPTX and printing.


5.1 Menu bar

The menu bar has five top-level menus: the application menu, File, Edit, View, and Window. The macOS version does not have a Help menu.

Difference from the Windows version: The Windows version has a "Help" menu containing "About NeoFlow."

In the NeoDraw build (the layout-only application), some items are absent or use different shortcuts. These differences are noted where applicable.

5.1.1 Application menu
Item Shortcut Action Enabled when
"About NeoFlow" None Opens the standard About panel. Always
"Quit NeoFlow" ⌘Q Quits the application. This item is placed below a separator. Always

In the NeoDraw build, these are displayed as "About NeoDraw" and "Quit NeoDraw," respectively.

Difference from the Windows version: The Windows version has no application menu. "About NeoFlow" is in the Help menu, and Exit appears at the end of the File menu as "Exit Alt+F4."

5.1.2 File menu
Item Shortcut Action Enabled when
"New Workspace" ⌘N Creates a new workspace document. NeoFlow build only (the item itself is absent in the NeoDraw build)
"New Layout" ⇧⌘N Opens a new Layout window. Always. In the NeoDraw build, the shortcut is ⌘N.
"Open…" ⌘O Opens a file-selection panel and opens a workspace/layout file. Always
"Open Recent" None Submenu listing recently opened/saved workspaces. Always (when there are no entries, it contains only a disabled item)
"Save" ⌘S If a save destination already exists, overwrites it without confirmation. If no destination has been set, asks for one only on the first save. Always
"Save As…" ⇧⌘S Always displays the save panel. Always
"Import FCS…" ⇧⌘I Allows multiple FCS files to be selected and imports them in one operation, including parsing, registration, and application of group templates. NeoFlow build only
"Place File in Layout…" ⇧⌘O Selects image/vector files and places them in the layout. Always
"Close Plot" ⌘W Closes only the frontmost Graph window. It does not close the entire window. NeoFlow build only
"Print…" ⌘P Converts all layouts to a multi-page PDF and prints them (same operation as "🖨 Print" in the toolbar). Always

Separators appear immediately before "Open…", "Place File in Layout…", and "Close Plot."

Details of "Open…"

  • The file-selection panel does not allow multiple selection or creation of folders. Its title is "Select Workspace / FlowJo .wsp" ("Select Layout File" in the NeoDraw build).
  • The application remembers the previously opened folder and starts there the next time.
  • Selectable extensions are neo / faws / wsp / jo (neo / faws only in the NeoDraw build).
  • After a file is opened, NeoFlow determines its type from the contents. .wsp / .jo files (FlowJo workspaces) are converted in the background before being loaded. If conversion fails, an alert titled "Workspace Conversion Error" displays the error details.
  • If the loaded content includes FCS files, only the Workspace window is shown; if it contains no FCS files, only the Layout window is shown.

Details of "Open Recent"

  • Up to 15 files are listed using their file names without extensions. Hovering over an item shows the full path in a tooltip.
  • When there are no entries, a disabled item "No Recent Files" is displayed.
  • A separator and "Clear Menu" appear at the end.
  • A file is registered in this list both when it is opened and when it is saved.
  • If you select a file that no longer exists, an alert titled "File Not Found" is displayed (body: "'<file name>' may have been deleted or moved."), and the file is removed from the list.

Difference between "Save" and "Save As…"

"Save" silently overwrites the existing destination if one has already been set, and asks for a destination only on the first save. "Save As…" always displays the save panel. This asymmetry is intentional.

Details of "Place File in Layout…"

  • The selection-panel title is "Select Files to Place in Layout." Multiple files can be selected, but folders cannot.
  • Selectable extensions are pdf / png / jpeg / jpg / gif / bmp / svg / webp / pptx.
  • If no Layout window is open, one is opened before the files are placed.
  • The base placement position is (40, 40). If multiple files are selected, each subsequent file is offset by 18 pixels (PDF and PPTX are exceptions; see section 5.8).
5.1.3 Edit menu
Item Shortcut Action Enabled when
"Undo" ⌘Z The target depends on the frontmost window. If the Compensation Editor window is frontmost, it undoes the Compensation Editor; for a Layout window, it undoes the layout; otherwise, it undoes the workspace (gate operation). Disabled while editing text. As an exception, it is always enabled while the Compensation Editor window is frontmost.
"Redo" ⇧⌘Z Redoes using exactly the same routing as "Undo." Same as above
"Copy" ⌘C While editing text (numeric field or rich text), forwards the command to Copy in that input field. Otherwise, duplicates the selected objects to the internal clipboard and simultaneously writes them to the system clipboard. Always
"Copy as SVG" ⇧⌘C Exports the selection as vector SVG and places it on the clipboard. Always (a beep sounds if the operation fails)
"Copy as PNG" None Renders the selected area at 300 dpi (default) and writes both PNG and TIFF formats to the clipboard. Always
"Cut" ⌘X While editing text, forwards the command to Cut in the input field. Otherwise, copies and then deletes the selection (undoable). Always
"Paste" ⌘V While editing text, forwards the command to Paste in the input field. Otherwise, pastes from the internal clipboard or the system clipboard (see 5.7.3). Always
"Duplicate" ⌘D Duplicates the selection with a smart offset (see 5.7.5). Disabled while editing text
"Select All" ⌘A While editing text, forwards the command to Select All for the text. Otherwise, selects all objects in the current layout (both plot tiles and annotations). Always
"Bold" ⌘B Toggles bold for the selection or for text currently being edited. Always (works unconditionally even while editing text)
"Italic" ⌘I Toggles italic for the selection or for text currently being edited. Always (works unconditionally even while editing text)

A separator appears before "Bold," and "Italic" is the final item in the menu.

Underline: Right-click selected text and choose a line style from the "Underline" submenu. Five styles are available — Single, Double, Thick, Dotted, and Dashed — and "None" removes the underline. The current style is check-marked. Right-clicking with characters selected while editing applies it to just those characters; right-clicking a selected text object outside of editing applies it to the whole object. The line position and thickness come from the underline metrics of the font in use, so the spacing stays natural as you change font or size. Exporting to PPTX writes a real PowerPoint underline (line style included), which stays editable in PowerPoint.

Content exported by "Copy as SVG": Only the point cloud in a plot is embedded as a raster image; borders, ticks, gates, and labels remain fully vector. Only SVG format is placed on the clipboard.

Resolution for "Copy as PNG": The default is 300 dpi. Physical-resolution information is embedded in the PNG, so its physical size is preserved in the destination application.

When a single image is selected: the "Export" submenu shows one entry, "PNG (original resolution)," instead of the resolution list. The image is written out with exactly the pixels it already has — no upscaling or downscaling. When only vectors are selected, or vectors and images together, the original resolution is not uniquely defined, so the usual 72 / 144 / 300 / 600 dpi choices are shown as before.

Difference from the Windows version: The shortcut for "Redo" in the Windows version is Ctrl+Y.

5.1.4 View menu
Item Shortcut Action Enabled when
"Display Gates in Color" None Checkable toggle. When off (default), all gate lines and gate names in layouts are displayed in black. When on, they are displayed using the color assigned to each gate. NeoFlow build only
"Ruler Units" None Submenu with mutually exclusive radio options "Centimeters" and "Inches." Always
"Show Movement Distance" None Checkable toggle. Shows the movement amount next to the cursor while dragging. Disabled when no Layout window is open
"Guide Bars" None Checkable toggle. Shows or hides horizontal and vertical guide lines on the page. Disabled when no Layout window is open
"Snap to Grid" None Submenu. Rounds the destination of a move to the grid spacing. Always

Separators appear before "Ruler Units" and before "Show Movement Distance," and "Snap to Grid" is the final item. Details of these items are collected in section 5.5.

5.1.5 Window menu
Item Shortcut Action Enabled when
"Minimize" ⌘M Minimizes the frontmost window. Always
"Zoom" None Zooms/restores the frontmost window. Always

Because this menu is registered as the macOS Window menu, standard items such as the window list are automatically added by the OS in addition to the two items above.

Difference from the Windows version: The Windows version explicitly lists "Minimize Ctrl+M," "Zoom," and "Bring All to Front."


5.2 Layout toolbar

The Layout toolbar has two rows. Row 1 contains document-level operations (file list, batch generation, paper size, export, and printing), while row 2 contains drawing and editing tools.

In row 2, the font-size field, line-width field, image-related fields, text alignment, formatting, size, position, and angle controls are shown or hidden depending on the type of selected object. The display conditions are described for each item.

5.2.1 Row 1
Item Tooltip Action Display/enabled condition
File-list toggle button (20×20 icon) "Close" / "Open" depending on the current state Shows or hides the file list in the Workspace window. NeoFlow build only
"Layout Editor" (title) None 12pt bold label. In the NeoDraw build, the application icon and "NeoDraw" logo are shown instead. Always
Batch "Target Group" pull-down "Batch Target Group" Selects the group used for batch generation. The default is "All Samples." NeoFlow build only
Batch "Arrangement Direction" pull-down "Arrangement Direction" "Horizontal" or "Vertical." NeoFlow build only
Batch "Columns" pull-down "Columns/Rows" 1–20. Default: 6. NeoFlow build only
"Batch" button "Generate Batch" Uses the plots in the current layout as templates and expands them for all samples. NeoFlow build only
"Paper:" pull-down "Paper Size" Changes the paper size (see 5.5.1). Always
"Export" button "Export as PNG / PPTX / PDF" Commits any in-progress inline editing (text or axis titles) and then opens the export dialog. Always
"🖨 Print Layout" button "Print Current Layout Only" Prints only the currently active layout as a single page. Always
"🖨 Print" button "Print All Layouts" Prints all layouts as multiple pages (same operation as ⌘P). Always

Batch-generation result

Clicking "Batch" uses the plots placed in the current layout as templates and expands them for every sample in the specified group. If no template plots have been placed, the alert "Batch Generation" / "Place template plots before running Batch." appears and nothing happens. On success, the view is automatically adjusted to fit all generated content.

5.2.2 Row 2 — Selection, Undo, and Drawing
Item Size Tooltip Action
Selection mode "↖" 30×22 "Selection Mode" Switches the tool to selection mode. The active mode button is highlighted in blue.
Undo "↩" 30×22 "Undo (Cmd+Z)" Performs Layout Undo. This is an action button and does not remain toggled.
Right arrow 31×14 "Right Arrow" Enters arrow-drawing mode with an arrowhead at the end point.
Line 31×14 "Line" Enters straight-line drawing mode.
Left arrow 31×14 "Left Arrow" Enters arrow-drawing mode with an arrowhead at the start point.
Arrow "▼" (at the right of the upper and lower rows) 15×14 "Arrow Type" Opens the arrow-preset menu.
Line-style "▼" (at the right of the middle row) 15×14 "Line Style (Dotted/Dashed)" Opens the line-style menu.
Rectangle 30×22 "Rectangle (drag to draw)" Enters rectangle-drawing mode.
Circle/Ellipse 30×22 "Circle/Ellipse (drag to draw)" Enters ellipse-drawing mode.
Polygon 30×22 None Enters polygon-drawing mode.
Bezier curve 30×22 None Enters Bezier-curve drawing mode.
Shape button 30×22 None Enters creation mode for the currently selected parametric shape.
Shape "▼" 15×22 "Shape Type" Opens a menu for selecting the type of parametric shape.

The three arrow/line buttons (right arrow, line, left arrow) are arranged vertically in three rows, and each button shows a preview actually rendered using the current preset. Clicking the same button again does not turn the mode off; it simply re-enters the same mode. After drawing is completed, NeoFlow automatically returns to selection mode.

Special case when lines or arrows are selected: Clicking a line or arrow button does not enter drawing mode; instead, it immediately converts the selected line/arrow type in place (line ⇄ arrow).

Arrow presets ("▼" to the right of the arrow buttons)

There are six items, with a check mark on the current value. Each item icon is a preview of the actual arrowhead shape. Selecting one also updates the preview images on the two arrow buttons.

Choice
"Standard Small" (default)
"Standard Medium"
"Standard Large"
"Narrow Small"
"Narrow Medium"
"Narrow Large"

Line styles ("▼" to the right of the Line button)

The first item is "Solid" (default), followed by five additional styles. Each item has an actual preview icon and a check mark on the current value. Selecting one also updates the preview on the Line button.

Choice Notes
"Solid" Default
"Fine Dots" Pattern scales with line width
"Dotted" [1.4w, 2.2w] for line width w
"Short Dash"
"Long Dash" [7w, 3w] for line width w
"Dash-Dot" [6w, 2.2w, 1.4w, 2.2w] for line width w

Dash patterns scale in proportion to the line width. Only when exporting to PPTX are they converted to standard PowerPoint dash styles; on screen, in PDF, and in SVG they are drawn by geometric segmentation. This line-style feature is an addition specific to NeoFlow.

Parametric shapes (Shape button + "▼")

The main button displays the currently selected shape, and clicking it enters creation mode for that shape. Choosing a type from "▼" immediately switches to creation mode for that type. Regardless of which shape is selected, only this single button is highlighted.

All shapes are drawn by dragging. After drawing, their shape parameters can be adjusted using yellow handles.

Choice Adjustable with yellow handles
"Block Arrow" Thickness, arrowhead
"Double Block Arrow" Shaft thickness, arrowhead length
"Curved Arrow" Thickness, curve radius, arrowhead
"Right-Angle Curved Arrow" Shaft thickness, arrowhead width and height
"U-Turn Arrow" Thickness, curve radius, arrowhead width/height and vertical position
"Rounded Rectangle" Corner radius
"Bracket [" Curve
"Brace {" Curve, center position
5.2.3 Row 2 — Z-order, Flip, Group, Repair, and Search
Item Shortcut Action Enabled when
"Bring to Front" None Moves selected objects to the front (changing the order for both plot tiles and annotations). Undoable. Nothing happens if the selection is empty
"Send to Back" None Moves selected objects to the back. Undoable. Nothing happens if the selection is empty
"Flip Vertical" None Flips the selection vertically. When there is a selection
"Flip Horizontal" None Flips the selection horizontally. When there is a selection
"Group" ⌘G Assigns a new group to the selection. When two or more objects are selected. If the condition is not met, the button appears dimmed (disabled).
"Ungroup" ⇧⌘U (⌘U alone also works) See below. Enabled if the selection contains at least one annotation or plot tile belonging to a group.
"Repair Menu" None Opens the pop-up menu shown in the table below. Always
"Search" None Opens the Object Search panel. Always

"Bring to Front" and "Send to Back" are arranged vertically in two rows, 6 pixels to the right of the shape controls. "Flip Vertical"/"Flip Horizontal" and "Group"/"Ungroup" are likewise arranged in vertical pairs.

The three behaviors of "Ungroup"

The result depends on the selection.

  1. If the selection contains a group, the group is ungrouped.
  2. If there is no group but the selection contains plot tiles, those tiles are decomposed into editable vector annotations (data bitmap + frame + ticks + gate outlines + labels).
  3. Otherwise, nothing happens.

Allowing ⌘U alone for Ungroup is a NeoFlow-specific addition.

All items in the Repair menu

Item Enabled when Message after execution
"PDF Repair: Merge Overlapping Objects" Always enabled Title: "PDF Shape Repair." If there is no applicable target, one of the following is displayed: "Select a PDF group to repair," "There are no overlapping polygons that can be repaired," or "No overlapping shapes that can be repaired were found." On success: "PDF shapes repaired (n)."
"Image Adjustment: Brightness and Contrast" Enabled only when an image is selected
"White Correction: Make White Transparent" Enabled only when an image is selected
"Combine Vector Objects" Always enabled On failure: "Could not process while preserving Bezier curves. Check the intersection calculation." or "No convertible contours were found."
"Split Vector Objects" Always enabled Same as above
"Convert Polygons to Rectangles" Always enabled Title: "Convert Polygons to Rectangles." Messages: "Select polygons to convert" / "Converted polygons to rectangles (n)" / "No convertible frame polygons were found."
"Convert Polygons to Bezier" Always enabled Title: "Convert Polygons to Bezier." If there is no target: "Select polygons."
"Convert Two-Point Polygons to Lines" Enabled only when a two-point polygon is selected
"Convert Selected Vectors to PNG Image" Enabled only when vector objects are selected
"Set Opacity" Enabled only when there is a selection

Object Search

The tooltip is "Search selected objects (or all objects if none are selected) for matching type, color, and line width." The window heading is "Object Search."

  • When opened with nothing selected, the description is "List of all shape and text objects in the layout."
  • When opened with a selection, the description is "List of objects by appearance within the current selection."
  • Types are displayed as "Text," "Line," "Rectangle," "Polygon," "Bezier," "Ellipse," and "Image"; objects with no fill are shown as "None."
  • The buttons are "Clear" and "Select" (Return is the default button).
  • If "Select" is pressed without checking any item, "Select at least one item" is displayed.
  • If there are no targets, either "There are no shape or text objects to search" or "First select multiple shape or text objects" is displayed.
5.2.4 Row 2 — Alignment and Distribution

The alignment controls form a 3-column × 2-row grid (each cell 28×22), positioned to the right of the Search button.

Item Action
"Align Left" Aligns the left edges of the selection.
"Align Horizontal Center" Aligns the horizontal centers of the selection.
"Align Right" Aligns the right edges of the selection.
"Align Top" Aligns the top edges of the selection.
"Align Vertical Center" Aligns the vertical centers of the selection.
"Align Bottom" Aligns the bottom edges of the selection.

The alignment reference is determined as follows.

  • If Guide Bars are on and a guide on the relevant axis is active (red), the coordinate of that guide is used as the reference. In this case, the command works even with only one object selected.
  • If alignment is not guide-based, the first object in selection order is used as the reference. In this case, at least two objects must be selected.

A group is treated as one rigid body, and its position is determined using the rectangle that bounds the entire group. Alignment is undoable.

Distribution controls are arranged in two vertical rows 8 pixels to the right of the alignment controls.

Item Action Enabled when
"Distribute Vertically" Keeps the topmost and bottommost objects fixed and spaces the centers of the objects between them evenly. At least three targets are required (a group counts as one target)
"Distribute Horizontally" Keeps the leftmost and rightmost objects fixed and spaces the centers evenly. Same as above

Distribution also treats groups as rigid bodies and uses the center of the rectangle bounding the entire group. If there are fewer than three targets, nothing happens.

5.2.5 Row 2 — Colors

Two color bars are arranged vertically 8 pixels to the right of the distribution controls.

Item Tooltip Target
"Line/Text Color" "Line/Text Color" Line color, text color
"Background Color" "Background Color (Shapes/Text Background)" Shape fill, text background

Clicking a bar opens the color picker below the button. The current color shown in the bar updates according to the selection; if no fill is set, it is displayed as transparent.

Contents of the color picker

  • A 44-color palette. The first cell is "Transparent."
  • A "Recent Colors" row.
  • An "HSB" tab (sliders: "Hue," "Saturation," "Brightness") and an "RGB" tab (sliders: "R," "G," "B").
  • A "Gradient" tab (available only for the fill of fillable shapes, or the stroke of shapes that have a stroke). Switches between "None," "Linear," and "Radial," and adjusts the selected stop's color, position, and opacity with sliders. Clicking the preview bar adds a stop; the round markers move left/right by dragging, and dragging far downward deletes them (a minimum of 2 stops is enforced). Linear gradients have an angle slider; radial gradients have center position, aspect ratio, and radius sliders. "Reset Points" restores just the stops to the default two colors.
    • A "Recent:" row (up to 8 entries). Clicking one immediately loads that gradient and applies it live (unlike palette swatches, clicking does not close the panel).
    • The first time the "Gradient" tab is opened for an object that has no gradient yet, the most recently OK-confirmed gradient (or the default white-to-blue linear gradient, if none) is set automatically and previewed live right away.
    • "Recent Colors," "Recent Gradients," and "Last Gradient" all persist across app restarts.
  • Eyedropper.
  • "Cancel" button. Clicking it restores the original color and closes the picker.

For ordinary color cells, the tooltip is the color code; for the transparent cell, it is "No Color (Transparent)."

5.2.6 Row 2 — Font Size and Line Width
Item Initial value Display condition Action
"Font Size (pt)" field + pull-down 12.0 Hidden while an image is selected and replaced by the dpi field Applies the size when committed
"Line Width (pt)" field + pull-down 2.0 The entire field is hidden when the primary selected object is an image When committed, the value is remembered as the default line width for subsequent objects and is also applied to the selection

The scope of font-size application depends on the situation.

  • Editing text with a range selected → only that range.
  • Editing text with only the insertion cursor → the entire text box.
  • Not editing → all selected text.

The pull-down lists presets with a check mark on the current value.

Font-size presets
6 / 8 / 9 / 10 / 11 / 12 / 14 / 16 / 18 / 20 / 24 / 28 / 32 / 36 / 40 / 44 / 48 / 54 / 60 / 66 / 72 / 80 / 88 / 96

The line-width field includes a thickness preview on its left. The pull-down is also a list with thickness previews. When a line, arrow, rectangle, ellipse, polygon, or Bezier object is selected, its line width is shown in the field.

Line-width presets
0.5 / 1 / 1.5 / 2 / 3 / 4 / 6 / 8
5.2.7 Row 2 — Image Controls (shown only when an image is selected)

Only while an image is selected, the font-size field is replaced by the following three controls.

Item Shortcut Tooltip Action
"dpi" label + numeric field (width 50) None "Image Resolution (dpi)" Entering the field starts an adjustment session; changes are reflected live on screen 180 ms after input. The change is committed when confirmed or when focus leaves the field.
dpi lock (28×22 toggle) None "Maintain dpi When Resizing Image" Push-on/push-off toggle
"Crop" button Return = confirm / Escape = cancel "Crop Image (Return to confirm, Escape to cancel)" Toggles cropping mode on/off

While in cropping mode, Return (confirm) and Escape (cancel) take precedence over all other keyboard handling, and mouse input accepts only dragging of the handles.

5.2.8 Row 2 — Text Alignment and Formatting
Item Size Display condition Choices
Horizontal text alignment (3 vertical rows) 34×14 each When one or more selected objects are all text, or are object types that support text inside shapes such as rectangles or ellipses "Align Left" / "Center" / "Align Right" (only one can be active at a time)
Vertical text alignment (3 vertical rows) Only when an object type supporting text inside a shape, such as a rectangle or ellipse, is selected "Align Top" / "Vertical Center" / "Align Bottom"
Text formatting (2 rows × 2 columns, each 24×22) 24×22 each When text or text inside a shape is selected "Bold" (B, ⌘B) / "Italic" (I, ⌘I) / "Superscript" (A²) / "Subscript" (A₂)

Text annotations are not subject to vertical alignment because their box height is determined by their content. The four formatting options can each be turned on/off independently.

5.2.9 Row 2 — Size, Position, Angle, and Selection Information

Shown only when there is a selection.

Item Tooltip Content
Height (cm) Displays/edits the physical height of the selection
Width (cm) Displays/edits the physical width of the selection
Lock aspect ratio toggle "Lock Aspect Ratio" When on, width and height change together
"W" (horizontal scale %) The enclosing control has the tooltip "Selected Object Scale" Horizontal scale
"H" (vertical scale %) Same as above Vertical scale
「X」(cm) Left-edge position. NeoFlow-specific addition
「Y」(cm) Top-edge position. NeoFlow-specific addition
"Angle" (numeric field, width 34) "Rotation Angle (degrees)" Rotation angle. Hidden when nothing is selected and for objects imported from PDF
Selection information (right edge of row 2) Three right-aligned rows (primary information 11pt, line color/fill color 10pt). Width is clamped to 80–420pt, with overflow truncated at the end.

While a numeric field is being edited, automatic updates do not overwrite its value. The widths of numeric fields are fixed widths measured from the largest values they may contain.

During rotation dragging, the Angle field updates in real time and the angle is also displayed next to the cursor.


5.3 Drawing and Object-Operation Procedures
5.3.1 Lines and Arrows
  1. Click one of the Right Arrow, Line, or Left Arrow buttons in the toolbar.
  2. Drag on the page to draw.
  3. After drawing is complete, NeoFlow automatically returns to selection mode.

The arrowhead shape and size use the preset selected from "▼" to the right of the arrow buttons (default: "Standard Small"). The line style uses the style selected from "▼" to the right of the Line button (default: "Solid").

If you press one of these buttons while an existing line or arrow is selected, NeoFlow does not enter drawing mode; it simply converts the selected object in place between line ⇄ arrow types.

5.3.2 Rectangles and Circles (Ellipses)

Click the Rectangle or Circle/Ellipse button and drag on the page to draw.

5.3.3 Polygons
  1. Click the Polygon button.
  2. Each click on the page adds a vertex.
  3. Click the starting point or double-click to close and commit the polygon.
  4. Press Escape while drawing to cancel the draft and return to selection mode.

A double-click is detected using the measured time and distance from the immediately preceding click.

5.3.4 Bezier Curves
  1. Click the Bezier Curve button.
  2. Each click on the page adds a vertex.
  3. Double-click to commit the curve.
  4. Press Escape while drawing to cancel the draft and return to selection mode.
5.3.5 Parametric Shapes

Click the Shape button (or choose a type from "▼") and drag on the page to draw. After drawing, select the shape and use the yellow handles to adjust parameters specific to that shape, such as shaft thickness, arrowhead size, or corner radius. See the table in 5.2.2 for the adjustable parameters.

5.3.6 Creating Text

There is no dedicated text-creation button in the toolbar. Text is created as follows.

  • While remaining in selection mode, double-click an empty area of the page → new text is created at that position.
  • Double-click a shape such as a rectangle or ellipse → begins entering text inside the shape.

Double-click existing text to begin inline editing in place.

5.3.7 Editing Vertices (Nodes)

Select a single polygon or Bezier curve, right-click, and choose "Edit Vertices" to enter edit mode. Because double-clicking is consistently used to enter text inside shapes, node editing is accessed from this context menu.

See 5.4.8 and 5.4.9 for operations in edit mode. In Bezier edit mode, double-clicking a node toggles it between Corner and Free (Smooth).

5.3.8 Grouping and Ungrouping
  • Group (⌘G): Select two or more objects and run the command to make them one group. If the condition is not met, the toolbar button appears dimmed (disabled).
  • Ungroup (⇧⌘U; ⌘U alone also works): See the three behaviors described in 5.2.3.

For alignment and distribution, a group is treated as a single rigid entity using the rectangle that bounds the entire group.

5.3.9 Alignment and Distribution

See 5.2.4. When Guide Bars are used, even a single selected object can be aligned to the guide coordinate.


5.4 Context Menus

The context menu is composed of a common header (seven items that always appear) plus items determined by the selected target.

The position that was right-clicked is recorded and becomes the insertion position for subsequent Paste operations.

The selection changes as follows when right-clicking.

  • Right-click an empty area of the page → clears the selection.
  • Right-click a plot tile → if it is not already selected, that item becomes selected.
  • The same applies to annotations. Which object is considered on top is determined from the unified z-order of plot tiles and annotations.
5.4.1 Common Header (always appears first)

Regardless of whether there is a selection, the following seven items always appear at the beginning of the context menu.

Item Shortcut display Enabled when
"↩ Undo" Enabled only when an operation can be undone
"↪ Redo" Enabled only when an operation can be redone
(separator)
"Copy" ⌘C Enabled only when there is a selection
"Cut" ⌘X Enabled only when there is a selection
"Paste" ⌘V Always enabled
"Duplicate" ⌘D Enabled only when there is a selection
"Select All" ⌘A Always enabled
5.4.2 When Nothing Is Selected (empty canvas area)

Right-clicking an empty area of the page clears the selection and shows only the seven common-header items. No target-specific section (below a separator) appears, nor does the common section used when something is selected ("Opacity…" and below).

In this state, "Copy," "Cut," and "Duplicate" are disabled; only "Paste" and "Select All" are available.

5.4.3 When One or More Annotations Are Selected (common section)

When you right-click an annotation such as a shape, line, text object, or image, the common header is followed by target-specific sections where applicable, then by the following items.

Item Shown when Content
"Opacity…" When there is a selection 0–100% slider. 0% = opaque, 100% = transparent. Changes are previewed live from the moment the dialog opens. Buttons: "OK" and "Cancel."
"Gloss…" When there is a selection Color picker, "Outline Size" 0–10 Pt, "Opacity" 0–100%
(separator)
"Convert to PNG…" Shown only when the selection contains at least one vector object (rectangle, ellipse, polygon, Bezier, line, arrow, or text) Resolution 36–600 DPI; default 300
"Special Copy" (submenu) When there is a selection "Copy as PNG" / "Copy as SVG" (⇧⌘C)
"Export" (submenu) When there is a selection 「PDF」/「PNG 72dpi」/「PNG 144dpi」/「PNG 300dpi」/「PNG 600dpi」
5.4.4 When Text Is Selected (additional items)

These items are added when a text annotation is right-clicked, or when right-clicking while editing text inside a shape.

Item Shown when Content
"Line Spacing…" While editing text (applies to that paragraph), or when a text annotation is selected (applies to all of its text) See below
"Monospaced Font (Courier New)" Same as above Checkable toggle. It is checked when all selected text is monospaced.
"Replace with Standard Font" The selection includes at least one text object that is displayed using an embedded font from a PDF/Illustrator (.ai) import See below

The title of the "Line Spacing…" panel changes according to the target range: "Line Spacing (Current Line Only)," "Line Spacing (Selected n Lines)," or "Line Spacing (Entire Text)."

The panel contains two radio options.

Radio option Slider range
"Standard Multiplier" 0.1–5×
"Specify in Points" 4–120pt (line-break height)

Changes are applied immediately each time the slider is moved. There is no concept of Cancel; the value is committed when the panel is closed.

Choosing "Replace with Standard Font" stops displaying the embedded font for the selected text and switches it to the default typeface (Arial or Courier New, depending on the monospace setting) for display and editing from then on. There is no way to switch it back to the original font (only Undo (Cmd+Z) can reverse this). See 5.8.3 for how embedded fonts are imported in the first place.

5.4.5 When an Image Is Selected (additional items)

When the selection contains one or more images, four items are added.

Item Content
"Adjust Brightness…" Two sliders for the lower and upper bounds of the brightness range (each 0–1000). Defaults are lower 0 and upper 1000. The two handles cannot cross: the lower bound can move only up to upper−1, and the upper bound only down to lower+1.
"Make White Transparent…" Radio options "Make White Transparent" / "Convert Transparency to White" (default: "Make White Transparent"), plus a 0–1000 slider (default 1000 = threshold 255 = nothing becomes transparent). Depending on the mode, the slider label changes between "White Detection Threshold" and "White/Gray Level."
"Round Image Corners…" Radius (%) 0–100, default 0. NeoFlow-specific addition.
"Extract Text…" Extracts text strings from the image.
5.4.6 Additional Shape-Conversion Items
Item Shown when Content
"Round Corners…" When exactly one rectangle is selected Radius (%) 0–100. 100% = half of the shorter side. The panel also shows information in the form "Radius: n.npx (100% = half of shorter side = n.npx)."
"Round Corners (Readjust)…" When exactly one Bezier object that was previously created as a rounded-corner shape is selected (only the label changes) Same as above
"Convert Rectangle/Ellipse to Bezier…" When the selection contains at least one rectangle or ellipse Converts rectangles and ellipses to Bezier curves.
"Convert Polygon to Bezier…" When the selection contains at least one polygon with two or more vertices Corner-threshold slider 90–179 degrees (default 150). Description: "Corners sharper than the threshold remain pointed; all others are approximated smoothly."
"Combine Objects" When there are two or more overlapping closed vector objects Combines the shapes.
"Split Objects" Same as above Splits the shapes.

If combining/splitting fails, an alert appears with either "Could not process while preserving Bezier curves. Check the intersection calculation." or "No convertible contours were found."

5.4.7 "Convert to Polygon," "Convert to Bezier," and "Edit Vertices"
Item Shown when Content
"Convert to Polygon" When the selection contains a "Block Arrow," "Double Block Arrow," or "Right-Angle Curved Arrow" Removes the parametric-shape designation and converts it to an ordinary polygon. Its appearance does not change.
"Convert to Bezier" When the selection contains a "Curved Arrow," "U-Turn Arrow," "Rounded Rectangle," "Bracket [," or "Brace {" Removes the designation and converts it to an ordinary Bezier object. Its appearance does not change.
"Edit Vertices" Only when exactly one polygon or Bezier object is selected Enters polygon node-edit mode for a polygon, or Bezier node-edit mode for a Bezier object.
5.4.8 Right-clicking a node (vertex) while editing nodes

While editing a Bezier/polygon, right-clicking a node shows a dedicated menu in preference to the normal context menu.

Item Shown/enabled when
"Make Curved" First item. Shown when the current node is a corner.
"Make Pointed" First item. Shown when the current node is not a corner. For legacy-format paths, this item is always shown.
"Smoothing" Always enabled for normal-format paths. For legacy-format paths, enabled only for interior points.
"Add Handle" Shown only for nodes to which a handle can be added
"Close Curve" When the curve is open, the node is an endpoint, and the curve has at least three vertices
"Open" For a closed curve, at any vertex when there are at least three vertices. For an open curve, when the node is an interior point and there are at least three vertices.
"Delete Point" For normal-format paths, when there are at least three vertices (more than two). For legacy-format paths, at any vertex other than the first when there are more than two vertices.
5.4.9 Right-clicking the curve itself while editing nodes

Right-clicking a point on the curve other than a node displays a menu containing only the following item.

Item Action
"End Edit Mode" Exits node-edit mode.
5.4.10 Right-clicking a Plot Tile

NeoFlow build only. After the common header, the following target-specific items are shown.

Item Enabled when Action
"Plot Settings" Always enabled Opens settings for that plot.
"Gate Style" (submenu) When the tile has gates and the target file can be resolved. If there are no gates or the target file cannot be resolved, the item itself is disabled (not hidden). Lists all gates in the tile by gate name (including sibling gates of quad and bisector gates). Selecting one opens a panel for setting color and line width (0.5–8).
"Copy Formatting" Always enabled Copies the formatting of that plot.
"Paste Formatting" Enabled only when plot formatting has been copied Pastes the copied formatting.
5.4.11 Right-clicking a Layout Tab
Item Shown when Action
"Rename" Always Starts inline editing of the tab name.
"Delete Layout" Shown only when there are two or more layouts Displays a warning alert "Delete '<name>'?" Press "OK" to delete or "Cancel" to abort. Deletion is undoable.

No context menu is shown over the "+" tab.


5.5 Paper, View, and Helper Functions
5.5.1 Paper Size

Use the "Paper:" pull-down in toolbar row 1 (tooltip "Paper Size") to switch among three choices. The initial selection is "A4 Portrait."

Choice Base dimensions (internal units)
"Free" 1100 × 850
"A4 Portrait" 794 × 1123 (default)
"A4 Landscape" 1123 × 794

Selecting a size switches the base paper dimensions, records the change in Undo history, saves it in the layout, reapplies the print scale, and then repositions the content.

5.5.2 Print Scale (Print %)

This is the numeric field at the right edge of the layout tab bar, to the right of the zoom controls (width 50, right-aligned, initial value "100"). The tooltip is "Print Scale (%): physical paper size. Separate from screen zoom."

  • The entered value is clamped to 10–500% (default 100%).
  • The displayed paper dimensions are determined by "base dimensions × 100 ÷ print scale." Thus, increasing the scale reduces the paper's internal dimensions, causing the same figure to print larger.
  • An Undo entry is created only when the value actually changes.
  • Changing the print scale also recalculates the ruler conversion to cm/inches.
  • When loading a file, if the print scale uses an old fractional representation of 5 or less, it is normalized to "100 ÷ value" and then clamped to 10–500.
5.5.3 Changing Print Scale by Dragging the Paper Edge

In selection mode, single-click and drag the right edge, bottom edge, or lower-right corner of the paper (within 12 pixels on either side of the edge) to change the print scale directly.

Drag location What changes
Right edge Width
Bottom edge Height (width is also calculated proportionally)
Lower-right corner Scales up/down diagonally
  • An Undo entry is created only once at the start of the drag.
  • The minimum reduced size is 0.5 times the base dimensions.
  • The resulting print scale is calculated as "100 × base width ÷ new width," rounded to the nearest integer, and clamped to 10–500%.
  • During dragging, the paper and annotations are redrawn. When the mouse button is released, the value is committed as the print scale and the entire view is redrawn.
5.5.4 Screen View (Zoom) and Pan

At the right edge of the layout tab bar are the label "Screen View:", an editable numeric field, "%", and then "−", a slider, and "+".

Control Range Notes
Slider 5〜500 % Initial value 100%
「−」「+」 ±10% from the current zoom Clamped to 5–3000%
Numeric field Not overwritten by external updates while being edited

The actual configurable zoom range is 5–3000%.

Operation Action
Wheel / pinch Zooms in/out while keeping the cursor position fixed.
⇧ + scroll Pans (shifts the view).
Spacebar + drag Hand tool. The cursor changes to a hand as soon as Space is pressed; releasing Space immediately returns to normal interaction even if panning is in progress.
5.5.5 Rulers and Units

There are 20pt rulers along the top and left edges of the Layout Editor. A small decorative corner box appears at their upper-left intersection; it is not interactive.

  • The origin is the upper-left corner of the paper.
  • Major-tick spacing is selected from a 1 → 2 → 5 progression so that major ticks are at least 48 pixels apart on screen. Minor ticks divide a major interval into four parts when the leading digit of the major interval is 2, and into five parts otherwise.
  • Major ticks have numeric labels (unnecessary trailing zeros are omitted).
  • Display units are switched using "Ruler Units" in the View menu.
"Ruler Units" choices Notes
"Centimeters" Default
"Inches"

This setting is retained the next time the application is launched. When changed, the rulers in all open layouts are immediately redrawn via a notification. The cm conversion used for guide-line labels is exactly the same as the ruler conversion.

5.5.6 Margin Outside the Paper

There is always a 1 cm scrolling gutter outside the paper. Scrolling covers the region including this gutter rather than the paper alone, and the editing overlay also spans the entire gutter, so clicks and drags outside the paper are accepted.

5.5.7 Guide Bars

Turn Guide Bars on/off using "Guide Bars" in the View menu. The item is disabled when no Layout window is open.

  • When Guide Bars are enabled for the first time, if their positions have not been set, the vertical guide is initialized at half the paper width and the horizontal guide at half the paper height. Both are initially inactive (normal color).
  • Line width is 1.5 pixels. The normal color is green (rgba(76,190,110,.7)); the active color is red (rgba(240,110,110,.85)).
  • A label "n.nncm" is shown beside each guide (9px, white rounded-pill background, dark green text).

Guide-line operations

Operation Result
Drag normally Moves the guide line. Its position is clamped to 0–paper width/height. Not undoable.
Double-click, or ⇧/⌘/Ctrl + click Toggles that guide's active color (does not drag it).

Whether a guide is active is independent of visibility and determines only its color and whether it is a snap target for alignment. When a guide on an axis is active, alignment commands align even a single selected object to that guide coordinate (normally two or more objects are required).

The Guide Bars toggle was previously in the object context menu, but has now been moved to the View menu.

5.5.8 Snap to Grid

Choose the grid spacing from the "Snap to Grid" submenu in the View menu. The tooltip is "Snap movement to the grid spacing. Hold Option while dragging to temporarily disable."

Choice
"Off" (default)
「1 mm」
「2 mm」
「5 mm」
「10 mm」
  • The value rounded is the destination position, not the movement amount. Therefore, once an object lands on the grid, subsequent moves occur in exact grid increments.
  • Hold Option while dragging to disable snapping temporarily.
  • This setting is retained the next time the application is launched (unset = off).
5.5.9 Show Movement Distance

Turn this on/off with "Show Movement Distance" in the View menu. The tooltip is "When enabled, movement amount (length, X, Y) is displayed next to the cursor while dragging."

  • It applies to the currently active layout screen. Default: off.
  • When enabled, the following three lines are displayed at the lower right of the cursor (position +12, −56) while dragging.
l: n cm
x: n cm
y: n cm
  • Values use three significant digits and are converted to cm with the print scale taken into account.
  • The menu item is disabled when no Layout window is open.
  • Immediately before the menu opens, the check state is refreshed from the actual data.

The angle display ("n°") during rotation dragging uses the same display area but is unrelated to this toggle and is always shown.

5.5.10 "Display Gates in Color"

The first item in the View menu (NeoFlow build only). It is a checkable toggle.

State Color of gate lines and gate names in the layout
Off (default) All black (#000000)
On Color for each gate (determined in the order: per-plot-tile Gate Style setting → gate's own color → default color)

The tooltip is: "When enabled, gate lines and gate names in layouts are displayed using each gate's color (legacy display). When disabled (default), all are displayed in black. This setting is retained the next time the application is launched."

This setting is retained across launches, and changing it immediately updates all Layout windows that are already open. It does not apply to the workspace (Graph windows), which always display gates in color.


5.6 Layout Tabs

The layout tab bar is at the lower-left side of the Layout Editor.

Operation Result
Click a tab Switches to that layout. The selection is cleared and the zoom is refit to the paper width.
Drag a tab Reorders it left or right (see "Reordering tabs").
Double-click a tab Renames it inline.
Right-click a tab Shows the "Rename" / "Delete Layout" menu (see 5.4.11).
Click the "+" tab (dashed border) Adds a new layout.
← / → with nothing selected Switches to the previous/next layout tab.

Tooltips: a normal tab shows "Click to switch / Double-click to rename / Right-click for menu," and the "+" tab shows "New Layout." When there are many tabs, the bar wraps and becomes taller.

Renaming

Double-click, or choose "Rename" from the context menu, to begin inline editing.

Key/operation Result
Enter Save
Escape Cancel
Click outside the field (lose focus) Save

An input containing only whitespace is ignored and the original name is retained. The edit-field width is set between 60 and 200 according to the text length.

Adding a layout

Click the "+" tab to add a new layout.

  • Its name is "Layout N," where N is the smallest unused number.
  • The paper size setting is inherited from the current layout.
  • Screen zoom is preserved (unlike switching tabs, the view is not refit).
Deleting a layout

Use "Delete Layout" in the context menu. It appears only when there are two or more layouts. In the confirmation alert "Delete '<name>'?", press "OK" to delete or "Cancel" to abort. Deletion is recorded in Undo history and can be reversed with ⌘Z.

Reordering tabs

Dragging a tab reorders it left or right. While dragging, the grabbed tab itself follows the cursor horizontally (it does not move vertically), and the other tabs shift to show the insertion point. The new position is committed when you release. Selecting a tab (switching the displayed layout) is also committed on release, so you can grab and reorder a tab that is not currently selected without selecting it (a pure reorder leaves the selection unchanged). Reordering is recorded in Undo history and can be reversed with ⌘Z. Reordering by itself does not change the active layout's content or selection (and does not trigger a zoom refit).


5.7 Copy, Cut, Paste, and Duplicate

NeoFlow layouts have an internal clipboard, used alongside the system (macOS) clipboard.

5.7.1 Copy (⌘C)

Running Copy performs the following steps in order.

  1. Stores the selected objects in the internal clipboard as complete duplicates (including target data, selection state, and source layout).
  2. Clears the remembered most-recent click position and resets the repeated-paste counter to 0.
  3. Also writes to the system clipboard. The format written depends on the selection.
Selection Format written to the system clipboard
Exactly one image object PNG(+TIFF)
Anything else (mixed images and vectors, or vectors only) Vector PDF
  1. Records the clipboard state immediately after writing. This prevents NeoFlow from mistaking its own clipboard content for externally copied content and re-importing it at (0,0) on the page.

If ⌘C is pressed while editing text (inside a numeric field or rich-text field), it is handled as Copy within that input field.

5.7.2 Cut (⌘X)

While editing text, the command is forwarded to Cut in the input field. Otherwise, NeoFlow performs Copy and then deletes the selection. The deletion is recorded in Undo history.

5.7.3 Paste (⌘V) — Priority

The paste position is the most recent position clicked or right-clicked on the page. If none exists, (40, 40) is used.

The pasted content is determined in the following order.

(1) If the internal clipboard exists and the system clipboard has not changed since NeoFlow's most recent Copy → Paste the internal clipboard contents at the click position.

(2) If the system clipboard has changed (for example, another application copied something) → Import from the system clipboard. Supported formats are prioritized as follows.

Priority Format
1 PDF
2 PNG
3 TIFF
4 JPEG
5 GIF
6 BMP
7 AVIF
8 JPEG 2000
9 Generic image if none of the above applies but the data can be read as an image
  • If PDF is selected and parsing fails, NeoFlow does not fall back to an image.
  • Only when PDF is not first in priority, if SVG format exists it is imported as SVG.
  • Format availability is checked both in the clipboard's "first item" and across the entire clipboard.
  • PowerPoint lines and arrows: PowerPoint writes lines and arrows to PDF not as stroke (line-drawing) commands, but as a thin fill shaped like the line (with an added triangular fill for the arrowhead, if any). When this pattern is detected, NeoFlow imports it as a native "line" or "arrow" object instead of a filled shape. Once imported, the arrowhead style, line style, and width can be edited just like a line or arrow drawn with the line/arrow tool.

(3) If only plain text is available → Paste it as a new text object. Width is automatically fitted to the content; color, size, and left alignment use defaults; bold/italic/superscript/subscript inherit the default text style.

(4) If none of the above applies → Fall back to the internal clipboard contents.

5.7.4 Determining Paste Position (when pasting from the internal clipboard)

The position for pasting from the internal clipboard is divided into the following three cases.

Situation Paste position
The source layout is different from the current layout No offset (same coordinates as the original)
A most-recent click position exists Translate the selection so that its upper-left corner (minimum X, minimum Y) lands at that position. After pasting, the remembered click position is cleared and the repeated-paste counter is reset to 0.
Neither of the above (repeated paste into the same layout) Increment the repeated-paste counter by 1 and add counter × 20 pixels to both X and Y (20 → 40 → 60 …).

Pasted objects receive new IDs and new group IDs. Objects that belonged to the same group in the source remain together in the same newly assigned group after pasting. Immediately after pasting, the new objects are selected.

5.7.5 Duplicate (⌘D) — Smart Offset

Duplicate creates copies of the selected objects with a small offset. The offset is learned as follows.

  1. If objects created by the previous Duplicate were subsequently moved by the user, that movement amount is adopted as the spacing for the next Duplicate.
  2. Immediately before duplication, the positions of the source objects are recorded.

Thus, "Duplicate → move to the desired position → Duplicate again" lets you arrange copies with the same spacing.

The Duplicate menu item is disabled while editing text.

5.7.6 Copy as PNG and Copy as SVG
Command Shortcut Output
"Copy as PNG" None Renders the selected area at 300 dpi (default) and places both PNG and TIFF formats on the clipboard. Physical-resolution information is embedded in the PNG.
"Copy as SVG" ⇧⌘C Exports the selection as vector SVG and places only SVG format on the clipboard. A beep sounds if the operation fails.

With Copy as SVG, only the plot point cloud is embedded as a raster image; borders, ticks, gates, and labels remain fully vector.

Both commands are available from the Edit menu and from the "Special Copy" submenu when right-clicking an annotation.


5.8 Importing External Files
5.8.1 Import Methods

External files can be imported in the following three ways.

  • Drag and drop them onto the layout page.
  • Choose files with File → "Place File in Layout…" (⇧⌘O). The selectable extensions are pdf / ai / svg / pptx and raster images.
  • Paste them from the clipboard (PDF, SVG, raster image).
5.8.2 Drop Routing

When a file is dropped onto the page, its destination is determined by extension.

Dropped item Destination/action
.fcs Loads it into this window's workspace. If the active group is not "All Samples," it is also added to that group.
.neo / .faws / .wsp / .jo Opens it as an independent document.
Folder Recursively collects .fcs files below it and loads them into the workspace in file-name order (PDFs and other files are ignored).
Anything else (pdf / ai / pptx / svg / image) Places it in the layout. Multiple files are offset by 18 pixels for each file.

After importing into the layout, if the workspace contains no FCS files, the Workspace window is closed.

5.8.3 Importing PDF and Illustrator (.ai)

A PDF is converted to vectors one page at a time. NeoFlow first searches within the file for the actual PDF data (from %PDF through %%EOF), normalizes it, and then parses it.

Adobe Illustrator .ai files are imported through this same path. Since Illustrator 9 (2000), "Create PDF Compatible File" has been enabled by default, so a saved .ai is itself a PDF (it simply carries Illustrator's own editing data alongside it). Import therefore behaves exactly as the table below describes for PDF: Illustrator-specific structures such as layers and artboards are not used, and the file is expanded into the vector shapes exactly as they appear.

Item Behavior
Placement position Always at the upper-left of the page (0, 0), regardless of page count. The drop or paste position is ignored.
Multiple pages A new layout tab is created for the second and subsequent pages: one page = one tab.
Paper orientation Not switched automatically.
Overflow adjustment Only if the page is larger than the paper, the print scale is reduced to make it fit (1-pixel tolerance, clamped to 10–100%).
Grouping If multiple annotations are imported, they are combined into one group.
Selection state After import, they are not selected.
Text recognition OCR is not used (the function itself is disabled and there is no UI for it).

If no vector elements can be extracted, "No vector elements could be imported from the PDF" is displayed.

Which .ai files can and cannot be imported

Saved format How it is detected Result
Illustrator 9 or later (PDF compatible, the default) The file begins with %PDF Imported as a PDF
Illustrator 8 or earlier, or saved with "Create PDF Compatible File" turned off The file begins with %!PS (PostScript) Cannot be imported. "This Illustrator file uses the older PostScript format and cannot be imported. Re-save it from Illustrator with "Create PDF Compatible File" enabled." is displayed
Neither of the above Neither %PDF nor %!PS is found Cannot be imported. "Could not determine the format of this Illustrator file." is displayed

When a file cannot be imported, do what the message says: re-save it from Illustrator's "Save As" dialog with "Create PDF Compatible File" checked, or export it as a PDF first and import that PDF instead.

Compound paths (holes) and clipping

How the source is drawn Import result
A single path made of several contours — a compound path (a donut, the letter "O", the rungs of a ladder) The fill rule (nonzero / even-odd) decides which contours are outlines and which are holes, and the holes are preserved.
Clipping by a curved or concave shape (for example stripes laid over a bent straw) The shape is cut exactly to the clip. If the cut splits it into several islands, each island becomes its own shape.

A compound path is imported as one shape whose holes are joined to the outline by a zero-width bridge. It fills exactly like the original, but if you edit its vertices after import you may see the bridge.

Spot colors and CMYK

Spot colors (/Separation) and /DeviceN, both common in Illustrator artwork, are resolved by evaluating the tint transform function and then converting through the underlying color space (CMYK and so on) to RGB. CMYK, ICC-based, Lab, and indexed color are interpreted the same way. This applies not only to solid fills but to every color of a gradient.

Embedded color profiles (ICC)

When the file carries an embedded color profile (Illustrator artwork almost always does), the profile is interpreted and the colors are converted for display. Each kind of profile is handled as follows.

Profile formHandling
Lookup-table based (A2B0; this is the usual form for CMYK profiles)Input tables, then the multi-dimensional lookup table, then the output tables are applied in order.
Matrix + tone curves (RGB profiles such as sRGB or Adobe RGB)Converted with the tone curves and the matrix.
Grayscale (kTRC)Converted with the tone curve.
Anything else, or a profile that cannot be interpretedConverted using the alternate space (/Alternate), or a space inferred from the component count.

Treating the raw numbers as RGB without consulting the profile makes the same file look different from what Illustrator or Preview shows. With this conversion the import matches a color-managed display almost exactly.

Transparency and soft masks

How the source is drawnImport result
Constant opacity (/ca, /CA)Carried through as the shape's opacity.
A soft mask that varies with position (a /SMask luminosity mask)Mapped to a gradient fill whose opacity varies. Curved transitions are preserved as they are.
An image soft mask (arbitrary shading)A gradient cannot express it, so the shape and the mask are composited per pixel and imported as a single image.
A blend mode (/BM) such as Multiply or Screen where the fill does not change the backdrop (white under Multiply, black under Screen)Skipped, which is exactly correct: not drawing it is the right result.

Limitation: the blend mode itself (Multiply, Screen, and so on) cannot be held as a shape attribute, so apart from the "does not change the backdrop" case above, such fills are drawn with normal stacking. Only the areas that would blend into an intermediate color differ slightly from the original.

Embedded fonts

When a PDF or .ai file has the actual font program embedded (not just a reference to it), NeoFlow imports that font and displays the text in the original typeface. Editing (adding or deleting characters) also uses that same typeface.

Embedding formatSupport
TrueType (/FontFile2)Supported
OpenType (/FontFile3, OpenType)Supported
Bare CFF (/FontFile3, Type1C/CIDFontType0C)Supported (rebuilt internally into OpenType format before use)
Type1 (/FontFile)Not supported. The text is displayed in the default typeface (Arial or Courier New) after import.
No font program embedded (only a reference to a system font)Not supported. Displayed in the default typeface, as before.

Right-clicking text that uses an imported embedded font offers "Replace with Standard Font" (see 5.4.4). Choosing it switches that text to the default typeface for display and editing from then on.

If the same embedded font is used in multiple places, NeoFlow stores it once internally as long as the content is identical, so it does not inflate the file size.

5.8.4 Importing PPTX

Slides are extracted from a PowerPoint file.

Item Behavior
Placement position As with PDF, always at the upper-left of the page (0, 0)
Multiple slides A new layout tab is created for the second and subsequent slides: one slide = one tab.
Paper orientation Only PPTX switches it automatically. For a landscape slide, the paper is set to "A4 Landscape"; for a portrait slide, to "A4 Portrait," and the print scale is reset to 100%. This does not apply when the paper size is "Free."
Overflow adjustment After matching the orientation, if the slide still exceeds the paper, the print scale is reduced.

If parsing fails, "Could not parse PowerPoint" is displayed. If no elements can be extracted, "No vector elements could be imported from PowerPoint" is displayed.

5.8.5 Importing SVG

SVG can be imported by drag and drop, "Place File in Layout…", or pasting from the clipboard (when PDF is not present).

Item Behavior
Placement position Placed at the drop position (unlike PDF/PPTX, the actual drop position is used).
Size Placed so that it fits within 420 × 420.
Grouping Multiple elements are combined into one group.
Selection state Not selected after import.

If no elements can be extracted, "No vector elements could be imported from SVG" is displayed.

5.8.6 Importing Raster Images
Situation Placed size
The image has physical-DPI metadata (DPI greater than 1) Placed at physical size (pixel count × 96 ÷ dpi)
No metadata Reduced while preserving aspect ratio so that it fits within 420 × 420. It is not enlarged.

Both width and height have a minimum of 8 pixels.

Images are always stored after conversion to PNG, while the original data and original pixel dimensions are also preserved. Therefore, dpi can be changed later and cropping can be undone.

Only imported images remain selected after import (unlike vector imports, which clear the selection).

5.8.7 Messages When Import Fails

When an unreadable file is dropped or placed, an alert titled "Import" appears. Its body is one of the following, depending on the situation.

Body
"Could not read the file"
"Unsupported file format"
"Could not load the image"
"Could not convert the image"
"Could not parse the PDF"
"This Illustrator file uses the older PostScript format and cannot be imported. Re-save it from Illustrator with "Create PDF Compatible File" enabled."
"Could not determine the format of this Illustrator file."

5.9 Export
5.9.1 Export Dialog

Open it with the "Export" button in toolbar row 1. When the button is pressed, any in-progress inline editing (text or axis titles) is committed. The dialog is an independent 640 × 560 window titled "Export."

Difference from the Windows version: Pressing the same "Export" button in the toolbar first opens a format-selection popup menu ("PDF", "PPTX (PowerPoint)", "PNG", "Illustrator (.ai)", then, below a separator, "Batch Export PDF (Choose Layouts)…", "Batch Export PPTX (Choose Layouts)…", "Batch Export PNG (Choose Layouts)…", "Batch Export Illustrator (Choose Layouts)…"). The first four items (the original one-shot export) additionally ask whether to export just the current layout or all layouts. Choosing one of the "Batch Export…" items opens an independent dialog (one per format) with the progress display, cancel, and multi-layout selection described in this section. The Mac version lets you switch format (PDF/PPTX/PNG/Illustrator) within a single dialog, whereas the Windows version uses a separate dialog per format. The layout list shows only a checkbox and name (no thumbnails), and there is no separate "Select All" checkbox (the layout checked by default is the currently active one, same as on Mac). The "Resolution:" dropdown and the PPTX-only options are not part of this dialog; instead they are set persistently (until next changed, not per export) via the format-selection menu's own "PNG resolution" / "PDF point-cloud resolution" submenus (same 72/144/300/600 dpi choices) and the existing "Convert ticks to text" / "Convert gates to shapes" settings. The "Cancel" button reads "Close" before a run starts. As on the Mac version, the save destination is asked before generation begins.

Left column (width 230) — Selecting layouts to export

  • A "Select All" checkbox appears at the top.
  • Below it is a scrolling list with one row per layout (checkbox + thumbnail + name).
  • By default, only the currently active layout is checked.
  • Clicking anywhere in a row toggles its checkbox.
  • "Select All" is on only when every layout is checked (no intermediate state is used).
  • A layout with an empty name is displayed as "Layout n."

Right column

Control Display condition
"Format:" pull-down Always
"Resolution:" pull-down Shown only for PDF, PNG, and Illustrator (hidden for PPTX)
PPTX-only options Shown only for PPTX
Description for each format Always
Status display / progress bar Always
"Cancel" and "Export" buttons Always. "Export" is the default Return button.

Format and resolution

"Format:" choices
「PDF」
「PPTX(PowerPoint)」
"PNG (Image)"
"Illustrator (.ai)"
Format "Resolution:" choices Default
PDF 72 / 144 / 200 / 300 / 600 300 (applies only to plot images)
Illustrator 72 / 144 / 200 / 300 / 600 300 (applies only to plot images; identical to PDF since it is PDF under the hood)
PNG 72 / 144 / 300 / 600 144
PPTX (No Resolution item is shown)

PPTX-only options

Option Default
"Convert Tick Labels to Text (exponents as superscript)" On
"Convert Gates to Shapes" On

Behavior during execution

  • If you press "Export" without checking any layouts, the dialog remains open and displays "Select a layout."
  • All controls are disabled while export is running.
  • If "Cancel" is pressed during execution, the status changes to "Canceling…".
  • The progress area successively shows messages such as "Preparing…", "Rendering PNG…", "Compressing PNG…", "Saving PNG…", and "Saving PDF…".
5.9.2 Format Descriptions and Save Behavior

The "base name" used for the default file name in the destination panel is the file name of the most recently opened/saved workspace. If there is no workspace, "flow_layout" is used.

PDF

Description: "Export all layouts as a single multi-page PDF. Resolution applies only to plot images (text/frames/ticks/gates remain vector)."

  • The save-panel title is "Export PDF."
  • The default file name is "<base name>.pdf".
  • Text, frames, ticks, and gates are exported as vectors; the resolution setting affects only the image portion of plots.
  • Pasted images are embedded at their original quality. JPEG data is written through unchanged rather than re-compressed, so nothing is lost and the file stays smaller. When an image is rotated, the rotation is written as a PDF transformation matrix instead of being baked into the pixels, so edges stay sharp at any zoom level.
  • If generation fails, "Failed to generate PDF." is displayed.

Illustrator (.ai)

Description: "Exports all layouts to a single multi-page Illustrator (.ai) file. Since it is PDF-compatible under the hood, it opens in Illustrator 9 or later. The resolution setting applies only to plot images (text/frames/ticks/gates remain vector)."

  • The save-panel title is "Export Illustrator."
  • The default file name is "<base name>.ai".
  • The generated content is identical to a PDF export (the same structure Illustrator 9 and later produce by default with "Create PDF Compatible File" enabled — the .ai file is itself a PDF). Text, frames, ticks, and gates are exported as vectors, and images are embedded at their original quality just as with PDF.
  • If generation fails, "Failed to generate the Illustrator file." is displayed.

Pairs with import: This export is the counterpart of 5.8.3 Importing PDF and Illustrator (.ai). A NeoFlow-exported .ai file can, of course, be imported right back in.

PPTX

Description: "Export all layouts as a single multi-slide PPTX (vector)."

  • The save-panel title is "Export PPTX."
  • The default file name is "<base name>.pptx".
  • If generation fails, "Failed to generate PPTX." is displayed.

PNG

Description: "Export each layout as an individual PNG (when multiple layouts are selected, choose a destination folder)."

Number of selected layouts Save flow File name
One Save panel (title "Export PNG") "<base name>_<dpi>dpi.png"
Multiple Folder-selection panel (title "Select Destination Folder," button "Select") "<base name>_<layout name>_<dpi>dpi.png". In the layout name, characters other than letters, digits, underscores, and hyphens are replaced with underscores.

If generation fails, "Failed to generate PNG." is displayed.

Difference from the Windows version: "Batch Export PNG (Choose Layouts)…" lets you export multiple checked layouts as individual PNG files (added 2026-08-27; before that, the Windows version had no such multi-layout export at all). File names are "(layout name)_(dpi)dpi.png" (no base name prefix). File-name construction and the folder-vs-single-file behavior otherwise match the Mac version.

5.9.3 Export from the Context Menu

Select annotations and right-click to export only the selected area directly from the "Export" submenu.

Item
「PDF」
「PNG 72dpi」
「PNG 144dpi」
「PNG 300dpi」
「PNG 600dpi」

In addition, when vectors are selected, "Convert to PNG…" lets you specify a resolution from 36 to 600 DPI (default 300) and replace the selected vector objects with a PNG image object.


5.10 Printing

Printing can be started from the following three entry points.

Entry point Target
File → "Print…" (⌘P) All layouts (multiple pages)
"🖨 Print" in the toolbar All layouts (multiple pages)
"🖨 Print Layout" in the toolbar Only the currently active layout (one page)
Print flow
  1. First, a sheet titled "Preparing to Print" appears. It contains the label "Preparing print data…", a progress bar, and a "Cancel" button. A PDF is generated in the background at this stage.
  2. While generation is in progress, editing in the target Layout window is suspended.
  3. Pressing "Cancel" changes the status to "Canceling…".
  4. If generation fails, an alert "Failed to generate print data" appears.
  5. When generation is complete, the document is passed to the standard macOS print panel. Both the print panel and the progress panel are displayed.
Print settings
  • The paper size is taken directly from the dimensions of the first page.
  • All margins are 0, and horizontal/vertical centering is enabled.
  • No scaling is performed (scale 1.0; no fit-to-page processing). Any overflowing content is clipped.
  • Paper orientation is determined from the portrait/landscape orientation of the first page and is automatically rotated as necessary.
  • Specify the page range to print using the "Pages" field in the standard macOS print panel.

5.11 Keyboard Operations in the Layout Screen

The following summarizes keyboard operations on the page when text is not being edited.

With ⌘
Key Action
⌘Z Undo
⇧⌘Z Redo
⌘G Group
⌘U / ⇧⌘U Ungroup
⌘A Select All
⌘C Copy
⇧⌘C Copy as SVG
⌘X Cut
⌘V Paste
⌘D Duplicate
⌘B Bold
⌘I Italic
Without modifiers
Key Action
← → ↑ ↓ (when there is a selection) Moves the selection by 1 pixel. Undoable.
⇧+← → ↑ ↓ Moves by 10 pixels.
← → (when there is no selection) Switches layout tabs.
Delete / Forward-Delete Deletes the selection.
Escape Only while drawing a polygon or Bezier curve, cancels the in-progress draft (does nothing in other modes).
Space (while held) Hand tool. The cursor changes to a hand immediately when Space is pressed; releasing it immediately returns to normal interaction even if panning is in progress.
While in cropping mode

In cropping mode, Return (confirm) and Escape (cancel) take precedence over all other keyboard handling.


5.12 Double-Click Routing

A double-click on the page is interpreted in the following priority order.

Priority Double-click location Result
1 On a plot axis title (X-axis title or Y-axis title) Begins inline editing in place.
2 On an annotation For text, begins inline editing; for a shape, begins entering text inside the shape, etc.
3 On a plot tile Opens Plot Settings (NeoFlow build only).
4 On an empty area (and while in selection mode) Creates new text at that position.

If a node is double-clicked while in Bezier edit mode, it toggles between Corner and Free (Smooth).


5.13 Save Confirmation When Closing a Layout Window

When the red × button of a Layout window is clicked, if the workspace has unsaved changes or contains one or more loaded FCS files, a confirmation alert "Close Window?" appears. This confirmation is always shown regardless of whether another Workspace window is open.

The body text depends on the situation.

Situation Body
One or more FCS files "n samples are loaded. / There are unsaved changes. / You can save the workspace before closing."
No FCS files "There are unsaved changes. …"

The buttons and their results are as follows.

Button Result
"Save and Close" Saves the workspace and then closes the window.
"Close Without Saving" Closes the window without saving.
"Cancel" Cancels closing.