@Graph at a Glance
@Graph is a macOS application for scientific data visualization, analysis, and charting. It is particularly suited to time-series measurements and has deep support for common neurophysiology file formats (ABF, AXGX, HDF5, NWB, and others) as well as fluorescence microscopy image sequences. Its five workspaces (the Data Log, Spreadsheets, Charts, Graphs and the Image Window) share data through a common flow: import → visualize → measure → chart and analyze. The omics plots are chart types, with their own page, Omics Visualization.
The Five Workspaces
- Data Log & Text Editors: The hub of every session. Results, statistics and exported values collect here as plain text, and you can type or paste data too. Selected text can be sent to a Chart or Graph. The built-in Math Evaluator computes values inline.
- Spreadsheets: A table editor for pasting or tidying tabular data and sending it to a Chart, Graph or Statistics. The Chart Spreadsheet edits a chart's data, the Graph Spreadsheet edits a graph's sweep data, and New Spreadsheet (⌥⌘N) handles general tables.
- Charts: A charting workspace for summary data. Accepts data from the Data Log, a pasted table, or a Chart Spreadsheet. Basic types are Bar / Dot, Horizontal Bar, Line, Scatter (X,Y), and Pie; statistical types add Estimation Plot, Box Plot, Ridge Plot, and Kaplan-Meier Curve; and an Omics Visualization group covers Volcano Plot (with MA Plot as a display mode), Heatmap, Dot Plot, Cluster Scatter, GSEA Bar, Grouped Diverging Bar, Stacked Composition Bar, PCA Plot, Manhattan Plot, Venn Diagram (2 or 3 sets), and UpSet Plot (any number of sets, clearest with 4 or more). Effect size brackets, estimation statistics, and a full statistics engine are built in.
- Graphs: The time-series waveform viewer. Opens ABF, AXGX, MAT, HDF5, NWB, NCS, ATF, Igor, HEKA and many other formats. Visualize, navigate, filter, baseline-correct, and measure recordings. Cursor measurements, peak detection, averaged sweeps, PSD/FFT, histogram, curve fitting, AP detection, synapse detection, and VI/IV plots all live here. Results flow automatically to the Data Log.
- Image Window: A fluorescence imaging workspace for TIFF, CZI, LSM, ND2 and LIF files, folders of TIFFs, and Prairie View T-series and Z-stacks. Channels are shown with selectable LUTs (including Emission λ, a pseudocolor matching the fluorophore's emission peak) and display ranges. A channel's Raw checkbox shows it in plain grayscale (on by default for single-channel images), and Smoothing is off by default, so pixels are shown as recorded. Draw ROIs (rectangle, ellipse, polygon, freehand, line) or detect them automatically, correct XY drift, and extract intensity traces over time; background ROIs have a dashed border. A scale bar appears automatically when pixel size is known. Sweep Mode options are Raw Intensity, ΔF/F₀, ΔF and Z-score. Traces can be sent to a Graph window or exported as CSV. Export Image… saves PNG, JPEG, TIFF, GIF, PDF or SVG, and Export Movie… saves MP4, ProRes or a TIFF stack, both matching the display; Export Data as TIFF… saves the raw pixel values as OME-TIFF or ImageJ TIFF.
Typical Workflow
A typical session follows these steps:
- 1. Import: Open a recording file (ABF, AXGX, HDF5, NWB and others) in Graphs, paste a data table into the Data Log or a Spreadsheet, drag a CSV onto a Spreadsheet window, or drop a TIFF or Prairie View XML onto the Data Log or Dock icon to open it in the Image Window.
- 2. Visualize: Graphs displays time-series waveforms with full navigation and overlay controls. Image Window displays fluorescence images with LUT controls, Z-projection, and ROI overlays. Charts renders summary statistics as bar, line, pie, or estimation plots.
- 3. Analyze: Graph measurements (cursors, peak detection, event detection) log automatically to the Data Log. Image ROI intensity traces can be background-subtracted and normalized before sending to a Graph window. Chart statistics (effect sizes with their CIs for differences in means, trimmed means, medians or ranks, then the matching tests) run from the Statistics tab.
- 4. Draw conclusions: Effect size brackets and estimation plots (Gardner-Altman / Cumming) make statistical results visible on the chart. Export figures as PDF, SVG, PNG, JPEG, TIFF or GIF, and export data as CSV or native formats.
Common paths
- Recording file → Graph → measure → Data Log → select → Chart Selection… → statistics + figure.
- CSV or pasted table → Spreadsheet → Data to Chart → statistics + figure.
- TIFF or Prairie View XML → Image Window → draw ROIs → Measure → Send to Graph → measure → Data Log → Chart Selection… → statistics + figure.
- Any Bar/Horizontal Bar/Line/Box Plot chart → Statistics tab → Show Estimation Plot (in the EFFECT SIZE zone) → the same chart shown as a Gardner-Altman or Cumming plot; click the button again to switch back.
If @Graph Quits Unexpectedly
Your unsaved work isn't lost. While you work, @Graph keeps a recovery copy of each graph, chart, spreadsheet, Text Editor and image window with unsaved changes, and of the Data Log. An image window's copy holds its settings, ROIs, overlays and view, and the image itself is read again from its original file, so copies stay small however large the stack. The next time you open @Graph, choose Reopen to bring those windows back as they were, still marked as unsaved; windows that came from a file save back to it with ⌘S. If @Graph asks for access to an image's folder, choose it so the image can be read again. An image whose file has been moved or deleted can't be reopened, and the Data Log says so. Choose Don't Reopen to move the copies to the Trash. Recovery copies never change your own files, and they're removed when you save, close the window or quit normally.
VoiceOver and the Keyboard
@Graph works with VoiceOver. Each chart and each graph panel reads as one item that says what it shows: the axes, and each group's n, mean (or median) and spread. Press VO-Shift-Return on it to hear the data as an Audio Graph. With Keyboard navigation turned on (System Settings → Keyboard), Tab moves between controls; use the Step buttons to change sweeps. Manhattan Plots, UpSet plots, spectrograms, histograms, the Spike Sorter's views and PSD, cross-correlation and coherence results have Audio Graphs too. On a Manhattan Plot, each point names its chromosome and position. On a heatmap or dot plot, the Row labels and Column labels items let you pick a label with VO-Up and VO-Down Arrow and rename it with VO-Space.
Data Flow Summary
File → Graph → Data Log → Chart is the primary path for recording-based workflows. Image → ROI traces → Graph → Chart extends this to fluorescence imaging. For data from any source, paste a table into the Data Log or a spreadsheet and send it to a Chart.
Getting Started
@Graph is a macOS app for visualizing, analyzing and running statistics on time-series, X-Y and category data, fluorescence images and omics tables. It reads a wide range of recording formats (ABF, HDF5, Igor Pro, MATLAB and many more), shows multi-channel, multi-sweep data in graph windows, and gives you tools for measuring, filtering, fitting and exporting.
The Welcome Window
The Welcome to @Graph window greets you at launch with your recent files and buttons for Open File / Import Data, Open Data Log, New Spreadsheet and User Guide, plus Sample Graph, Sample Chart and Sample T-Series. Drop a supported file on it to open that file, or click a recent file to reopen it; a file @Graph can't open is named, and a recent file that has since been moved or deleted is said to be missing and taken off the list. Hover over "Drop a file anywhere on this window to open it" for the kinds of files @Graph reads. The window closes by itself once a file opens.
- Open File / Import Data opens the Data Importer (see below).
- Sample Graph, Sample Chart and Sample T-Series let you try @Graph without a file of your own. Sample Graph is a synthetic current-clamp recording with 10 sweeps in each of 3 channels (membrane potential, current command and an LED trace), including 10 MΩ of uncompensated series resistance to try Rₛ correction on. Sample Chart is a small bar chart. Sample T-Series is a simulated calcium-imaging movie of one neuron, 86 frames at 20 Hz in 12-bit camera counts with 0.5 µm pixels, built from a real recording's resting image: the cell brightens 1.6 s in (peak ΔF/F about 1), decays over the next 2 seconds and bleaches slightly, with the camera's own noise. As in the recording, the brightest part of the soma saturates at the peak, so measure ΔF/F on its edge or the dendrites. All three are the same every time, and 'Show sample data buttons' in Settings → General → Session hides them.
- To skip the Welcome window, uncheck 'Show this window at launch' (or 'Show start-up window at launch' in Settings → General → Session). Help → Welcome to @Graph… (⌘@) brings it to the front at any time, or hides it when it's already in front. Help → @Graph User Guide (⇧⌘U) does the same for this guide.
Opening a File
- Drag any supported file onto the Dock icon or any @Graph window, including the Welcome window. @Graph opens it in the right kind of window.
- File → New Data Importer (⌘N) opens a drop zone that lists the importable file types by kind (Data Files, Image Files, Text / Spreadsheet Files). Drop a file on it or click Choose File….
- File → Open File… (⌘O) opens one or more files of the same types.
- Select tab- or comma-delimited numbers in the Data Log, then choose File → Graph Selected Text… (⇧⌘G) or Chart Selection… (⇧⌘H).
- A .txt or .rtf file opens in a Text Editor window. Select the data in it and use its Text Tools menu to send it to a Graph, Chart or Spreadsheet.
- File → New Spreadsheet (⌥⌘N) opens a blank grid. Type or paste your data, then click Data to Graph… or Data to Chart.
- Fluorescence images (.tif/.tiff, .czi, .lsm, .nd2, .lif, a Prairie View .xml, or a folder of TIFFs) open the same ways, each in a new image window.
The Data Log
The Data Log collects every measurement, fit and analysis result as a table. You can also paste numbers into it and graph them, or use it as a simple text editor (see The Data Log).
It records from the moment @Graph starts but stays hidden until you ask for it: ⌘L (View → Show Data Log) brings it to the front with everything logged so far, and pressing ⌘L again while it's in front hides it again without losing anything. The Welcome window's Open Data Log button brings it forward too.
Type an expression followed by = (for example 2+2=) and the result appears in blue; Enter on the numeric keypad evaluates the whole line. ⌘Z removes a result like any typing. ⌘S saves the log. After Clear, the next ⌘S asks for a new file, so the last one is never overwritten.
Windows, Tabs and Sessions
Files open as tabs or as separate windows, as set in Settings → General → File Handling. Tabs keep each kind together: graphs tab with graphs, charts with charts, and images, spreadsheets and text editors each with their own kind. Window → Merge All Windows gathers every kind at once, each into its own tabbed window (the Data Log, Welcome and the User Guide stay as they are); Window → Move Tab to New Window, or dragging a tab out of the tab bar, makes a tab a window again. The E-Phys Tools menu acts on the graph window you used most recently.
Windows aren't reopened at the next launch, and each launch starts a new Data Log, hidden until you open it (save one you want to keep with ⌘S; quitting asks first if it has unsaved results). To reopen your files, turn on 'Restore last session on launch' in Settings → General → Session: each window's file comes back (for a graph, the .@graph file you saved it as, with your analysis, or else the original recording).
Every change to the data (filtering, smoothing, baseline, scale and offset) can be undone with ⌘Z and redone with ⇧⌘Z. Saving writes a .@graph file and never changes your original recording. A file kept in iCloud Drive or Dropbox is replaced in one step, coordinated with the sync.
AI Assistant
The AI Assistant is an optional chat assistant. Ask about your open recordings and results in plain language, and it can run real measurements and analyses for you (detecting action potentials, fitting curves, computing input resistance, running statistics and much more) with the same engines as the inspector panels. The numbers it reports are computed by @Graph, not guessed.
Opening the AI Assistant
Turn it on first in Settings → AI Assistant (Enable AI Assistant). Then choose View → Open AI Assistant, or press ⌥⌘I from any window. It opens in its own window, which you can keep beside your data.
Choosing Who Answers Your Questions
The AI service picker at the top of the window chooses which service answers (the AI Assistant Settings… link beside it opens Settings → AI Assistant). @Graph doesn't run a model on your Mac, so this choice decides whose servers see your questions:
- Claude (Anthropic), ChatGPT (OpenAI), Gemini (Google) and Grok (xAI). Each sends your request to that company's servers using an API key you provide, which is why each needs a one-time opt-in (see below).
- Apple Private Cloud Compute: Apple's own server model. It needs no API key, since it runs under your Mac's Apple Intelligence, with a daily limit set by Apple (an iCloud+ plan raises it). It needs macOS 27 or later and a Mac that supports Apple Intelligence, and it also asks for a one-time opt-in. See Using Apple Private Cloud Compute below.
Each backend has a model picker to trade capability against speed and cost: Claude offers Sonnet 5.5 and Haiku 5.5, ChatGPT offers GPT-6.1 Sol and GPT-6 Luna, Gemini offers Gemini 3.1 Pro (preview) and Gemini 3.8 Flash, and Grok offers Grok 4.7 and Grok 4.3. The second of each pair, marked "faster, cheaper", is the default and handles most questions; choose the first for harder ones. A model you chose earlier moves to its newer version when @Graph updates, or to the default if it's no longer offered. Changing the model starts a new conversation. Switching backends sets the conversation aside and brings it back when you switch back. Settings → AI Assistant → Default Backend sets the backend and model the window starts with the first time you open it after launching @Graph. Until you choose one, it's Apple Private Cloud Compute, which is free, on a Mac that can use it, and Claude otherwise.
Choosing Tool Groups
The Tools button, under the AI service pickers, lists the assistant's tools in groups: Graph Editing, Graph Transforms, Measurements, Events & Spikes, Folder Batch, Charts, Statistics (effect sizes with their tests, ANOVA, mixed models and regression), Omics Plots, Imaging, and Spreadsheets & Text. All are on at first. Every request sends the description of each tool that's on, so turning off the groups you won't need makes each request smaller: it costs less, runs faster, and leaves the assistant fewer similar tools to choose between. Beside the button is roughly how many tokens each request starts with, counted for the AI service you chose. With every group on, a Claude request starts near 100,000 tokens, so turning off unused groups saves real money. A question sends one request, plus one more for each round of tool calls. These tokens are sent with every request, but depending on the provider, repeats within a few minutes may cost much less.
The Basic Tools at the top of the list are always on: listing open windows, screenshots, the Data Log, saving results to a file, and saving, exporting, duplicating and renaming windows. Deselect All leaves only these. The groups are listed under Graphs, Charts and Statistics, and Other Windows, each with a line on what its tools do; Select All turns them all on again. Changes apply from your next question, in the current conversation too, and are remembered the next time you open @Graph. If you ask for something that needs a group that's off, the assistant tells you which one to turn on. Private Cloud Compute works a little differently: it uses one group at a time (see below).
Using Apple Private Cloud Compute
Private Cloud Compute's context window holds about 32,000 tokens for everything: the instructions, the tools, the whole conversation and each answer. So with it:
- You choose one tool group at a time under Tools, where each group shows its size. Until you choose one, Send is off. The note beside Tools shows how much of the window the tools and instructions take.
- Answers are short: the numbers you asked about, with the full result in the Data Log.
- It never receives window screenshots.
- When the conversation nears the limit, or you change the group, @Graph condenses it: the assistant keeps a short summary of the last few questions and answers, and its next reply says so. Everything stays in the chat and the Data Log.
- Each person gets a daily number of requests, and every round of tool calls counts as one. The window shows when you're near or at the limit, with Apple's options for raising it, and the message at the limit says when it resets.
- If a question still doesn't fit after condensing, or the service is busy or times out, the message says what to try: smaller steps, rewording, waiting a minute or New Conversation.
Opting In to Data Sharing
The first time you use a backend, a consent sheet appears; nothing is sent until you click Allow. It lists:
- Provider: the company that receives the data.
- Data sent: your questions, and what the assistant's tools read to answer them: measurements, statistics and detected events, and, when a tool reads one, a window's contents (a spreadsheet's cells, a text editor's text, a whole trace, a spike list). If 'Attach window screenshots' is on (off by default; the checkbox is at the top of the AI Assistant window, and in Settings → AI Assistant), pictures of the windows it works with are sent as well (never to Private Cloud Compute).
- Purpose: the data are used to generate the analysis on the provider's servers.
- Your API key: stored in the macOS Keychain and sent directly to the provider, never through an @Graph server (for Private Cloud Compute, that no key is needed).
- Retention: a summary of that provider's data-retention policy, which differs between providers (for example, Google may use data sent with a free Gemini key to improve its products, but not with a paid key).
- Allow proceeds. Cancel leaves that backend unavailable: click Ask Again to see the request again, or pick another backend.
- 'Remember my choice for [Provider]' (on by default) remembers an Allow for that provider only, so you aren't asked again. Allowing Claude doesn't allow ChatGPT, and a Cancel is never remembered. Settings → AI Assistant → Reset Remembered Data-Sharing Consent… makes every backend ask again.
Every backend sends your questions to that company's servers (Apple's, for Private Cloud Compute; the others under your own API key), and that company's retention policy applies.
Bringing Your Own API Key
Claude, ChatGPT, Gemini and Grok each need your own API key from that company; @Graph does not supply one, and Private Cloud Compute needs none. The panel has a 'Get an API Key' link to the right page and a field to paste the key (then click Save Key). Keys are stored only in the macOS Keychain, never in an @Graph file, iCloud or an @Graph server. To remove a key, click Clear beside it in Settings → AI Assistant → API Keys.
Asking Questions and Running Analyses
Type a question and press Return (or click Send). While it works, Send becomes Stop; changes its tools made before you stop stay, and are listed. Long runs, such as spike sorting or measuring a whole folder of files, work in the background, so @Graph stays responsive meanwhile, and Stop ends them. New Conversation starts over: every request sends the whole conversation, so a long one gets slower and costs more. Copy Conversation copies the whole chat as plain text. When the answer needs a number from your data, the assistant runs the same measurement and analysis tools as the inspector panels and reports the result. For example:
- "What's the input resistance of this cell?"
- "Detect action potentials between 200 and 400 ms and tell me how many fired."
- "Fit an exponential to the decay after the peak and give me tau."
- "Run a t-test comparing these two columns." (or "Compare their medians": the assistant uses the same four Compare choices as the Statistics window)
- "Fit a mixed model to this table and show the profile."
The Assistant can set a graph's title, axis title and tick label fonts, as it sets a chart's. Name a font family as Font Book lists it, such as Helvetica Neue, or say System for the default; a font that isn't installed is refused and nothing changes. It can also set a channel's gain (Channel Gain…), using only a gain you tell it. Spectrograms and power spectra requested from the Assistant run in the background, and Stop cancels them.
Statistics answers lead with the effect size and its CI, then p, judged at the α that matches Settings → Statistics → Default confidence level (0.05 at 95%).
For repeated measures, give it a table with one row per subject: a group column (codes such as 0 = control, 1 = treated, or labels such as Control, Treated), one column per condition, and optionally a column naming each subject's source (Values from the same). Its mixed model reports each group's rate of change and how the slopes differ, the difference in level and the difference at each condition (with simultaneous CIs), then the Group × Condition test, and it can open the repeated-measures chart with brackets. On a repeated-measures chart it can change Time, Covariance and Values from the same, and switch the brackets to rate of change over the conditions you name, with the fitted lines if you ask (⌘Z undoes it). It also runs split-plot ANOVA and two-way ANOVA (two crossed factors, such as genotype × drug). See Linear Mixed Model under Statistics.
It works in other windows too:
- Imaging: draw, auto-detect, move, rename and delete ROIs; measure them (area, mean, SD, min, max and IntDen, as ImageJ's Measure gives them) and read an ROI's intensity trace; set a channel's LUT, color, visibility, Raw, Smoothing, Subtract or display range, or auto-contrast it (ImageJ's Auto: 0.35% of pixels saturated); move through Z and T, show the Z projection or Orthogonal Views, treat a stack as Z or T, and open an image's Export panels.
- Omics: read an open Volcano Plot's results (each feature's log₂ fold change with its CI, then p) and change its thresholds, and log-transform a PCA Plot or Heatmap.
- Charts: make a paired chart (the same subjects in every category) and set axis titles.
- Spreadsheets and text: read and edit a Spreadsheet's cells or a Text Editor's text, insert or delete rows and columns, and open new Spreadsheet and Text Editor windows.
You can ask for specific options, such as the fractional derivative threshold method for AP detection or a particular channel or time window, just as you would set them in the inspector. See AP Detection in the sidebar for what 'fractional derivative threshold' means. If an option doesn't apply to what you asked for (robust SEs on a dose-response fit, or charge on a voltage recording, since charge is computed only for currents), the result says it was ignored and why. For input resistance it uses your Settings → Neurophysiology fit options unless you ask for others in the request. Its tools that read a file or folder (sag, firing properties, input resistance, cursor windows, event detection and the other folder tools) measure each file as its graph window opens it: a saved graph keeps its own settings (its IV Rₛ correction, Set X = 0 and junction potential correction), as in Batch Processing, and each result says which settings were used.
Times you give and get back are as the graph's X axis shows them, after any Set X = 0. Values and thresholds are in the units the graph shows (pA, mV), also for a file the assistant reads from disk without opening it. A spreadsheet's cells are named as on screen: rows from 1, columns by letter. Sweeps and channels are numbered from 1.
Spontaneous synaptic events are detected as the Synapse Detection panel's Continuous mode, Batch Processing and Protocols detect them: a channel's sweeps joined end to end (one by one when their sample rates differ), with Mean Frequency the events divided by the time searched. So the assistant's counts, amplitudes and frequency match theirs.
Name the window to work on as its title reads. If a name could mean more than one open window, the assistant asks rather than guessing. With only one window of a kind open, "the graph" or "the image" is enough for a question, but a change made in a window always names it. Each chart the assistant opens gets a short ID it uses to find that chart again, so two charts with the same title don't get mixed up.
Every change the assistant makes is listed in the chat in orange, with how to undo it: ⌘Z in that window for a change made in place (including a spreadsheet's cells and a text editor's text), or closing the new window it opened. Each change is its own step, so ⌘Z takes back one at a time, even when the assistant made several at once. If a request fails or is stopped, the next one tells the assistant what its tools had already changed.
Nothing is written to disk without you. A new file goes through a save panel where you pick it, saving over a file that already exists asks first (Save, Cancel or Save As…), and the export tools open the usual Export panels, where you choose the options and the file.
Text the assistant reads from your files, cells and windows is treated as data, never as instructions: only your own messages ask it to act. If a file's text seems to ask for something, the assistant tells you and asks.
If a tool's result is very long (a whole long trace, say), the assistant sees only the first part, says so, and reads a smaller range instead. If a request fails, the red message under the conversation says what to do next: check the API key, check billing on the provider's website, wait a minute and ask again, or start a New Conversation. Changes made before the failure stay, and are listed.
With 'Attach window screenshots' on, each tool that uses a graph or image window sends the assistant a picture of it, taken after the tool ran, so it sees what the tool did. A window that hasn't changed since the last picture isn't sent again.
Voice Input
Click the microphone button to dictate a question. The text appears as you speak, and recording stops when you finish or click the button again. Transcription happens entirely on your Mac, in US English. A Mac with no microphone connected says so instead of recording. The button is off while a request is running.
Saved Prompts
To save a question you ask often ("Detect APs on the visible sweep and summarize"), type it and click the filled star beside the input field. The star menu on the left lists saved prompts: pick one to put it in the input field, where you can edit or send it, or use Remove… to delete one.
Check a surprising number from the AI Assistant as you would any other measurement.
Supported File Formats
@Graph reads all of the following formats directly, with no conversion step. Drop a file onto the Dock icon or any @Graph window to open it.
Native File Format
.@graph | @Graph Files File → Save (⌘S) writes the front window as a .@graph file: a graph, chart, spreadsheet or image, which reopens in the same kind of window. A graph's file holds the data together with grouping, display settings, group order and analysis state. It is HDF5, so h5py, MATLAB and HDFView can read the data directly: each sweep is a float32 dataset in the /acquisition/ group (sweep_0000, sweep_0001, …) with unit and sample_rate_hz attributes. A raster's spike times are also stored at full (float64) precision under /atgraph_v2/spike_times/. Settings and other metadata live in the /atgraph_v2/ group, which only @Graph uses; X values and error bars are stored there as datasets, so a graph with many of them saves and opens quickly, and the X variable's name is saved too. A file saved by a later version of @Graph asks you to update before it opens. Names and units are UTF-8 text, so symbols such as µ read correctly in h5py, MATLAB and HDFView. A graph saved with Rₛ correction keeps the uncorrected data in /acquisition/, and @Graph applies the correction when it opens the file. A .@graph file is not an NWB file: the /acquisition/ group name is the only resemblance, and NWB software such as pynwb or MatNWB won't open it. To share data as NWB, use File → Export → NWB. |
Read & Write
@Graph can both open and save back out to these formats:
.abf | Axon Binary File (v1 & v2) Clampex / pCLAMP recordings, ABF1 and ABF2. Samples are scaled to their recorded units, and each recorded channel opens as its own channel (a two-channel ABF opens as two channels) with its own units and name. Episodic, gap-free and event-driven recordings are read; event-driven sweeps keep their own lengths. The amplifier's telegraphed whole-cell Rₛ and Cₘ dials, filter and mode are read when the file stores them (ABF 1.8 keeps all but Rₛ), for voltage-clamp Rₛ correction and its clamp-mode check. The Data Log lists the protocol name, the file comment and the tags (comments typed during the recording) with their times. Sample rates show as whole numbers, such as 30 kHz, when the file's rate is within a part per million of one. On export, choose 32-bit (exact), written as ABF 2, or 16-bit (smaller, half the size), written as ABF 1.83 with each channel rounded to 16-bit steps across its range. The choice starts on the one that matches the graph: 16-bit when its samples are still a 16-bit ABF file's own, which it then writes back exactly. ABF holds at most 16 channels at one sample rate, with the same number of sweeps on each, and 16-bit can't hold gaps (missing values); a graph outside that is refused, with NWB or HDF5 suggested. Sweeps of different lengths share ABF's one sweep length: 32-bit pads the shorter ones with blanks, and the Data Log says so. pCLAMP, pyABF and neo read the exports. |
.axgx / .axgd | AxoGraph X AxoGraph X files and AxoGraph 1 and 2 files, with every column type. Channels and episodes are read from AxoGraph's trace groups, or else from the column titles, and a time column in ms is converted. A file without a time column (a table of measurements), or whose time column isn't evenly spaced (0, 1, 2, 5, 10 min), opens as X-Y data with that column as X; the Data Log says so. Tags and interval bars marked during the recording are listed in the Data Log. AxoGraph's display settings are kept when a file is exported with the same channels and sweeps, and a recording exported as AxoGraph reads back with exactly the same values and its recording date. |
.csv | Comma-Separated Values Opens as a Spreadsheet window, with the first row as column titles unless it is all numbers. The file's own rows decide how it is split: at commas, at semicolons (a European CSV with decimal commas) or at tabs, as @Stat reads the same file. From there, Data to Graph… (which asks for the delimiter, header row and X-axis mode) or Data to Chart makes a graph or chart. To write a Graph as .csv, use the toolbar's Export menu. |
.h5 / .hdf5 | HDF5 Every numeric 1-D or 2-D dataset in the file becomes a channel, wherever it is. Sample rate (sample_rate, fs, dt and the like), units and channel names are read from standard attributes; a dataset with no rate is plotted at 1 sample per second, and the Data Log says so. A file another program still has open (an acquisition in progress) is read too. On write: one float32 dataset per channel, [sweeps × samples] (row k is sweep k in h5py; NaN past a sweep's end), with units, sample_rate and the channel's name, plus sweep lengths and start times when known; a raster writes one dataset of spike times per unit under /units. Each channel keeps its own rate, so nothing is resampled, but one channel's sweeps must share a rate (NWB keeps each sweep's). @Graph reads its own export back as it was. |
.mat | MATLAB Reads level 4, level 5 (-v6/-v7, compressed or not) and v7.3 files: every numeric type, 1×1 structs (as struct.field) and Spike2 channel exports. The sample rate comes from a variable such as fs, srate or sample_rate, an interval such as dt, or an evenly spaced time vector; without one, X is the sample number. A [samples × sweeps] matrix is one channel of sweeps and a [channels × samples] matrix one channel per row. Spike-time vectors (names such as spike_times or ts) open as a raster. Variables on different time axes are not forced onto one: each set opens in its own window. Cell arrays and sparse matrices are skipped, and the Data Log says so. A text variable of several rows reads one line per row. On write: per channel a [samples × sweeps] matrix (NaN past a sweep's end) with <name>_sample_rate, <name>_units and, when known or needed, <name>_start_times and <name>_lengths, plus the recording's start (recording_start); a raster writes <unit>_spike_times vectors, with <unit>_spike_name (the unit's full name), <unit>_spike_win (the span recorded over) and <unit>_spike_t0 (its sweep's start). The file is level 5, which MATLAB and scipy.io.loadmat read; a recording too large for one level 5 variable (2 GB) is refused, with NWB or HDF5 suggested. @Graph reads its own export back as it was. |
.nwb | Neurodata Without Borders v2 Reads the time series in /acquisition/, including those inside containers such as LFP (or, when /acquisition/ has none, in /processing/): patch-clamp or extracellular, a 2-D series giving one channel per column, with the file's rate, units, conversion, offset and per-channel conversion (data × conversion × channel_conversion + offset, as pynwb). Spike times from /units open as a raster; a Units table without spike times isn't read as one. Each patch-clamp stimulus (in /stimulus/presentation) opens as a channel beside its recorded response, such as "Current stimulus (elec0)". Patch-clamp sweeps are lined up by sweep number; sweeps with no sweep number in common (voltage-clamp seal tests before current-clamp protocols, say) open in their own window. On write: an NWB 2 file that pynwb opens and validates, carrying its NWB schema so NWB tools and DANDI can check it on their own, with patch-clamp series (stimuli in the file's stimulus section, including the command an ABF file's protocol gives when no command channel was recorded), electrodes and the intracellular recordings tables, or ElectricalSeries with the electrodes table for extracellular channels, for a waveform, or the Units table for a raster, and the subject, session and electrode metadata entered in the export sheet (see Exporting). @Graph reopens both kinds of export exactly, sweep names included. The metadata of an NWB file it opens fills the sheet when you export it again. |
Recording Times
Many formats record when each sweep started and when the recording was made. @Graph keeps both, and saves them in .@graph files and in its own NWB, HDF5 and MATLAB exports (an ABF export keeps the sweep starts, and the date to the millisecond).
- Sweep start times, in seconds from the start of the recording, come from ABF, ATF, HEKA, SutterPatch, NWB, Intan, Open Ephys, Neuralynx, Blackrock, Plexon and TDT files. The first sweep can start after 0 when the file says so.
- The recording's date and time come from ABF, AxoGraph, HEKA, SutterPatch, NWB, Open Ephys, Neuralynx, Blackrock, Plexon and TDT files. Files that store local time without a time zone are read in your Mac's time zone.
- When a file opens, its Data Log line gives the date and time and the first and last sweep start times, or says the file records none.
- Click a sweep to select it: the Plot Style tab of the inspector shows when it was recorded, below its name.
- Some files record that each sweep's first sample isn't at time 0: AxoGraph times it one sample in, an Igor wave can have an X offset, and a single NWB series has a starting time. The graph opens with its X axis showing that true time, using the same shift as Set X = 0, so the data, cursors and measurements are unchanged. Set X = 0 works as usual, and Reset returns to this time. A saved .@graph reopens with the X shift it was saved with. Results that keep the recording's timing (Decimate, Interpolate, Resample, from the Graph Tools, protocols, batch processing or the AI Assistant) open with the same true time, and a result made from an open window also keeps that window's X view (see Cursors).
- Synapse Detection's Results Over Time and time-binned summary can use the recorded sweep times instead of a typed interval (see Synapse Detection).
- The AI Assistant's list of open windows includes each recording's date and sweep start times.
Plot Sweeps at Recording Time
View → Plot Sweeps at Recording Time draws each sweep at the time it was recorded, end to end along one time axis, instead of overlaid from 0. The X axis counts from the first sweep's start, and the time between sweeps shows as gaps. It is off by default, and the menu item is available only for a graph whose file records sweep start times.
- It changes only the display: the data, and every analysis of it, stay the same. It is saved with a .@graph file and can be undone.
- Zoom, pan and the hover readout work along the whole recording, and exported figures and pictures show the graph as the window does. Turning the option on or off returns the X axis to its full range.
- Cursors work in the overlay view. While sweeps are plotted at recording time, the cursors, interval bars, trend lines and Export Visible are off, and so are the panels that use cursors: Baseline, Graph Tools, Normalize, Measure, Peaks, Curve Fitting, AP Detection, Synapse Detection and Set X = 0. Turning the option off brings them all back as they were.
- A sweep with no recorded start time, such as a fit, isn't shown. The Data Log lists these sweeps when you turn the option on.
Read Only
@Graph opens the formats below but does not write them (TIFF aside: image windows export it, below). The resulting graphs can be saved as .@graph files or exported to any Read & Write format above.
Physiology / Neurophysiology Formats
Formats from patch-clamp, multi-electrode array (MEA) and extracellular acquisition systems. Continuous formats plot as waveforms; spike-event formats plot as a raster of spike trains. A file with parts that don't belong in one graph (streams at different rates, spikes beside continuous data, events) opens each part in its own window, titled with the part. A file with more than 4 parts (SutterPatch routines, HEKA series, streams) first asks which to open, all checked to start. A pause or gap in a recording starts a new sweep, named by its start time ("from 12.500 s"), never joined up as if continuous. A recording whose data, once loaded, would take more than about a quarter of the Mac's memory loads from its start, and a warning says how much was loaded. Formats that keep a recording in several files (Open Ephys, TDT, Intan's info.rhd and info.rhs, a HEKA .dat with a separate .pul, a Blackrock spec 2.1 .nsX with its .nev) ask for access to their folder when @Graph can't already read it.
.atf | Axon Text Format Tab-delimited text export from Clampex; a file saved with commas instead of tabs opens too. One time column (in s or ms), then one column per signal per sweep; several signals ('Trace #1 (mV)', 'Trace #1 (pA)', …) open as separate channels, each with the unit in its column header. A file whose first column isn't evenly spaced (uneven times, or a results table) opens as X-Y data with that column as X; the Data Log says so. |
.ns1 – .ns6 | Blackrock NSx Continuous multi-channel recordings, file specs 2.1 to 3.0 (including 3.0 with nanosecond PTP (Precision Time Protocol) timestamps, dated from the first packet), each channel scaled to its units from the header. Each pause in recording starts a new sweep; after a clock restart, sweeps are timed on from the end of the sweep before. Spec 2.1 files hold no calibration; it comes from the recording's .nev beside them, and without it the samples are raw ADC values. |
.nev | Blackrock / Ripple / Neuralynx NEV Spike times, as a raster: one train per electrode and unit (unsorted, sorted units, noise), at their times on the recording's clock (for nanosecond PTP timestamps, from the file's first event). Digital-input events open as a second raster, one train per input value, for use as trial markers. A restarted recording's runs open separately. A Neuralynx .nev opens as a raster with one train per event string, and the events are listed in the Data Log. |
.dat | HEKA / Pulse PatchMaster data files, bundled (the usual) or with a separate .pul file, in either byte order and every sample format, including long continuous acquisitions stored interleaved and PatchMaster NEXT (1.6 and later) files. Each series opens in its own window, titled with its label. Each sweep is an episode, and each trace (Imon, Vmon…) is a channel with its own length and sample rate, with leak traces as their own channels. A file with more than 4 series asks which to open. The clamp command (constant, ramp and continuous segments, with every increment mode) is rebuilt for each sweep from the file's stimulus tree (.pgf) in mV or pA, shown as a "Stim-DA-0" channel when no trace records it, and used like an ABF protocol by VI and IV plots, Rₛ correction and the membrane test. Sine, square and chirp segments, template files and PGF parameters aren't synthesized, because HEKA's file description doesn't define their shape well enough to reproduce; the Data Log lists each series' protocol, its segments and increments, and why a command wasn't drawn. Each Imon or Vmon trace uses the command from the amplifier that recorded it, or that amplifier's holding potential or current when the protocol doesn't use its D/A output; the Data Log notes a protocol that links an input to a different output. An input no HEKA amplifier drives (a second amplifier wired to Adc5, say) shows as "Adc5 input", in volts at the input, with a Data Log note. Set its gain with Graph Utilities → Channel Gain…. |
.pxp / .h5xp | Igor Pro Packed Experiment Reads Igor Pro packed experiments (.pxp and the HDF5-based .h5xp). Each wave keeps its name, length, sample rate and units; waves named as a numbered series (RecordA0, RecordA1…) in one data folder become the sweeps of one channel, and a 2-D wave's columns are its sweeps. X scaling in ms is converted to seconds. SutterPatch experiments (.h5xp saved by SutterPatch with a Sutter IPA or dPatch) open one window per routine ("R1 VI_Ch1", "R2 …"): each of the routine's signals (Voltage1, Current1, AuxIN1…) is a channel at its own sample rate, each sweep keeps its start time in its name ("Sweep 2 (2.210 s)"), and SutterPatch's own settings and analysis waves are left out. Text waves, and waves that can't be read, are left out, and the Data Log counts them. |
.ibw | Igor Binary Wave Reads single waves (versions 1–5, either byte order, every numeric type), both 2-D waves (rows = samples, columns = sweeps) and 1-D waves holding sweeps back to back, each ending in a NaN. Sample rate and units are read from the wave header. |
.rhd | Intan RHD2000 Every signal Intan records: amplifier channels (µV), auxiliary inputs, supply voltage, board ADC and digital inputs and outputs, and (in single-file .rhd recordings) temperature, each at its own rate (the auxiliary inputs at a quarter of the amplifier rate, supply and temperature once per data block). Also the "one file per signal type" and "one file per channel" formats: open their info.rhd. In files before version 3.0, the amplifier data are stored without the notch filter named in the file header. A recording that runs past the timestamp counter's limit (about 20 hours at 30 kHz) stays one sweep. |
.rhs | Intan RHS2000 (Stimulation/Recording Controller) Amplifier channels (µV), DC amplifier channels when saved (V), board ADC and DAC (V), and digital inputs and outputs (0 or 1), all at the amplifier rate. Each channel that delivered stimulation also shows its current in µA ("A-000 stim"). The onsets of stimulation, compliance limit, charge recovery and amp settle open as events in a raster window; a flag that turned on together on several channels is one train. Each start of current is an event, so a biphasic pulse with an interphase delay gives one per phase. Also the "one file per signal type" and "one file per channel" formats: open their info.rhs. The header's settings, electrode impedances and notes are listed in the Data Log, and the notes become the experiment description for NWB export. |
.ncs / .csc | Neuralynx One continuous channel per file, in µV from the header's scale (and sign, for an inverted input). Each stretch between gaps in the record timestamps is a sweep. Continuous channels are timed from the session's start, as the spike and event files are. |
.nse / .nst / .ntt | Neuralynx spikes Single electrode, stereotrode and tetrode spike files. The spikes open as a raster, one train per classified cell (cell 0 is unsorted), and their waveforms as a recording with one sweep per spike and one channel per wire, in µV. Times count from the session's .ncs files when @Graph can read their folder. |
.continuous | Open Ephys (legacy format) One file per channel. Opening one loads every channel of its processor in the folder: neural channels in µV, ADC and AUX inputs in V. Lost data and acquisition restarts start new sweeps. TTL events and messages (all_channels.events, messages.events) open as an Events raster, one train per line and direction ("TTL 1 on") followed by one per message; .spikes files open as a Spikes raster. Times line up with the continuous sweeps, and messages are also listed in the Data Log. Each .spikes file's waveforms open as a recording too, one sweep per spike and one channel per wire, in µV, scaled by the channels' bitVolts. (The gain stored in the file is rounded by Open Ephys and reads 2.6% high, so it isn't used.) |
.oebin | Open Ephys (Binary format) Open the recording's structure.oebin. Each stream (a probe's AP and LFP bands, an NI-DAQ board…) opens in its own window, read from continuous/<stream>/continuous.dat, with sweeps split where the sample numbers jump. A Neuropixels SYNC channel opens on its own. The recording's TTL events and Message Center text open as an Events raster, timed on the clock of the stream they were recorded with, and the Spike Detector's spikes as a Spikes raster, one train per electrode and unit. Each electrode's waveforms open as a recording, one sweep per spike (starting before its peak by the detector's pre-peak samples) and one channel per wire, in µV. |
.plx | Plexon Continuous channels (one window per rate: wideband at 40 kHz, field potentials at 1 kHz…), sorted spike times as a raster, and events (including strobed values) as another, scaled as each file version specifies. If the header's gains give an implausible input range (placeholders left by a file converter), the load warning says so and JP Correction is off for the file. |
.pl2 | Plexon PL2 (OmniPlex) Plexon hasn't published this format, so @Graph can't read it directly. Convert the file to .plx with Plexon's free PlexUtil, or to NWB with NeuroConv, and open the converted file. Opening a .pl2 shows these steps. |
.tsq | TDT block Open a block's .tsq. Stream stores (from its .tev, or their own .sev files) open one window per rate, float stores in volts and integer stores as recorded; snippets as a raster of spike times by channel and sort code, and epocs as another. One block per file opened. |
Fluorescence Image Formats
Open images by dropping them onto the Dock icon or any @Graph window, or with File → Open File… (⌘O). They always open in a new image window. A file holding more than 4 images (scenes, positions or series) asks which to open, all checked to start. To write the pixel values back out, use the image window's Export menu → Export Data as TIFF…, which saves every channel, Z slice and time point as OME-TIFF or ImageJ TIFF, with pixel size, Z step, frame times and channel names and colors, for Fiji or Python (see Imaging Analysis).
.tif / .tiff | TIFF, ImageJ and OME-TIFF 8-, 16- or 32-bit integer samples (signed or not), packed 9- to 15-bit samples (a camera's 10- and 12-bit stills), and 32- or 64-bit floating point, uncompressed or LZW, Deflate or PackBits, including BigTIFF; an RGB image opens as three channels, without its alpha (transparency). 1-bit, 16-bit floating-point, JPEG and zstd TIFFs are refused with a message. A palette (indexed-color) image opens as its red, green and blue, except an ImageJ image with a lookup table, which keeps its values as one channel in the table's color. A plain multi-page TIFF opens as a T-series, and the Data Log says so (or a Z-stack with 'Treat T-series as Z-stack'); a stack saved by tifffile (Python, napari) opens with its channels, Z and T. A plain ImageJ stack opens as a Z-stack, as in ImageJ, unless it records a frame interval and no Z spacing; 'Treat Z-stack as T-series' switches it. ImageJ hyperstacks and OME-TIFF open with their channels, Z and T, and their calibration (an OME-TIFF's per-plane times included); an OME-TIFF describing several images opens each in its own window. ImageJ composites open in their saved channel colors, and ImageJ and Fiji TIFFs with their saved display range. |
.xml + .tif | Prairie View Prairie View 4 and 5 T-series and Z-series: the .xml and the TIFF files beside it. Drop the .xml file or its folder; @Graph asks for access to the folder if it can't already read it. Bit depth, pixel size, Z step (all Z devices added up), the time between time points and channel names are read from the XML. A bidirectional Z-series is put in one direction. |
folder | TIFF folder A folder containing TIFF files is opened as a T-series, in natural name order (img2 before img10). Files holding several pages each open with every page, in file then page order. A folder of ImageJ Z-stacks, one per time point, opens as a Z-stack over time, and a folder holding an OME-TIFF set opens as that set; files with their own channels are refused (open one of them instead). A folder saved by Fiji takes its pixel size from the first file. Enable 'Treat T-series as Z-stack' in the Channels panel to reinterpret as a Z-stack. |
.czi | Zeiss CZI Zeiss confocal format from LSM 800 / 900 / 980 / Axioscope / Airyscan systems. Multi-channel, multi-Z, multi-T, including combined T×Z acquisitions, uncompressed or with ZEN's lossless (zstd) compression. Each scene opens as its own image, tile scans are stitched at their recorded positions, and a color camera's exposure (DAPI, GFP, DIC…), recorded in red, green and blue, opens as one channel, their sum, in the color that holds its signal (gray when none does); Settings ▸ Imaging can keep the three colors as channels instead, for a stained brightfield image. 8- or 16-bit. A line scan along Z (an XZ scan) opens as one image per time point with Z down the vertical axis, as ZEN shows it. Channel colors, names and voxel sizes (X, Y and Z) are read from embedded XML metadata, and channels open in their recorded colors. JPEG XR, JPEG and LZW compression, and floating-point pixels, are refused with a message saying how to save the file instead. |
.lsm | Zeiss LSM LSM 510 / 710 / 780 / 880 files: multi-channel Z-stacks, time series and T×Z, 8-bit, 12-bit or floating point, including files over 4 GB. Channel names and colors, voxel sizes (X, Y and Z) and the time between time points are read from the file. Line scans open as one image with time down the vertical axis, X-Z scans with Z down it. Only the first position of a multi-position file opens, and the Data Log says so. Channels open in their recorded colors. |
.nd2 | Nikon ND2 NIS-Elements' native format, from NIS-Elements 3 on. Each XY position of a multipoint acquisition opens as its own image, named as in NIS-Elements. Multi-channel, multi-Z and multi-T, including a full Z-stack at every time point; the separate Z and T controls above the image (see Imaging Analysis) let you move through both. 8- or 16-bit, uncompressed or losslessly compressed; a color camera's exposure (DAPI, GFP, DIC…), recorded in red, green and blue, opens as one channel, their sum, in the color that holds its signal (gray when none does); Settings ▸ Imaging can keep the three colors as channels instead, for a stained brightfield image. Channel names (or, when every channel has the same description, as a color camera's do, the optical configurations), emission wavelengths and pixel size (X, Y and Z-step) are read from the file when present, and channels open in their recorded colors. Lossy (JPEG 2000) and floating-point files are refused with a message. |
.lif | Leica Image File Leica LAS X format. Every image series in the file opens in its own window, titled with the file and series names. Multi-channel (including color camera images), Z-stacks, time-lapse and combined T×Z, 8 to 16-bit. Channel names (the dye, when the file records one), colors, pixel size (X, Y and Z) and frame interval are read from the file. FLIM acquisitions (FALCON / STELLARIS) add the images LAS X computed as extra channels, hidden at first: Intensity, Fast Flim (ps), Standard Deviation (ps) and Phasor Intensity. Spectral (λ) scans, floating-point series, the phasor coordinates and the raw photon data are not read. |
Spreadsheet and Omics Matrix Formats
.xlsx | Excel Workbook Opens as a Spreadsheet window. Only cell values are read (not charts, images, drawings or formulas). Each number is its stored value, so a cell formatted as 45% is 0.45. Cells formatted as dates or times show as 2026-10-05, 14:30:00 or both, as Excel shows them (1900 and 1904 date systems), with milliseconds when they have any (14:30:00.250); elapsed times such as [h]:mm:ss stay numbers, a count of days (36:00:00 is 1.5). Error values (#N/A, #DIV/0!) show as Excel shows them and count as missing values. Hidden sheets aren't offered. Excel's escaped characters (_x000D_ for a line break) are read as the characters. Large sheets of several hundred thousand cells open; a sheet whose cells span more than 25 million (a stray value far from the data, usually) reports an error. A workbook with more than one sheet asks which sheets to open; several open as tabs of one window (see Opening Files from the Data Log). Password-protected workbooks are not supported and report an error. |
.numbers | Apple Numbers Document Opens as a Spreadsheet window, same data-cells-only scope as .xlsx. Dates show as an Excel workbook's do (2024-01-15 or 2024-01-15 13:30:00). A document with more than one table asks which ones to open, listing each table's size; several open as tabs of one window. A document last saved by an old version of Numbers, whose cell storage differs, reports an error (open it in a current Numbers and save it again). |
.dta | Stata Data File Stata 7 and later (formats 110 to 119). Opens as a Spreadsheet window with the variable names as the header row. Numbers keep full precision, value labels are shown as their text, dates and times show as dates (%tw, %tm, %tq and %th in Stata's own 2024w12 style), and missing values (., .a to .z) are blank cells. Variable labels and notes are not imported. Files from Stata 6 or earlier: save them again from a newer Stata. |
.pzfx | GraphPad Prism (XML) Prism's XML project format. Each data table opens as a Spreadsheet window; a file with several asks which to open, listing each table's kind (XY, Column, Grouped and so on) and size, and several open as tabs of one window. Columns are the X values, row titles and every data set's subcolumns, named as the R package pzfx names them (Control_1, Control_2 for replicates; Control_MEAN, Control_SD, Control_N for entered means). Values excluded in Prism are left blank, since Prism leaves them out of its analyses. Graphs, results and layouts are not read. |
.prism | GraphPad Prism 10 and Later Prism's current project format. Read the same way as .pzfx, with the same column names: each data table (XY, Column, Grouped, Survival and the others) opens as a Spreadsheet window, and a file with several asks which to open (several open as tabs of one window). Entered CVs and high/low limits come in as Prism shows them. Values excluded in Prism are left blank. Graphs, analysis results, layouts and info sheets are not read. A damaged or incomplete file reports an error rather than opening with wrong values. |
.gct | Gene Cluster Text (Broad Institute) Versions 1.2 and 1.3. Opens as a Heatmap window with row and sample names (version 1.3's row and column fields aren't shown). The file must have as many rows and samples as its header declares. For sample class labels, select the .cls file with the same name together with the .gct and open both: each sample's class is added to its name. A .cls file on its own has no values to plot. |
.txt | GEO Series Matrix (NCBI) A GEO series matrix file (…_series_matrix.txt) is recognized by its content and opens as a Heatmap window, with the samples named by their titles. GEO serves it compressed (.txt.gz): decompress it first. |
.loom | Loom HDF5-based single-cell expression matrix. Opens as a Heatmap window, genes as rows and cells as columns. Use 'Hide all-zero rows/columns' in the Plot Style panel for sparse matrices. |
.h5ad | AnnData (H5AD) AnnData's HDF5-based single-cell format, dense or sparse (CSR or CSC). Opens as a Heatmap window, genes as rows and cells as columns. Gene and cell names are read whether stored as text, as nullable text or as categories. A file holding several matrices (X, raw/X, layers such as counts) asks which to open, with X, the main one, selected; raw counts are usually in layers/counts or raw/X. Files from anndata before 0.7 open too. |
A heatmap is built from at most 100 million values, and a table of more than 3,000 rows asks before it is drawn. A single-cell file of tens of thousands of genes by tens of thousands of cells is over the limit: save a subset first, such as the highly variable genes or a sample of the cells. Loom and h5ad files compressed with gzip (the usual) are read; LZF or Blosc compression isn't.
General Text Formats
.rtf | Rich Text Format Opens in a Text Editor window, as a .txt file does, with its formatting removed. Save (⌘S) asks for a new file name, so the original keeps its formatting. |
.txt / .tsv | Plain text / TSV A .tsv file opens as a Spreadsheet, like .csv. A .txt (or .text) file opens in a Text Editor window named after the file, and Save (⌘S) writes back to it. Text in UTF-8, UTF-16, Windows-1252 or Mac OS Roman reads correctly, and a file over 20 MB asks before it opens. To plot a table in it, select the table and use Text Tools (Graph Selection…, Chart Selection…, Send to Spreadsheet… or Smart Visualization…). A GEO series matrix .txt opens as a Heatmap instead (above). To write text from a Graph, export as .csv; a Text Editor window's Save (⌘S) writes whatever plain-text extension you type. |
The Data Log & Text Editors
The Data Log is @Graph's central hub: a plain-text window that collects every measurement result, statistical output and exported value from the other workspaces. It is also a simple text editor where you can type, paste and edit data. Any numeric table in a text window can be selected and sent to a Chart, a Graph or a Spreadsheet.
- Open with ⌘L, or View → Show Data Log. ⌘L brings the Data Log to the front, and when it's already in front, ⌘L (View → Hide Data Log) hides it.
- Results are always added at the end; nothing is overwritten. When the log grows past about 5 MB, @Graph offers to save it to a file and start a fresh one (it's cleared only after the save succeeds).
- Save (⌘S) and Save As (⇧⌘S) keep it as a text file, the toolbar's Clear button empties it (after asking), and Edit → Find (⌘F, ⌥⌘F to replace, ⌘G for the next match) searches it. File → Print… (⌘P) prints it, and File → Duplicate (⇧⌘K) copies it into a new Text Editor window.
- ⌘= and ⌘− make the text larger or smaller, and ⌘0 returns to the default size set in Settings → General → Data Log.
- Lines are kept whole, so wide tables stay lined up: scroll sideways to read them, or turn on the toolbar's Wrap Lines button to wrap long lines to the window's width (a logged table's rows are then cut off at the edge, to keep their columns lined up).
- Drop a supported file onto the Data Log to open it (see Opening Files from the Data Log, below).
- Select a tab- or comma-delimited table and choose Text Tools → Chart Selection… (⇧⌘H) to open it as a Chart.
- The built-in Math Evaluator computes expressions inline (see Math Evaluator, below).
- New text editor windows (File → New Text Editor, ⇧⌘N) have the same Text Tools as the Data Log.
Opening Files from the Data Log
Drag any supported file onto the Data Log window to open it. Drag-and-drop, File → Open File… (⌘O) and the New Data Importer window (⌘N) all accept the same file types.
- Recordings open as a new Graph: .abf, .axgx, .axgd, .pxp, .h5xp, .ibw, .atf, .dat, .mat, .nwb, .h5, .hdf5, .ncs, .csc, .nse, .nst, .ntt, .rhd, .rhs, .continuous, .oebin, .ns1–.ns6, .nev, .plx, .tsq (Plexon .pl2 files need converting to .plx or NWB first). Spike-event files (.nev, and the spikes in .plx and TDT blocks) open as a raster of spike trains rather than a continuous waveform; a file with several parts opens each in its own window, and asks which to open when it has more than 4 (see File Formats).
- Opening a file that's already open brings its window forward, including one still loading. A window counts as the file it was opened from or last saved as; a duplicate or a result window (an average, Delete Sweeps, a power spectrum) only carries the file's name, so the file opens in a new window.
- With Open files: Tabs, each kind of window tabs with its own kind: a recording opened over an image opens as a window of its own, and an image over a graph. File menu items that don't apply to the window in front (Save in the AI Assistant, Export in a Text Editor) are dimmed.
- A graph's data table (the Spreadsheet button) is one window per graph, brought back when you click again, and closes with the graph. ⌘S and ⇧⌘S there save the graph. Tool windows (Spectrogram, Cross-Correlation, LFP Oscillations, Slow AHP, Spike Sorter) name the graph as it is called now, after a rename or Save As, in their results and Data Log lines.
- Image files open as a new Image Window: .tif, .tiff, .czi, .lsm, .nd2, .lif, a Prairie View .xml, or a folder of TIFFs.
- Omics matrix files open as a new Heatmap window with row and column names and values filled in: .gct (Gene Cluster Text; open it together with its .cls file for sample classes), a GEO series matrix .txt, .loom, and .h5ad (AnnData).
- .gct: when the Name column holds database IDs (Ensembl, Entrez, probe IDs) and the Description column, or a version 1.3 symbol field, holds gene symbols, rows are labeled with the symbols; a symbol shared by several probes is shown as "symbol (ID)", and a row without one keeps its ID. A Description column that isn't used is mentioned when the file opens. In the .cls file, labels that are the class names themselves are used as they are; numeric labels take the class names in order of first appearance.
- GEO series matrix: columns are named by sample title, with the GSM accession added when two samples share a title. An RNA-seq series matrix holds sample information but no expression values, since GEO keeps the counts in the series' supplementary files; @Graph says so and names the supplementary files the series lists, so you can download the counts table and open it.
- .h5ad: a file can hold several versions of the data. When it has more than one, @Graph asks which to open: X, the main matrix, often normalized and log-transformed (the default); raw/X, which often has every gene; or a layer such as layers/counts, usually raw counts (integer matrices are marked "likely raw counts"). Gene names come from a gene-symbol column when the file has one (feature_name, gene_symbols, gene_symbol, symbol or gene_name), otherwise from the gene index, often Ensembl IDs. A gene with no symbol keeps its index name, and repeated names get -1, -2 and so on, as in scanpy. A note after opening says which matrix and which name column were used.
- .loom: gene names come from the Gene row attribute, or Accession when there is no Gene, and a note after opening says which; repeated names are made unique as for .h5ad.
- Spreadsheet files (.xlsx, .numbers) open as a Spreadsheet window (data cells only, not embedded charts or images). So do Stata data files (.dta) and Prism projects (.pzfx and .prism), one window per data table. A file with several sheets or tables asks which to open (below).
- Delimited files (.csv, .tsv) open as a Spreadsheet. Text files (.txt, .text, .rtf) open in a Text Editor window named after the file, with an RTF file's formatting removed. To plot their data, select it and use Text Tools (Graph Selection…, Chart Selection…, Send to Spreadsheet… or Smart Visualization…). A text file over 20 MB asks before it opens.
- Save (⌘S) in a Text Editor opened from a .txt file writes back to that file. Text from an .rtf file is saved as a new plain-text file, so the original keeps its formatting.
- @Graph documents (.@graph) reopen in the kind of window they were saved from: Graph, Chart, Spreadsheet or Image.
Files dropped onto the Dock icon or any other @Graph window open the same way, except an empty spreadsheet, which loads a dropped table or recording into its own cells.
Choosing Sheets and Tables
When a workbook or Prism file holds several sheets or tables, @Graph lists them with a checkbox each, with the table's size and kind when the file states them. The first is checked, so Return opens it right away.
- Check the ones you want, or click Select All (⌘A). Select All shows a dash when only some are checked; clicking it then checks them all.
- Click Open (its title counts them, such as Open 3 Sheets): one opens as its own Spreadsheet window, several open as tabs of one window, in the file's order.
- Space checks or unchecks the highlighted row (move with the arrow keys), Return opens, and Escape cancels.
- Double-click a row to open just that one.
- Opening many shows a small progress panel; Stop keeps the ones already open. Any that can't be opened (an empty sheet, say) are listed together at the end.
Automatic Logging
Every measurement (Measure, Peak Analysis, AP Detection, curve fitting, statistics, sag analysis, VI/IV plots, synapse detection) writes its results to the Data Log automatically, in order.
Sweep Numbers in Output
By default, result tables include a Sweep column only when the measured sweeps aren't an evenly spaced run (such as sweeps 1, 2, 5). For a run such as 1–10 (or every 2nd sweep) the column is left out. Turn on the 'Show Sweep Names' button in the Data Log toolbar to always include it.
Graphing Pasted Data
- Type or paste tab-, comma-, semicolon- or space-separated numbers into the Data Log.
- Select the numbers (optionally with column headers).
- Choose File → Graph Selected Text… (⇧⌘G).
- Set the delimiter, header row and X-axis mode, then click Graph Data. With 'Y columns only', give the time between samples with its unit (such as 0.05 ms or 50 µs), and the sample rate is worked out from it.
The delimiter is detected automatically, so data pasted from a spreadsheet, a CSV file or space-separated output needs no reformatting. Values copied as a spreadsheet shows them are read as numbers: "45%" is 45, and "$1,234.50" or French Excel's "1 234,5" is 1234.5. Error values such as #N/A and #DIV/0! are missing values. A cell marked with a limit, such as <0.5 or >29, says only that its value lies past that limit. Every analysis treats it as missing, and the data checks, the result and the figure legend say how many there are; only the mixed model for profiles can fit it instead (Fit values past a limit).
For grid-based entry, use File → New Spreadsheet (⌥⌘N). Paste a table into it, then click Data to Graph… or Data to Chart.
Math Evaluator
Type an expression on a line (such as '3.14 * 25^2' or 'sqrt(144)') and press Enter on the numeric keypad (Return just starts a new line). The result appears on the next line in blue. You can use + − * / ^ (power) and %, parentheses, functions such as sqrt(), sin(), cos(), tan(), ln() and log() (natural log), log10(), exp(), abs(), round(), min(), max() and pow(), and the constants pi (or π), tau (2π) and e, written in lowercase. You can paste the signs × · ÷ and −. Write every multiplication: 2*x, not 2x.
You can also type an expression followed by '=' anywhere in a line (such as '88*3=' or 'The value is 37*81=') and the result appears in blue right after the '='. Text you type afterward is in the normal color. Whole numbers below 10^15 show in full; other results show 13 significant digits. A lone number and anything shaped like a date (2024-05-01, 1/2/2024, or a number with a leading zero such as 05) get no result, with = or with keypad Enter, so a column of numbers typed on the keypad just starts new lines. The calculator also gives no result rather than a wrong one when it can't tell where the expression starts: for a lone constant ('pi='), for an expression that follows a number, an operator or a unit ('5 mV * 2=', 'dose 1 000 * 3='), and on a line longer than 1,000 characters. Keypad Enter evaluates the whole line. Operators, functions and constants are those of Formula fits (Curve Fitting), plus tau (2π); see there for how ^, % and round behave.
Text Tools
The Text Tools menu has actions that open the selection in a new window, then text-transform utilities:
- Graph Selection… (⇧⌘G): opens the selected text as a graph (time-series / sweep data).
- Chart Selection… (⇧⌘H): opens the selected text as a bar, line, pie, or estimation chart.
- Send to Spreadsheet…: opens the selected table in a new Spreadsheet window, its first row as column names when it names them.
- Omics Plot: Volcano Plot… (⌥⌘L), Heatmap Selection… (⌥⌘M), Dot Plot Selection…, Cluster Scatter Selection…, GSEA Bar Selection…, Compute GSEA (Permutation)…, Grouped Diverging Bar Selection…, Venn Diagram Selection…, UpSet Plot Selection… and Manhattan Plot Selection…. See Omics Visualization for what each one needs.
- Kaplan-Meier Selection…: a survival curve from a Time / Status / Group table.
- Smart Visualization… (⇧⌘V): weighs the evidence in the data's shape, values and headers for each destination: whether it suits a Graph, a Chart, a Scatter (X,Y) chart, a Kaplan-Meier curve or one of the omics plots, and opens that window. It opens the best one only when the evidence clearly favors it. For a close call it asks "What Kind of Data Is This?", names its best guesses, and offers a menu of every destination with the best guess already chosen, so Return opens it. The omics plots, Scatter, Manhattan and Kaplan-Meier read tables separated by tabs, commas or semicolons.
- Smart Visualization examples: a recording or a column of samples that follow on from one another opens as a Graph, and one column of separate measurements as a Chart of their spread; two measures on different scales (height and weight) open as a Scatter, and two groups on one scale as a Chart; a time and status table headed so (Time, Event, Group) opens as a Kaplan-Meier curve; and long-form two-factor data with replicates (Genotype, Treatment, Response) opens as a grouped Chart.
- Smart Visualization of long tables: a long table whose text columns are a group and a column named like where each row came from (Animal, Batch, Subject, Site…), with a value column, opens as a Chart read One Row per Value. The Statistics tab then suggests that column under Values from the same, and applies it only when you choose. Two real factors (Genotype and Treatment) still open as a Grouped Chart, which offers the One Row per Value reading if one of its factors looks like where each row came from.
- Statistics… (⌘T): opens the Statistics window with the selected text loaded.
- Convert Lists / Table (⇧⌘L): converts between blank-line-separated lists and a tab-delimited table.
- Transpose Table (⇧⌘X or ⌃⇧X): swaps rows and columns of the selected tab-delimited table. In a text window ⇧⌘X works only when text is selected (elsewhere it opens a graph's Data Transform panel); ⌃⇧X always works.
- Reverse List Order (⇧⌘R): reverses the order of rows.
- List Stats (⇧⌘T): computes mean, SD, SEM and count for each column and adds the result inline. Decimal commas (1,5) are read as they are elsewhere in @Graph, and NA or other text cells are left out.
For separate logs for separate experiments, use File → New Text Editor (⇧⌘N) to open an independent text window.
Spreadsheets
@Graph has three spreadsheets: the Graph Spreadsheet (attached to a graph window), the Chart Spreadsheet (attached to a chart window), and the standalone New Spreadsheet window.
In all three, drag the line between two column headers to make the column on its left wider or narrower (the table scrolls sideways when it outgrows the window), or double-click the line to fit the column to its contents. Widths stay as you set them while the window is open, and stay with their columns when others are inserted or deleted. A row grows to show every line of a cell typed over several lines (Option-Return starts a new line while you edit), and the other rows keep their usual height.
Graph Spreadsheet
Click the spreadsheet toolbar button (grid icon) in a graph window to open an editable table of the sweep data. The first column is time; each other column is one sweep.
- Double-click a cell to edit it. Press Return to commit and move to the next row. A decimal comma is read; text that isn't a number is refused and the cell keeps its value. An empty cell is a gap.
- Click a column header to select the column, or a row number in the left gutter to select the row. Shift-click to extend, ⌘-click to add or remove one cell. Right-click a header for Copy Column, Paste Into Column (one value per line; a heading on the first line is skipped) or Clear Column (blanks the column, as Delete does).
- Copy (⌘C) first asks whether to include headers and whether to round to a fixed number of decimal places; otherwise each value is copied exactly as stored.
- Paste (⌘V) pastes tab-separated text at the selected cell, or the first data cell with nothing selected (a single value fills every selected cell; a heading row, as Copy with headers writes, is skipped). If the block is larger than the grid, the data grows to fit, with new sweeps as columns and new samples as rows, empty until filled. Columns can't be added while one channel of several is shown, and cells that aren't numbers are pasted blank. Either way @Graph says what was left out.
- Delete clears the selected cells.
- All edits can be undone with ⌘Z (a paste or Delete restores each column it changed, and the original grid size if the paste enlarged it).
Edits change the graph's data directly. Save with ⌘S to keep them in the .@graph document.
Chart Spreadsheet
Click the spreadsheet button (⊞) in a chart window's toolbar to edit the chart data as a grid, in the orientation it was pasted or typed: usually each column one category (group) and each row one replicate.
- Double-click a cell to edit it. Press Return to commit. Delete clears the selected cells in one undoable step.
- The Paste button replaces the whole table with the clipboard data, growing the grid to fit (a 50-row table pasted into a 5-row chart gives 50 rows). For more than one row, @Graph first asks whether the first row holds column titles. ⌘V pastes into the selected cells.
- The Copy button copies the whole table as tab-delimited text, and ⌘C copies the selected cells.
- Fill: drag one of the dots on the edges of a cell (or of a selected block) to copy it into the cells you drag over, or use Edit › Fill Down (⌘D) and Fill Right (⌘R), as in New Spreadsheet below.
- Insert or delete rows and columns from the menu (the arrow) on each column header or row number. To delete several at once, select them (Shift-click or Command-click the headers or row numbers, or select a range of cells), then click the arrow on one of them and choose Delete Selected Rows or Delete Selected Columns; with several selected, the Insert items add that many at once, for example Insert 3 Columns Before. Undo brings them all back.
- Double-click a column header to rename it; Option-Return starts a new line, which the chart stacks under the bar. The header grows to show a stacked name on all its lines.
- Undo (⌘Z) / Redo (⇧⌘Z): up to 50 levels.
- Transpose: swaps rows and columns in this table view only; the chart's data doesn't change. Handy if the table appears sideways compared with how you typed it.
- Columns Are Conditions, for a label column followed by several number columns: OFF (default) treats each row as a group and its numbers as replicate values; ON treats each column as a condition and each row as one subject (repeated measures). @Graph cannot always tell these apart, so you choose. Toggling rebuilds the chart from your original paste. When the column headers look like distinct condition names, @Graph asks once when the chart first opens and remembers your answer for that chart.
- Each Column Is a Category, for all-number data with no row of column names: ON treats each column as its own group; OFF treats the first column as row labels and the other columns as replicate values.
- Charts whose data isn't a table of groups (Volcano, Dot Plot, Cluster Scatter, GSEA Bar, Grouped Diverging Bar, Stacked Bar, Kaplan-Meier, Manhattan and Scatter) don't show Transpose or the two switches above. Heatmap and PCA Plot show a simpler matrix table.
New Spreadsheet (standalone)
File → New Spreadsheet (⌥⌘N) opens a blank 20 × 20 grid in its own window, titled 'Spreadsheet 1', 'Spreadsheet 2' and so on until you save it. Row 1 and column A start out marked as headers; change this from the menu on a column header or row number.
- When the grid is empty, it shows how to start: drop a data file onto the window, or paste data with ⌘V.
- Drop a text table (.csv, .tsv, .txt, .rtf) onto an empty spreadsheet to load its cells as they are, text columns included, the first row a header when it names the columns; or a recording (.abf, .axgx, .mat, .h5, .dat, .ncs, .ibw, .atf, …) to load one column per sweep, beside a Time column. Dropping onto a spreadsheet that already has data opens a new spreadsheet window. A GEO series matrix file opens as a Heatmap instead, and workbooks (.xlsx, .numbers, .prism, .pzfx, .dta), .@graph documents and other files open in their own windows.
- Click a cell to select it (it becomes the paste anchor). Shift-click another cell, or drag, to select a rectangle. Command-click a cell or a row number to add it to the selection or remove it.
- Click a column header (A, B, C…) or a row number to select the whole column or row; Shift-click to extend.
- Paste (⌘V): pastes at the selected cell, or at A1 when nothing is selected, blank cells included. Tab-separated text keeps its columns; text without tabs is split at semicolons or commas when most lines have them (commas separate cells, so use tabs or semicolons with decimal commas between columns). One column of decimal-comma numbers stays one column when a line has no comma (a heading such as "Weight", or a whole number), or when your Mac uses the decimal comma. The grid grows to fit and is never smaller than 20 × 20.
- Copy (⌘C): copies the selection, or all non-empty data if nothing is selected (or everything is), as tab-delimited text.
- Fill: point at a cell that holds something and a dot appears in the middle of each edge. Drag a dot down, up, left or right to copy the cell into the cells you drag over; with the pointer over a selected block, the dots fill with the whole block, repeated. Edit › Fill Down (⌘D) copies the top row of a selected block into the rest of it, or the row above into a single selected row; Fill Right (⌘R) does the same from the left. Formulas move their references as Copy and Paste do ($ parts stay fixed); values are copied as they are, without continuing a series. One Undo reverses a fill.
- Insert or delete rows and columns from the menu (the arrow) on each column header or row number, which also sets a header row or column. To delete several at once, select them (Shift-click or Command-click the headers or row numbers, or select a range of cells), then click the arrow on one of them and choose Delete Selected Rows or Delete Selected Columns; with several selected, the Insert items add that many at once, for example Insert 3 Columns Before. Undo brings them all back. Deleting header rows or columns shrinks the header block.
- Undo (⌘Z) / Redo (⇧⌘Z) and the toolbar's Undo and Redo: up to 50 levels (fewer for a very large sheet), header markings included. While you are typing in a cell, ⌘Z undoes the typing first.
- Data to Graph…: opens the Graph Selected Text dialog for the table or the selected cells. Set the delimiter, header row and X-axis mode, then click Graph Data.
- Data to Chart: opens a chart window, named after the spreadsheet, such as 'Spreadsheet 1 Chart'. A column title typed over several lines (common in Prism and Excel files) keeps its lines: the chart stacks them under the bar, as Prism does, while statistics, reports and the Data Log show the name on one line. Kaplan-Meier groups, heatmap and dot plot row names, cluster, series, category and gene-set names, and Venn and UpSet set names stack the same way (labels drawn at an angle, such as heatmap column names, stay on one line).
- Omics Plot and Kaplan-Meier (toolbar): build those charts from the sheet or the selection. Transpose Table (toolbar) swaps rows and columns, and can be undone.
- Sort (toolbar, or a column's dropdown): sorts the rows by the selected column. Whole rows move, header rows stay put, numbers come before text, and blanks go last. A formula that reads its own row keeps working; one that reads another row would read different cells, so @Graph asks first. Undo restores the order. A chart's Data window has the same Sort, and the chart redraws; sorting by X gives a scatter line that rises. A Volcano table has no Sort, as its rows are tied to their points.
- Data Statistics opens the Statistics window with the spreadsheet data. @Graph detects whether groups are in rows or columns and asks if unsure.
- To use only part of the table, select a rectangle of more than one cell before Data to Graph…, Data to Chart or Data Statistics. A single selected cell doesn't count, so the whole sheet is sent. A header row or column you have set is always included, so the data keeps its labels. A chart made from a selection keeps reading the same range of cells as you edit the sheet (by position: after inserting or deleting rows or columns, make it again).
- Right-click a multi-cell selection for Chart Selected Cells, Statistics on Selected Cells and Graph Selected Cells (labeled with the selection's size).
- The Export menu (next to Data Statistics) has Copy as PDF and Send to Keynote…, which draw the sheet (or the selection) as a clean table image with bold headers and grid lines, plus Export Data…: the sheet (or the selection) as CSV, TSV or an Excel workbook (.xlsx), from a sheet on the window (also File → Export…, ⇧⌘E). The Excel file keeps numbers as numbers, with the header row in bold and kept in view; values are exported as shown, not formulas. With Numbers installed, check Open in Numbers after exporting to open the file there too, or click Open in Numbers to skip the file: Numbers opens the table as a new spreadsheet (from an Excel workbook it converts), and nothing is saved until you choose File → Save in Numbers, which keeps it as a Numbers spreadsheet. Copy as PDF and Send to Keynote… are also on the right-click menu, for the selection or the whole sheet. A chart's data window (its spreadsheet) has Export… in its toolbar too (File → Export…, ⇧⌘E), for the table as it shows it, with the same formats and Open in Numbers.
- Copy as PDF and Send to Keynote… warn first when the table is larger than about 60 rows or 15 columns, since the text would be too small to read on a slide. Select a smaller range, or continue anyway.
- Save (⌘S) saves the spreadsheet as a .@graph file, header rows and columns included, and Save As (⇧⌘S) chooses a new name or location. The same file opens in @Stat.
- A saved spreadsheet opens like any other .@graph file (drop it on the Dock, the app or a window) and reopens as a spreadsheet window.
- Clear All: resets to a blank 20 × 20 grid (undoable).
Column headers in the first row (such as 'Voltage (mV)' and 'Current (pA)') give the channel names and units when you use Data to Graph…. Leave the first row blank if your data has no headers.
Formulas
Type = to start a formula, as in Excel or Numbers: =SUM(B2:B20), =AVERAGE(B:B), =B2/$B$1, =IF(C2>0,"up","down"). The cell shows the result and updates when the cells it uses change; double-click it to edit the formula. Use $ to keep a row or column fixed when you copy. The functions are listed below. Copy and Paste move references as Excel does, and inserting or deleting rows and columns keeps them pointing at the same cells; a reference to a deleted cell shows #REF!. Charts, Statistics and exports use the results, and a cell showing an error counts as missing. Formulas are saved with the spreadsheet. Text starting with = in an opened or imported file stays text. To type text that starts with =, begin with an apostrophe ('=). Formulas work in New Spreadsheet windows; chart data tables hold values only.
Functions
Operators: + − * / and ^ (power); % after a number is a percent (50% is 0.5) and between two values the remainder; & joins text; = <> < > <= >= compare. A range is written B2:B20, or B:B for a whole column. Where a range goes, a list of numbers can be typed in braces instead (an array constant, in Excel's words): {2,3,4} is a row and {2;3;4} a column. SUM, AVERAGE and the other summary functions skip blank and text cells in a range, and an error cell makes their result that error; COUNT skips errors too.
- Totals and averages: SUM, PRODUCT, AVERAGE, MEDIAN, MIN and MAX. MIN and MAX of no numbers are 0, as in Excel.
- Counting: COUNT (cells holding numbers), COUNTA (cells that aren't empty) and COUNTBLANK(range) (empty cells).
- Spread: STDEV or STDEV.S and VAR or VAR.S for a sample (n − 1); STDEV.P or STDEVP and VAR.P or VARP for a whole population (n); SEM, the standard error of the mean (SD / √n).
- Lines and correlation: SLOPE(y range, x range) and INTERCEPT(y range, x range) of the least-squares line, RSQ (r²) and CORREL or PEARSON (Pearson's r). The two ranges must be the same size, or the result is #N/A. Cells are paired by position, and a pair is left out when either cell is blank or text, as in Excel. The x values can be typed as a list: with nine time points in columns C to K, =SLOPE(C2:K2,{1,2,3,4,5,6,7,8,9}) is row 2's change per time point; fill it down for every row (Edit › Fill Down, or drag the cell's bottom dot), and the list stays the same in each. For unevenly spaced times, type the times themselves, such as {0,5,15,30,60}.
- Rounding: ROUND(x, digits); ROUNDUP and ROUNDDOWN (away from and toward zero); TRUNC(x, digits); INT (down to a whole number); CEIL(x) (up to a whole number); CEILING(x, step) and FLOOR(x, step) (up or down to a multiple of step, 1 if left out).
- Arithmetic: ABS, SIGN, SQRT, CBRT (cube root), POWER(x, y) or POW, HYPOT(x, y) (√(x² + y²)), MOD(x, y) (the remainder, with the sign of y, as in Excel) and FMOD(x, y) (the remainder with the sign of x).
- Exponentials and logarithms: EXP, EXP2 (2 to the x), EXPM1 (eˣ − 1, accurate for small x), LN, LOG(x) (base 10) or LOG(x, base), LOG10, LOG2 and LOG1P (ln(1 + x), accurate for small x).
- Trigonometry, in radians: SIN, COS, TAN, ASIN, ACOS, ATAN, ATAN2(x, y) (the angle of the point (x, y), in Excel's order), SINH, COSH, TANH, ASINH, ACOSH, ATANH and PI().
- Special functions: ERF(x), or ERF(lower, upper) for the integral between two limits; ERFC; GAMMA or TGAMMA; LGAMMA or GAMMALN (the log of the gamma function).
- Logic: IF(test, then, else), AND, OR, NOT, TRUE(), FALSE() and IFERROR(value, value if error).
- Checks: ISBLANK, ISNUMBER, ISTEXT and ISERROR, each TRUE or FALSE; NA() gives #N/A, to mark a value as missing.
Charts
Charts are @Graph's charting workspace. They take data from the Data Log, pasted tables or a spreadsheet, and produce publication-ready figures with built-in statistics.
The Chart Inspector
The inspector has two tabs: Chart and Statistics. The Chart tab shows the Paired / Repeated, Chart Type and Data Layout controls at the top, then a three-icon tab bar that switches between:
- Plot Style: how the data marks look (point overlay style, bar/mean display, error bars, connection lines for paired data, and for Estimation Plots the hide toggles and mean offset).
- Axes & Labels: chart title, axis labels, fonts, colors, axis thickness, grid lines. If a new background color crosses from dark to light (or back), @Graph offers to invert all foreground colors.
- Range: Y-axis min and max (and X-axis min and max for Scatter (X,Y), Volcano and Cluster Scatter; Kaplan-Meier has only Time Axis Range, below). Heatmap, Dot Plot, GSEA Bar, Grouped Diverging Bar, Stacked Composition Bar, PCA Plot, Ridge Plot and Manhattan Plot have no range settings: their axes are scaled to fit the data. Leave blank for an automatic range, or double-click the Y-axis tick values to set it on the chart. Type a plain number in the data's units, or add a unit to convert it (on an axis titled in mV, -0.08 V means -80 mV). Marks beyond a typed range are cut at the axis. If a bar chart's range leaves out zero, a warning explains that bar lengths then mislead. Logarithmic scale is here too (see Logarithmic Axes).
- Zero in an automatic range: a filled bar always includes zero, whichever side the data sit on, because a bar's length is its value. An all-negative bar chart runs from its lowest point up to 0.
- Other marks (box, violin, mean symbol, mean line, points alone) show value as a position, so zero is included only when it costs no more than half again the height the data need. A box plot of values between −25 and −5 gets its zero line; one over −90 to −60 does not. A typed min or max is always used as given.
- Line charts simply pad around the data, since a line's shape carries the meaning.
Controls that don't apply to the selected chart type are hidden.
Long and nested tables: Data Layout (Chart tab) can read a table as it stands. When a table read automatically looks like one of the layouts below, the Data Layout box offers to read it that way, and nothing changes until you choose. With either layout, the Chart Data window shows and edits the table itself. When a chosen layout can't read the table, Data Layout says why.
- One Row per Value is for a long table, one row per measurement: a column naming each row's group (WT, KO; or codes 1, 2) and a column of values, with any other columns, such as the batch, plot or classroom each row came from, kept beside them. Choose the Groups and Values columns under it.
- Nested is Prism's nested table: a heading row of categories, each name over its subcolumns (the cells after it left blank), an optional second heading row titling each subcolumn (Mouse 1, Mouse 2…), then the values. Each category's values are its subcolumns' values together, and each value keeps its subcolumn as where it came from (Values from the same). A subcolumn title used under two categories is the same source, such as a batch measured under both, or an animal recorded in both. Nested refuses a table with a heading over every column, and says so.
- Where each row came from: a table with one column per category can also say this, such as a Batch column beside one column per treatment, or an Animal column beside an IT and an ET column (one paired recording per row). When a column's labels repeat beside 2 or more columns of measurements, Data Layout asks what it is: Data (a category of its own) or Names, as it was read, or Where each row came from. The last leaves it out of the chart, keeps each row's label with its values and sets Values from the same to it. With Paired / Repeated on, each row also becomes the second level, so the brackets fit (1 | source/row), such as (1 | animal/row).
Double-click the title, an axis label or a category label on the chart to edit it directly. In a category label, Option-Return starts a new line, for a stacked label like Prism's. When category names are too long to sit side by side, they are turned 45° (Bar/Dot, Box Plot and Line). On a Horizontal Bar, a long name wraps onto two lines. A name too long for the room is shortened with an ellipsis (…); the data table keeps the full name.
Click a dot of a beeswarm, jitter or strip overlay to see its value. Where dots overlap, the one nearest the pointer is chosen.
Legend (Axes & Labels → Appearance): Show legend and Size apply to every chart's legend. A Bar/Dot, Horizontal Bar, Line or Box Plot chart of two or more series, and a Pie, also offer Layout (Side by Side or Top to Bottom), and their legend can be dragged anywhere on the chart. A repeated-measures Estimation Plot's legends take Layout too and stay over their panels. The other charts keep their legend in one place: in a row above a Volcano Plot or under a Venn Diagram, and at the right of the plot for the rest (the color scale of a Heatmap; the size and color keys of a Dot Plot). A Ridge Plot's names beside its ridges are its legend, so Show legend shows or hides them. PCA, Manhattan and UpSet plots, and a chart with one series, have no legend.
Logarithmic Axes
Turn on Logarithmic scale in the Range panel (or in the sheet you get by double-clicking the tick labels) to draw the value axis, or a scatter's X axis, on a base-10 log scale. Decades are labeled (1, 10, 100, or 10ⁿ for very wide ranges) with unlabeled minor ticks between; a narrower range gets 1, 2, 5 or round-number labels. Available for Bar/Dot, Horizontal Bar, Box Plot, Line and Scatter (X,Y) charts.
- A log axis can't show zero or negative values, so they are left out, and the Range panel and the figure caption say how many. A typed Min or Max must be above zero.
- Bars are shown as mean symbols, since a bar's length from zero means nothing on a log axis. Your bar setting comes back when you turn the log scale off.
- Error bars are the mean ± SD, SEM or CI as computed, so they look longer below the mean. One that reaches zero or below is cut at the axis with no cap.
- Error bars around a geometric mean (× / ÷ a factor) are symmetric on a log axis.
- Violins are drawn from a density of the log of the values, so their shape matches the axis. Box plot quartiles and whiskers come from the values as they are.
- A scatter's fit line is the least-squares line of the values as they are, so on log axes it curves. For a straight line on log axes, fit the log10 of your values instead.
Chart Types
Bar / Dot
The primary chart type. Each column of data is one category. Rows are replicates (individual data points). The chart shows raw data points overlaid on a mean marker and error bar.
- Display (Mean / Bar panel): Bar, Violin (density shape; see Violin Plot), Mean symbol (shape set by the Data Points panel's Symbol picker), Mean line (horizontal tick), or Points only.
- Error bar modes: SD, SEM, 95% CI, or None.
- Center (Error Bars panel): Mean, or Geometric mean for log-normal data such as concentrations or titers. The geometric mean is exp of the mean of ln x, as in Prism and R. Its error bars are × / ÷ the geometric SD factor, exp(SD of ln x), or its confidence interval, the t-interval of ln x back-transformed. They look longer above the mean on a linear axis and symmetric on a log axis. SEM has no geometric counterpart. Values at or below zero have no logarithm, so they're left out, and the panel and caption say how many. Geometric mean needs individual values: it isn't available for charts made from means with SD, SEM or n, for 0/1 data, or for violins. Copy Geometric Means copies each group's numbers. Tests and effect sizes still use the values as entered. To compare geometric means, take LN of the values in a spreadsheet and test those: the difference of log means, exp(Δ), is the ratio of geometric means. In the same panel, Color sets what colors the error bars: a color you choose, or each series' line (or bar) color, or its point color, since a series can have a different color for each. With data points hidden, the point color follows the line, the color of the mean's symbol. Show caps turns their end caps on or off.
- A table of means with error values (a label column, then value and error columns in pairs) draws the errors as given. The error column's header says what they are: "SEM" or "SE" is read as SEM, "SD" as SD, "CI" or "95% CI" as a CI half-width. With no such word the bars are drawn as supplied and the methods caption says their type was not stated. When the header names a confidence level, such as "99% CI" or "CI90", the bars are drawn as given and the caption states that level, whatever the level in Settings; a CI header with no level says the level wasn't stated.
- The chart's data table and CSV export include a mean-and-error chart's error columns (for example "Control SEM"), so they can be edited there. The data table stays in step with the chart: renaming a category, wedge or series, Undo in the chart window, or an Assistant edit shows in the open table right away, and Undo in the table undoes only the table's own edits. In the chart window, ⌘Z takes back changes to the chart's settings, anything in its Chart and Statistics tabs, one step per change, and leaves alone a data edit made since. ⌘S in the data table saves the chart.
- Numbers may use a decimal point or a decimal comma; the convention is read from the table's number cells themselves (names such as "Dose 0,5" don't count), not the Mac's region setting, and a semicolon-separated table is split on its semicolons. "45%" is read as 45 and "$1,234.50" as 1234.5. A blank or non-numeric cell (such as NA, N/A, NaN, NULL, None, ".", "-", "--" or a spreadsheet error such as #N/A or #DIV/0!, in any capitalization) is a missing value that keeps its row, so each row stays one subject in a paired design.
- Mean offset: moves the mean marker sideways, away from the data points, when they overlap.
- Bar width sets the width of each bar. With 2 or more series, Bar gap is the space between bars within a group and Category gap the space between groups.
Horizontal Bar
Same as Bar/Dot but with categories on the Y axis and values on the X axis. Useful for ranked comparisons or when category names are long.
Estimation Plot
Follows the estimation statistics approach of Cumming & Calin-Jageman (2024) and DABEST (Ho et al. 2019; see References). Instead of asking only whether an effect is non-zero (the p-value), it shows how large the effect is and how precisely it is estimated.
- Turning it on: click the Show Estimation Plot button, at the foot of the EFFECT SIZE zone on the Statistics tab, of a Bar, Horizontal Bar, Line or Box Plot chart with one series and at least 2 categories, or of a profile. An estimation plot compares the categories of one series, so it is grayed out (with the reason in its tooltip) for a chart with 2 or more series; for those, the brackets give the differences with their CIs. A profile is the exception: its estimation plot shows its groups across conditions (below). Hide data points leaves each group's center and CI; Hide mean marker & error bars hides those. The chart itself switches to an Estimation Plot, and the button stays highlighted while it is on. Click it again to return to the previous chart type, with its bar display restored. Choosing another type in the Chart tab also turns it off.
- What it plots follows the chart's Compare choice (Statistics tab, EFFECT SIZE zone), once the chart's statistics have been opened; until then it plots means. Each group shows its points and its center on that scale: the mean, the 20% trimmed mean, or the median (H-L shift and Ranks). The difference axis shows the Compare estimate: the mean difference (M diff), the trimmed-mean difference (Trimmed M diff), the Hodges-Lehmann shift, or for paired data the Hodges-Lehmann median of the differences (HL diff), or dominance δ on its own −1 to 1 axis.
- Every CI on the plot, for each group's center and each difference, is a bootstrap interval from 10,000 resamples at the Default confidence level, and each curve is the bootstrap sampling distribution of that estimate, drawn from the actual resamples as DABEST does. Means and dominance δ use the plain bootstrap with the Bootstrap CI method in Settings → Statistics (BCa by default). H-L shift and trimmed means (and the group medians under Ranks) use the smoothed bootstrap (Silverman & Young 1987): each resampled value gets a little Gaussian noise, scaled so the sample's variance is kept. A plain bootstrap of a median from a small sample can only land on a few values (a median of 10 values is always one value or the average of two), so its curve breaks into lumps at those values and gaps between them; the smoothed curve is single-peaked. Its interval is the percentile interval, which in simulations at n = 10 covers as well as the plain bootstrap's (93–95% for a nominal 95%), where BCa would over-correct (82–86%). Paired data are resampled as whole subjects. These CIs are the plot's own; brackets and the Statistics window report the test-based CIs that go with their p-values, so the two can differ slightly.
- Values from the same: when the values come from shared sources (cells from one animal, plants from one plot), chosen in the Statistics tab, the plot draws the same linear mixed model as the brackets instead of a bootstrap, which would treat values from one source as independent and give intervals that are too narrow. Each group's center is its model-based mean and each difference the difference in model-based means, each with its own t-based CI (Satterthwaite df), and each curve is the t distribution of that estimate (Cumming 2012). Show each source's mean (on by default, under Values from the same) draws each source's mean over the data as a larger hollow marker (a SuperPlot; Lord et al. 2020). Compare must be Means; the figure legend states the model.
- Profiles: the Estimation Plot of a profile (groups of subjects measured across conditions) has two panels on one time axis, with times placed at their values when the column names give them (0, 1, 2, 4, 8 h). Everything comes from one fit of the mixed model the brackets and the Statistics window use (Trend, Covariance, Values from the same and Spreads are in the same tab), checked against R (lme4, lmerTest, mmrm and mvtnorm). Copy Chart Legend describes the model, both panels and the intervals drawn.
- Upper panel (profiles): each group's mean at each condition from the chart's mixed model, with its CI, over each subject's line (Show each subject's line).
- Lower panel (profiles): the differences between the groups at each condition: each group against one group, or every pair with 3 or more groups (Differences, as for the plot above, at any number of groups), side by side and colored by group (with every pair, a ring in the other group's color). Each difference has the t distribution of its estimate as a half curve on its outer side and up to two intervals.
- Intervals (profiles), in the Statistics tab: At each condition (on by default) is that difference's own CI. All times together is the simultaneous CI over every difference drawn (single-step, from the multivariate t), wider, for saying where the groups differ without the risk of looking at many conditions. With both, the thick bar is each time's and the thin bar the simultaneous one, as the legend says.
- What the lower panel shows (profiles): At each condition compares the difference itself, or the change since the first condition (the difference at each condition minus the difference at the first), for groups that start apart. Scale shows the difference in the data's units, or standardized as Hedges' g* or Cohen's d* as the brackets give it (not for a change since the first condition).
- Legends (profiles): the legends over the two panels (the groups above, the comparisons below) follow Axes & Labels › Appearance: Show legend, Layout (Side by Side, wrapping onto more lines, or Top to Bottom, one per line) and Size. They stay over their panels rather than being dragged.
- Gardner-Altman (2 groups): three columns, Group A, Group B and Difference. The left axis shows the raw data; the right axis shows the difference, with 0 aligned to Group A's center (δ has its own −1 to 1 axis).
- Cumming (3+ groups): the upper panel shows all groups, with a dashed line marking the reference group's center; the lower panel shows the differences, each against one group or all pairwise, each with its sampling distribution, CI bar and effect size. The Differences picker in Plot Style compares each group with one group (vs Control, vs Drug A and so on), or every pair (All pairwise). Until you choose, it is the control chosen for the chart's brackets, else a group named like a control (Control, Vehicle, Sham, WT and the like), else the first. The choice is kept by the group's name, so reordering or hiding groups doesn't change it, and in the plot it is also the control Glass's Δ uses.
- Paired / Repeated data: individual difference scores appear in the Difference column, and connection lines link each subject's own points (the values in one table row). Differences use the subjects with values in both groups.
- Each difference is the later group minus the earlier one, and the effect size beside it has the same sign. It follows the chart's EFFECT SIZE settings: for Means, Hedges' g (g* when Spreads is May differ) or the chosen d, or Glass's Δ over the chart's control for a difference that includes it, or gav/dav or gz/dz when paired; for Trimmed means, AKP robust d; for H-L shift and Ranks, the plotted estimate itself (HL, δ).
- 0/1 data: when every value in the compared categories is 0 or 1 (the rule that switches the brackets to Fisher's exact or McNemar's test), the plot shows proportions instead, after DABEST's proportion plot, in two panels for 2 groups as for 3 or more. The brackets keep their own effect measure, the odds ratio with Fisher's exact p (McNemar's test when paired), so their p and CI need not agree with the Δp interval.
- Upper panel (0/1 data): each group's proportion of 1s as a bar filled to that height (outlined up to 1), with its Wilson score CI beside it and the count (successes/n) above it.
- Lower panel (0/1 data): each difference in proportions (Δp, the risk difference) with Newcombe's hybrid score CI (method 10). With Paired / Repeated on, it uses Tango's score CI for paired proportions (Tango 1998) on the subjects observed in both groups, which keeps a useful width even when no subject changes (10 subjects staying at 1 and 10 at 0 give Δp = 0, 95% CI −0.16 to 0.16; in exact calculations at 10 pairs it never covered less than 93% for a nominal 95%, where Newcombe's paired interval fell to 72%). The label beside each difference is Δp, or Cohen's h (2·asin√p₂ − 2·asin√p₁, Cohen 1988) when Label is set to Cohen's h in the Statistics tab, which replaces the data checks and Compare choices for such a plot.
- Why score intervals (0/1 data): with few 0/1 values a bootstrap interval is too narrow (in exact calculations at 5 per group a percentile bootstrap covered 84% on average for a nominal 95%, and as little as 40%; Newcombe's covered 95% on average, never below 90%), so no sampling distributions are drawn and the Bootstrap CI method doesn't apply.
- Paired flows (0/1 data): paired data also get DABEST's flows. Between neighboring bars, bands show the fraction of subjects going 1→1, 1→0, 0→1 and 0→0, in the bar's color for those starting at 1 and gray for those starting at 0 (the bar's 0s are shaded gray to match), and each Wilson CI moves onto its bar to make room. The flows link the groups in order, like the connection lines of paired data, whichever differences the lower panel shows. A pair of bars gets flows only when every subject has a value in both, so the bands always add up to the bars. Turn them off with Show paired flows in Plot Style.
- The Statistics tab of an Estimation Plot shows the data checks, the EFFECT SIZE zone and each plotted difference's effect size. Turning the plot on stores the Compare choice in force, as the first bracket computation does, so a later data edit cannot change what it plots. Only the first series' categories are compared (a profile compares its groups).
- A difference that cannot be estimated (fewer than 2 values, or fewer than 2 matched subjects; for 0/1 data, no values or no matched subjects) is left off the plot and shows as n/a in the Statistics tab's effect-size list, which lists the same comparisons the plot shows.
- The CI bars are set by the data and by the Settings → Statistics choices above, not by an error bar setting.
- Mean offset moves the center marker and sampling distribution sideways, away from the data points. It stays available when the marker is hidden, because it also positions the distribution curve.
- Mean line is the default marker style. Hide data points, hide mean marker & error bars, and hide sampling distributions can be combined freely.
Box Plot
The classic Tukey box-and-whisker chart: a box from the first to the third quartile (Q1–Q3), a line at the median, whiskers reaching the most extreme value within 1.5 × IQR (the interquartile range) of the box, and points beyond them drawn as outliers. It uses the same data as Bar/Dot, so switching a chart to Box Plot only changes how each column is drawn.
Notches (Plot Style → Box) narrow each box at median ± 1.58 × IQR/√n, as R's boxplot(notch = TRUE) (McGill, Tukey & Larsen 1978), using the IQR of the box drawn. Boxes whose notches don't overlap suggest their medians differ (roughly 95% confidence; an informal guide, not a test). With small samples a notch can reach past its box. It's then drawn folded outward, as in R, and a note says so. The axis widens to show the notches. Copy Box Statistics copies each box's n, whiskers, quartiles, median and, with notches on, the notch ends.
- Quartiles use the (n + 1) rule (Hyndman–Fan type 6), as in GraphPad Prism and Excel's QUARTILE.EXC (NumPy, pandas and ggplot2 default to type 7). The Data Points panel restates these conventions. The rule decides which points fall outside the fences, so state it in your methods; the "Copy Chart Legend" button on the Statistics tab writes the sentence for you.
- A category with a single value is drawn as a flat tick instead of a box.
- Raw data points can be overlaid on the box (Data Points panel, same Strip/Jitter/Beeswarm styles as Bar/Dot).
- The Mean / Bar and Error Bars panels are hidden, since the box, median, whiskers and outliers are always drawn.
- Axis labels, fonts, colors and grid work as for Bar/Dot.
- The Statistics tab works as for Bar/Dot: effect size brackets, Open Full Statistics Window and the Show Estimation Plot button.
Scatter (X,Y)
A standard X,Y scatter plot: one or more series, each with its own X values, on a pair of numeric axes. Use it when series were measured at different X values (for example two dose-response curves at different concentrations), which the category/replicate layout of the other basic charts can't hold. It differs from Cluster Scatter, which is one point cloud colored by a label.
- Data are read as X,Y column pairs: column 1 is the X for column 2, column 3 the X for column 4, and so on. A leftover unpaired column is dropped. Each series is named after its Y column's header, and the X axis after the first X column's header. Pairs may differ in length.
- A table whose first column is the X for every other column (Prism's XY table: Age, Weight (female), Weight (male)) makes one series per Y column, all against that X. A table is read this way by itself when it has a header row and its first column plainly holds an X: values increasing down the rows, and either named as one (time, age, day, dose, concentration, voltage, a time unit and the like) or evenly or geometrically spaced (3, 4, 5 … or 1, 10, 100). A first column named like an identifier (Subject, Mouse, ID, Sample) is never taken as X. Otherwise set Data Layout to "Scatter Plot (First Column Is X)". A new chart read this way joins each series' points, as Prism draws an XY table; Connect Points turns that off.
- Four ways in, all reading the table the same way: send a selected X,Y table to a chart; pick Scatter (X,Y) in the Chart Type picker of an existing chart; set Data Layout (Chart tab) to "Scatter Plot (X,Y Column Pairs)"; or choose "X,Y Column Pairs (Scatter Plot)" in the "How Should This Table Be Read?" dialog, offered for a headerless all-numeric table with an even number of columns. A chart switched to Scatter (X,Y) plots two columns one against the other, and columns that are X,Y pairs as pairs. A chart of several series plots, within each category, every other series against the first. Other columns, such as one per group, are plotted against the first, so none is dropped.
- Connect Points joins each series' points in the order given, not sorted by X, so a profile or loop that doubles back keeps its shape. Curved lines smooths the line. Where a series' X values double back, the curve follows the points in table order and can swing past them, and a note says so.
- In the Data Layout panel, "Switch X and Y" replaces "Switch Row/Column". It swaps X and Y for every point and the axis titles with them, and removes any fit lines, since a fit of Y on X does not describe X on Y. Switching again restores the original.
- Without a header or typed title, the axes are titled "X Value" and "Y Value".
- Graphs support the same layout: Import Data's "X,Y column pairs" mode builds a Graph whose sweeps have their own X values, and Graph Utilities' Combine and Concatenate keep them.
Linear regression is on the Statistics tab. Each series has its own Linear Regression button (series are never pooled). It reports the equation with the slope's confidence interval (t-based), r with its confidence interval (Fisher z), r² and p (two-sided test of slope ≠ 0), at the confidence level in Settings, and draws a dashed line over the range of your X data (as ggplot2 and Prism do, never extrapolated). Click Keep Fit to make the line solid and save it with the chart, or Remove to discard it. A dashed (not kept) line stays dashed in print, PDF and SVG, so a preview can't be mistaken for a result. The band and the options for robust SEs, the standardized slope and residual diagnostics appear once a series has a fit. A line from Connect Points is not a fit.
- Values the data can't define show as "n/a". p needs at least three points (with 3 it is a t test on 1 degree of freedom, as in R's lm); with 2 the line is drawn but not tested. r, r² and p are n/a when Y does not vary (Y values that differ only by rounding count as not varying). A fit needs at least two points with different X values (X values that differ only by rounding count as the same).
- r takes its sign from the slope, so a perfect negative correlation is −1.
- Open Full Statistics Window passes the X,Y columns to the Correlation and Regression analyses (pick one X and one Y). These add Spearman ρ and Kendall's τ-b (for curved but monotonic relationships), confidence intervals, a 4-parameter logistic dose-response fit (Bottom, Top, LogEC50, Hill slope) and, with more than one pair, multiple regression and ANCOVA.
- The Chart Legend box writes a methods sentence, with coefficients, for each kept fit. Fits still in preview are left out.
- Show confidence band (below the description) shades a band around every fit line, in its series' color. Choose a confidence band for the mean response (where the true line lies, the default) or a prediction band for new observations (where a new single point would fall, so always wider), and a level (95% by default, 50 to 99.99%). The band is ŷ ± t · s · √(1/n + (x − x̄)²/Sxx), with 1 more under the root for prediction, t on n − 2 degrees of freedom: the band R's predict.lm and GraphPad Prism draw. It spans the same X range as the line, is exported to PDF, PNG and SVG, is saved with the chart (off by default), and the Chart Legend box describes it.
- Below the band settings are the same options as Simple Linear in the Full Statistics window, for every fit on the chart (all off by default and saved with the chart). Standardized slope (β) adds the beta weight, B × SD(X) / SD(Y), which with one X equals Pearson r. Robust (heteroscedasticity-consistent) SEs (HC0 to HC3, HC3 recommended) replace the slope's CI and p with sandwich ones, as R's sandwich and lmtest give, labeled (HC3) in the panel and the Chart Legend; r's CI is unchanged. The confidence band then uses the same robust covariance, ŷ ± t · √(x₀ᵀV̂x₀), and the legend says so; a prediction band stays the ordinary one, since it needs one error variance for a new point. Residual diagnostics adds a Residual Diagnostics… button to each fit, with how many points are flagged: it opens R's four residual plots and the influence table (leverage, studentized residuals, Cook's D; Row is the point's number in the series) in a window of their own, updated as the data change. In a chart's diagnostics window, Send to Data Log adds the table, Export Table saves it as text, and Export Plots saves the four plots as a PDF or PNG.
Switching an existing chart to Scatter (X,Y) keeps its original data, so you can switch away and back without loss. The Chart Type entry is available only when the data have at least two numeric columns.
Kaplan-Meier Curve
The standard time-to-event survival plot: one step curve per group, starting at 100% and dropping at each observed event (not at a censoring).
- Build it with Kaplan-Meier Selection… on the File or Text Tools menu, or the Spreadsheet toolbar's Kaplan-Meier button. The table (separated by tabs, commas or semicolons) needs a header row and 2 to 4 columns in this order: Time, Status, Group, Stratum. Group is optional (without it everyone is one group), and so is Stratum (used only by the stratified tests below). Status accepts 1/0 (1 = event), event/censored, dead (or death)/alive, yes/no or true/false, in any case. A Status column coded 1 and 2 is read as in R's survival package, 2 = event and 1 = censored. Time must be 0 or more. Rows that can't be read are skipped, and the Data Log says how many. The first row is always the header, so if it looks like a subject (a time and a status), the Data Log says it was left out.
- Small ticks mark censored subjects (those who left the study or were event-free at last follow-up). Each group's median survival (the first time survival drops to 50% or below, or "not reached"; where the curve sits exactly at 50% over an interval, the midpoint of that interval, as in R) is shown in the legend and optionally as a dashed line, with its Brookmeyer-Crowley CI read off the confidence band: from the first event time whose band contains 50% to the last. An upper limit the band never reaches (for example when the curve falls to 0) is shown as NR, and a lower limit the band leaves undefined (the curve drops straight to 0) as NE (not estimable); R reports NA for both. At 99% with small groups the band's lower edge can dip below 50% at the first event and rise again; that first time is the lower limit here, while R's quantile() reports a later one.
- With 2 or more groups, a log-rank test compares all groups at once. Its χ², degrees of freedom and p-value appear under the legend, or inside the plot at the bottom left when the legend is hidden, and can be turned off. The log-rank p is a large-sample approximation that runs too small with few events (about 11% false positives at the 5% level for 3 vs 3), so with fewer than 10 events in all the legend adds "Approximate p".
- Groups left out of the log-rank test: a group with nobody at risk at any event time is left out, as R does, and so is a group that is alone in every risk set it is in (the only group in its stratum, say). Its observed and expected counts are equal and it carries no information, so leaving it out recovers the test, with one fewer degree of freedom, where R reports none.
- With exactly 2 groups a hazard ratio with 95% CI is also shown, labeled with its direction ("HR (B vs A)", vs. the reference group: the first unless you pick another under Tests). It comes from a Cox proportional-hazards model with group as its only covariate, with Efron's handling of tied times and a Wald confidence interval, matching R's survival package. With 3 or more groups, Show Cox model (below) gives one ratio per group.
- When a ratio has no finite estimate: if one group has no events, or every event in one group comes after the last subject of the other has left follow-up, the ordinary ratio is 0 or infinite. The legend then shows Firth's penalized estimate instead (see Firth-penalized Cox under Tests), labeled "Firth-penalized", with a line saying why. With strata, where Firth is not available, the legend says the ratio is not estimable.
- Plot Style also offers a 95% confidence band (Greenwood's variance), a numbers-at-risk table under the time axis (subjects whose time is at or after each tick, as R's summary(fit, times =) counts), curve and median-line widths, and per-group color overrides (otherwise groups use the shared category palette).
- Band scale sets how the confidence band and the median's interval are computed. Log-log (recommended, as in SAS and Stata) stays within 0 to 100% and covers best in small samples; choose Log to match R's survfit, or Plain (linear).
- Range ▸ Time Axis Range cuts the curves at a fixed follow-up time, e.g. Max 60 for five years in months; numbers at risk follow the axis ticks. The survival axis is always 0 to 100%.
- Tests (Plot Style, Kaplan-Meier box): Weighting is the log-rank test by default, the most powerful when the hazards are proportional (one group's risk a constant multiple of the other's). The weighted alternatives are Gehan-Breslow (Wilcoxon) and Tarone-Ware, which give early times more weight, and Fleming-Harrington, which weights each event time by S(t−)^ρ · (1 − S(t−))^γ for the pooled survival S just before it (ρ = 1, γ = 0 is R's survdiff(rho = 1); a γ above 0 stresses late differences). Choose the weighting before looking at the curves: trying several and reporting the smallest p inflates false positives. The legend names the test used.
- Stratify by the Stratum column compares the groups within each stratum (such as a study site) and combines the results, as R's survdiff(Surv(time, status) ~ group + strata(stratum)). It also stratifies the Cox model; the curves themselves stay pooled. It needs the 4th column; blank Stratum cells form a stratum of their own.
- HR reference: the group the hazard ratios are relative to. It is the first group unless you pick another; a group named like a control is offered with a Use button, never picked for you.
- Show Cox model adds each group's hazard ratio vs. the reference with its CI (Efron ties, Wald interval, as R's coxph), the likelihood-ratio test of all groups at once, and the Schoenfeld-residual test of proportional hazards (as R's cox.zph: global, plus one per group with 3 or more groups, which is cox.zph(terms = FALSE)). A note appears when a PH p is below α (0.05 at the default 95% level): the hazard ratio may change over follow-up, so it is an average. When a ratio has no finite estimate (a group with no events, or one group's events all happening after the other has nobody left at risk), the model is refit by Firth's method (below) automatically and labeled so; with strata such a ratio reads "not estimable (0)" or "(infinite)" instead.
- Firth-penalized Cox (off by default) fits every hazard ratio by Firth's penalized likelihood (Heinze & Schemper 2001), as R's coxphf with its defaults. The penalty keeps an estimate finite where the ordinary one runs off to 0 or infinity, and it reduces small-sample bias, so it also suits small studies. Each ratio comes with a profile penalized-likelihood CI (not a Wald interval) and a penalized likelihood-ratio p for that group; Show Cox model adds the penalized likelihood-ratio test of all groups at once. Tied times use Breslow's method, as coxphf does (the ordinary fit uses Efron's), and the legend says so. The proportional-hazards test is not computed for Firth fits, since coxphf has none. Firth is not available with strata (coxphf has no strata): the ordinary stratified fit is shown, with a note.
- Show pairwise tests (3 or more groups) tests every pair of groups with the same weighting and strata and adjusts the p-values by Holm's method, as survminer's pairwise_survdiff. A pair that can't be tested reads "not testable" and counts as p = 1 in the adjustment, as there.
- Up to 5,000 subjects; above that the chart shows a message instead.
- The data (Time, Status, Group, Stratum) can be edited in the chart's spreadsheet like any other chart.
Smart Visualization opens a table here when its header names the time or status column (Time, Months, OS, Event, Status, Censored…) and its second column holds two status codes. Otherwise use one of the Kaplan-Meier commands above.
Ridge Plot
Compares distributions as stacked, slightly overlapping density curves (one kernel density estimate per category, with Violin's kernel and bandwidth; each curve runs a little past the data, where a violin is cut at them). It uses the same data as Bar/Dot and Box Plot.
- All ridges share one height scale, as in R's ggridges: the tallest density peak sets it, so a narrow distribution stands taller than a spread-out one and heights can be compared between ridges.
- A category needs at least 2 values; categories with fewer are skipped.
- Overlap sets how tall the tallest peak is relative to the row spacing: 1.0 just touches the row above, higher values let curves flow into it.
- Rug marks (optional) put a small tick at each data point along the ridge's baseline.
- Category labels run down the left side and serve as the legend; "Show legend" hides them to free the space. The X axis is the shared value scale.
- The X axis label titles the value scale; the Y axis label draws a rotated title for the categories (such as "Class").
- Switching to or from Ridge Plot swaps the X and Y axis labels, since the axes swap roles. Switching back restores them.
- The Mean / Bar, Error Bars, Data Points and Connection Lines panels are hidden.
- To make one, switch an existing Bar/Dot or Box Plot chart's Chart Type to Ridge Plot, or ask the AI Assistant for a ridge plot.
Violin Plot
A display mode of Bar/Dot (choose Violin in the Mean / Bar panel). Violins show a kernel density of each group (Gaussian kernel, Silverman's bandwidth as in R), cut off at the smallest and largest values, as ggplot2 and Prism draw them: the width at each Y value shows how dense the data are there. The solid line marks the median and the dashed lines the quartiles (the same quartiles as Box Plot); 'Median and quartile lines' (on by default) shows or hides them. The bandwidth is 0.9 × min(SD, IQR/1.34) × n^(−1/5), R's default, also used by ggplot2 and ggridges. Because it uses the smaller of the SD and the interquartile range, an outlier or a second peak does not smooth away the real shape. The curve is evaluated at points no more than a quarter of the bandwidth apart, so a long tail or a far outlier cannot hide the peak. All bar chart controls, including effect size brackets, still apply.
- Violin width (30–100%, 90% by default, as in ggplot2's geom_violin) is the widest violin's share of the space each group has. At 100% or less, neighboring violins never overlap.
- Each violin is scaled to its own widest point, so violins compare in shape.
- Violin opacity sets how solid the fill is.
Line
Connects data points with lines, for time series or dose-response data, with one line per series. Line charts show error bars (SD, SEM or CI, set under Error Bars). A missing value breaks the line. The Category gap slider (Category Spacing panel in Plot Style) sets the padding at each end of the X axis: at 0% the first and last points sit on the edges; the default is 15%. With several series, Offset the series slightly (Category Spacing panel in Plot Style) draws each series' points and error bars a little to the side of the category, so overlapping error bars stay readable. For a profile of groups of subjects, the Statistics window's Make Chart gives a fuller chart (each subject's line, the group means, and brackets from the mixed model). Curved lines joins the points with a smooth curve through every point instead of straight segments. It never rises above or falls below its neighbors, so it shows no peak the data don't have.
Pie
Each category becomes a wedge. Pie charts show positive values only: negative values are left out, and the inspector says how many.
- Wedges: Plot Style › Wedges lists every wedge of a pie (one per category, or one per series when there are several series). Set each wedge's color, rename it (the label, legend and data table all follow), or click ↺ to restore its default color.
- Explode: check Explode on a wedge to pull it out of the pie; Axes & Labels › Shape › Explode sets how far. With no wedge checked, the Explode slider pulls out every wedge. Shape also sets the inner radius (for a donut) and the wedge stroke color and width.
- Labels: Axes & Labels › Labels chooses what each wedge shows (None, Name, Value, Percent, Name + % or Name + Value). Position, Size and Font appear when labels are shown, and Text color sets the color of the wedge labels and the legend's names.
- Legend: it follows Axes & Labels › Appearance: Layout (Side by Side or Top to Bottom), Size and Show legend. Drag the legend anywhere on the chart and the pie moves to make room for it; Reset Position puts it back at the bottom (Side by Side) or the right (Top to Bottom).
Volcano Plot
For differential expression and similar large-scale comparisons. Described on the Omics Visualization page, together with its MA Plot display mode.
Heatmap
A grid of colored cells for expression matrices, correlation matrices or any other numeric row × column table, with optional clustering and dendrograms. Described on the Omics Visualization page.
Point Overlay Styles
- Strip: all points in a single vertical line, with opacity scaled so denser regions look darker. Best for large n.
- Jitter: small random sideways spread, full opacity. Best for small n.
- Beeswarm: each point moves sideways just enough to clear the others, keeping its exact value. Where a group is too crowded for its column, the extra points are spread across it and may overlap, and a note in the chart's bottom-right corner says how many. A smaller point size gives them more room.
- None: points hidden; only the mean marker and error bar are shown.
When newly pasted or imported data are binary (only two distinct values, such as 0/1), Data Points starts at None instead of Beeswarm, since two dense bands add nothing that the bar height doesn't show. You can change it at any time.
Data Point Symbol
The Data Points panel's Symbol picker sets the shape of the overlaid points and of the Mean symbol marker. Ten shapes: Circle, Square, Diamond and Triangle, each filled or open (outline), plus Cross and Plus.
- New charts start with Settings → Appearance → Charts → Default data point symbol (circle unless changed).
- With one series, a single Symbol picker and Point color swatch apply to the whole chart. With several series, each series is listed with its own color swatch and symbol picker. On an Estimation Plot, Group colors sets each group's color (its points, interval and curve) and Symbol the points' shape; on a repeated-measures Estimation Plot, each group's color and its subjects' point color.
- Opacity: strip points (and an Estimation Plot's) start out lighter the more of them share a column, so piled-up values stay visible. Moving the slider sets the opacity exactly; Automatic Opacity brings the thinning back.
- Mean / Bar sets the color of what is shown, a bar, mean line, violin or mean symbol (one per series when there are several); Box Plot's Box panel sets the boxes' color, opacity and width; a Line chart's Lines panel each series' line and point colors, solid or dashed, and the point size. Effect-size brackets are drawn on Bar/Dot, Horizontal Bar, Box Plot and Estimation charts, not on Line charts.
- Exported SVG files use the same shapes as the screen.
- The AI Assistant can also change the point shape on an existing chart, and set a chart's fonts, including the legend font and size. Name a font family as Font Book lists it, such as Helvetica Neue, or say System for the default.
Paired / Repeated Measures
Check 'Paired / Repeated' at the top of the Chart inspector (or the Statistics tab). This affects: (1) connection lines linking each subject's points; (2) the paired effect sizes for Means (Hedges' gav / Cohen's dav, or gz / dz); (3) the paired form of every Compare choice, for brackets and in the Statistics window: paired t-test and repeated-measures (RM) ANOVA for Means, Yuen's paired test for Trimmed means, Wilcoxon signed-rank and Friedman for H-L shift, the exact sign test and Friedman for Ranks; (4) what the data checks look at (the paired differences, or the within-subject residuals).
Paired values are matched by table row: row r of every column is the same subject, and a blank cell is that subject's missing value. Each comparison uses the subjects observed in both of its groups (RM ANOVA's omnibus test uses subjects with every value). A chart whose values did not come from such a table (for example, one built from separate lists of values) has no row information, so paired brackets and connecting lines are not drawn and the panel says why, rather than pairing values by their position in each list, even when the lists are the same length.
@Graph can't tell from the numbers whether rows are the same subjects, so Paired / Repeated stays off until you tick it, or until you answer "Rows Are Subjects" when @Graph asks how to read a table.
Values from the Same (Clustered Data)
In the chart's Statistics tab, under Paired / Repeated. When values aren't independent (samples from one batch, plants from one plot, students in one classroom, cells from one animal), choose the column naming each value's source, or Subcolumns for a Nested table. It needs a table read as One Row per Value or Nested (Chart tab › Data Layout) and Compare set to Means; a likely column (named like Animal, Subject, Classroom or Plate) is offered with a link. Within category and 0/1 data can't be combined with it, and the Statistics tab says why.
Brackets then come from a linear mixed model with a random intercept for each source, as lme4's lmer fits value ~ category + (1 | source). Each shows an effect size (Hedges' g by default, below) with its CI and the p for the difference in model-based means, simultaneous over the comparisons (multivariate t) when there are 3 or more categories. The bracket header gives the ICC and the counts of values and sources, and the figure legend states the model. The numbers equal the Full Statistics window's Mixed model with one value column.
Second Levels and Repeated Measures
- Within that chooses a second level inside the first (classrooms within each school, plants within each plot, slices within each animal). Each gets its own random intercept within its source (lme4's (1 | source/unit), such as (1 | school/classroom)); the same label in two sources is two units. The result then gives both SDs, the share of the variance at each level, and an ICC for rows from the same source and from the same second-level unit, with the counts at every level.
- Repeated measures in a long table (Participant | Condition | Score, with Values from the same set to Participant): a random intercept per participant, which with two conditions and complete data gives exactly the paired t, and unlike the paired t keeps participants with a missing condition. With Paired / Repeated on, say which rows go together under Within that.
- One column per category, with a column saying where each row came from (Data Layout): turning on Paired / Repeated makes each row the second level within its source, so the values in one row count as one pair or subject.
- Nested tables work the same way: with Paired / Repeated on, row 1 of a subcolumn under each category is one pair within that subcolumn (animal A's first cell before and after the drug), and so on down the rows. The numbers equal a long table read In order within each source.
Effect Size
EFFECT SIZE asks how big the typical difference was. The Statistics window's table reports g, d and Δ.
- Hedges' g, the default, is Cohen's d with Hedges' exact small-sample correction at the df of the SD it divides by, ν = S²/(2·Var S), as Hedges (2007) corrects dT in clustered designs.
- Cohen's d divides the difference by the two categories' total SDs, each the SD of a single value with every level's variance included, √(σₐ² + σₑ²) or √(σₐ² + σᵦ² + σₑ²) (Hedges 2007; Westfall, Kenny & Judd 2014). They are combined as the design asks: their average, (S₁ + S₂)/2, when the two categories are measured within the same sources (gav and dav, as for paired data; Lakens 2013), or their root mean square, √((S₁² + S₂²)/2), when they come from different sources (g* and d*, as for independent groups; Delacre et al. 2021). The bracket's label says which.
- Their CIs are approximate (delta method): a little wider than the difference's own, as they also count the uncertainty in the SDs, so one can reach 0 when p is just below α.
- Δ is the difference between the model-based means in the data's own units.
- Spreads works as for independent groups. May differ (the default) gives each category its own residual SD (nlme's varIdent), the mixed model's counterpart of Welch's test, so the two SDs combined can differ. Assumed equal uses one residual SD for every category; the two total SDs are then equal and d is the difference in units of the SD of a single value.
On the Plot
- On an estimation plot, the means, the differences and their CIs come from the same model instead of a bootstrap (which would treat values from one source as independent). Each curve is the t distribution of its estimate (Cumming 2012), each CI is the comparison's own rather than simultaneous, and the label is the effect size chosen under EFFECT SIZE.
- Show each source's mean (on by default) draws each source's mean over the data as a larger hollow marker (a SuperPlot; Lord et al. 2020), so the plot shows how many sources there are as well as how many values.
Repeated Measures by Group
For subjects in 2 or more groups, each measured at several conditions: a table with one row per subject, a column of groups, as codes (0, 1, 2…) or labels that repeat (WT, KO; shown as written, in the order they first appear) and one column per condition. The chart puts the conditions across, one color per group, with each group's mean ± error bars joined across conditions and each subject's own line faint behind them. Its brackets come from a linear mixed model (see Statistics → Linear Mixed Model), not from a separate test at each condition.
- Making one: on a chart of such a table, the Repeated Measures by Group box in Plot Style lists the conditions. Pick the Group column and, if several subjects come from one source (a batch, plot, site or animal), Subjects from the same (the column naming each one's source), then click Make Repeated Measures Chart. Back to One Column per Category (in the Subjects and Means box) or ⌘Z undoes it. A Statistics window set to the Split-plot or Mixed model design makes the same chart with Make Chart. For such a table (the group column first, or named like a grouping such as Group, CellType or Treatment, beside measurements), the Chart tab's Data Layout box and the top of the Statistics tab offer this box with a note, so the mixed model is two clicks away.
- Subjects and Means (Plot Style): Each subject's line, Group means ± error bars (with Join the means across conditions), Offset the groups slightly, Data points and Subject line opacity. The Error Bars box sets the error bar type. With Each subject's line on, set the lines' opacity, width and color there; Match each group's color sets them back after a group's color changes.
- On a profile, Paired / Repeated shows checked and can't be changed: each row is one subject followed across the conditions in its group, which the mixed model accounts for. Its brackets come from that model, with simultaneous CIs (Statistics tab › Compute Brackets): the groups compared at each condition, or their rates of change over the conditions you choose (see Rate of change below).
- Brackets (Statistics tab → Compute Brackets): the MIXED MODEL zone replaces Compare. Choose Trend (None (any shape), or a linear, quadratic or cubic trend), Covariance (Unstructured (MMRM) by default), Spreads (Assumed equal by default, or May differ: each group its own residual SD or covariance) and an optional Values from the same column. Each bracket joins two groups at one condition and shows an effect size for the difference in their model-based means (first group minus second), chosen under Effect size: Hedges' g* (the default), Cohen's d*, or Δ in the data's units, with its simultaneous CI, then its p, adjusted over the whole family (Δ's CI matches it exactly; g*'s and d*'s are a little wider).
- Every condition's brackets are drawn at first. The Show menu above the bracket list narrows them (Chosen in the list, Adjusted p < α, CI excludes 0, or an effect at least a size you type), says how many are drawn, and has Show All; the methods text states which were drawn and why. Under Header (BRACKETS → Display), Rate of change (difference in slope) adds, for brackets at each condition, each pair's difference in slope, with its CI and p, above the brackets.
- Rate of change: Brackets (in the MIXED MODEL zone) chooses Each condition (the default) or Rate of change. Rate of change asks whether one group rises or falls faster than another, which a single condition tests only weakly. Each group's rate is the least-squares slope through its model-based means, in the data's units per unit, and there is one bracket per pair of groups, spanning the conditions the slope covers, labeled with the difference in slope (first group minus second), its CI and its p, adjusted over the pairs (simultaneous CIs to match). The methods text describes whichever was drawn.
- Slope over … to … limits the slope to part of the profile, such as the response after a drug is applied; it starts as every condition, and the model is still fitted to them all. A condition left out of the model (every subject the same, such as a normalization baseline) is left out of the slope too.
- Show each group's fitted line (off at first) draws each group's straight line over those conditions, dashed in its color, so the slopes being compared can be seen. The legend then adds a dashed Fitted lines entry and the figure legend says what the lines are.
- Effect size (under the window), with Rate of change chosen, sets what each bracket reports: Δ change over the window (the default), how much more one group changed than the other there, in the data's units (the difference in slope times the window's length, the gap the fitted lines open); Δ slope per unit, to 3 significant figures; or dGMA, that change in SDs of a single value (Feingold 2009), with the model's SD of a single value over the window's conditions in place of the baseline SD, so it works for data normalized to a baseline, and an approximate CI. The time-point Effect size choices (g*, d*, Δ) are hidden then.
- Counts (Header, on by default) adds the counts behind the model above the brackets: the subjects (rows) used and, with Values from the same, the sources they come from, in all and per group (“n = 60 subjects from 17 animals”, then “CellType 1: 16 from 6 · …”), and which groups share sources, whose comparison is then partly within sources. The figure legend states them too.
- Each bracket in the list shows its Satterthwaite df beside its p, which reflects how much the comparison rests on: with several subjects per source it lies nearer the number of sources than the number of subjects. Group names keep their underscores as typed in bracket labels.
- Linked: the chart, its spreadsheet and the Statistics window are one analysis. The chart's spreadsheet shows the subject table (the group column, the conditions and any source column), and editing it updates the chart. Changing the data, the group or source column, Time or Covariance in a linked Statistics window updates the same chart and recomputes its brackets.
Effect Size Brackets
On the Statistics tab, set up and compute effect size brackets. For continuous data the tab is laid out in zones, in the same order and with the same wording as the Statistics window's Compare analysis: Paired / Repeated at the top, then DATA, DATA CHARACTERISTICS, EFFECT SIZE, TEST and BRACKETS. BRACKETS starts with the Compute Brackets button, so the zones above are set up first, then has two parts: Display (what each bracket shows) and Position (the list of brackets). Show Estimation Plot sits at the foot of EFFECT SIZE, since the Compare choice there decides what the plot's difference axis shows. Below the zones are Open Full Statistics Window and the Chart Legend box. Each bracket shows the effect size above and the p-value below by default; either can be hidden or moved. The test name is shown once, above the top bracket.
Compute Brackets runs the test named on the "Will run" line. There is no test picker: the test is the one that goes with the Compare choice (see Statistics → Compare), so each bracket's p-value and its effect size's CI answer the same question. Compare is Means until you choose (the data checks' suggestion applies only when you click Use), and the first computation stores the choice in force, so the saved chart keeps it.
Brackets are computed in the background, so the chart stays responsive while bootstrap intervals run; a small spinner beside Compute Brackets shows while they do. Brackets stay current. Editing the data, flipping Paired / Repeated, or changing the Compare choice, question, effect size, post-hoc, comparisons, control, tail, Spreads or CI setting recomputes brackets already on the chart; if the data can no longer be tested as set up, they are removed and the reason is shown under Compute Brackets. Each bracket's CI remembers the confidence level it was computed at.
- DATA: the Groups checklist (collapsed, all checked): uncheck a category, or on a chart with 2 or more series a series, to take it off the chart and out of every statistic; check it again to put it back in its place. Two categories always stay. The data of an unchecked group are kept and saved with the chart. On a chart with 2 or more series, Within category (compare series, not categories) compares the series with each other separately in each category (such as WT vs. KO at each condition); off (the default), the categories are compared using the first series. With Paired / Repeated on, the number of subjects with a value in every group is shown.
- DATA CHARACTERISTICS: labeled checks of normality, variance, outliers and shape, and the Compare choice they suggest, with a Use button when it differs from yours. Advisory only; see Statistics → Data Checks Are Advisory. Show possible outliers rings each flagged point in orange, without changing its own color or symbol; it is the same setting as Mark possible outliers in the Chart tab's Data Points panel (off by default; not for Box Plot, which marks its own outliers). When Trimmed means is in effect (your choice, or the suggestion once you click Use), a cyan ring also marks the points the 20% trim sets aside, and a note in the chart's bottom-right corner explains the ring.
- EFFECT SIZE: Compare (Means, Trimmed means, H-L shift, Ranks) and the estimate it reports; for paired Means the Question, Magnitude (gav or dav, the default) or Consistency (gz or dz); for independent Means, Spreads (May differ, the default, or Assumed equal, with Levene's result beside it for information), then Hedges' g* or Cohen's d* (g or d with Spreads Assumed equal), or Glass's Δ with a control, and a line saying what the chosen one divides by. Trimmed means, H-L shift and Ranks have one effect size each: AKP robust d, the Hodges-Lehmann estimate and dominance δ. The zone ends with Show Estimation Plot (see Estimation Plot).
- TEST: for 3 or more groups, Comparisons: All pairwise (the default) or vs. Control (the control is the first group unless you pick another; a group named like a control is offered as a suggestion with a Use button, never chosen by itself); when brackets are computed per category, Adjust p across categories (below); the "Will run" line; Multiple comparisons for Means with 3 or more groups (see Statistics → Multiple Comparisons); and Tails, for Means only. The test follows Spreads (in EFFECT SIZE): Welch's t, Welch's ANOVA, Games-Howell and Dunnett's T3 by default.
- BRACKETS: Compute Brackets, with the reason shown under it when the data can't be tested as set up. Display: the 95% CI checkbox (with 3 or more groups the intervals are simultaneous, Bonferroni, like the adjusted p-values); whether to show the effect size and the p-value, and on which side of the line; and the Header drawn once above the brackets: Test name, Omnibus test (3 or more groups: the overall test's name, statistic, df and p, plus ω² or partial η² for Means; paired trimmed means has none), both, or neither. With p-value off, the chart's methods text describes the effect sizes and CIs, and says p-values are not reported.
- A CI in square brackets [lo, hi] comes from a formula or the test itself; one in curly braces {lo, hi} is a bootstrap (AKP robust d, dav/gav; BCa or Percentile, set in Settings → Statistics). Where a rank-based (Hodges-Lehmann) CI cannot reach the requested level at very small n, the methods caption states the level it reaches.
- Proportions charts (two 0/1 series, whatever the chart type): the test is chosen automatically, McNemar's when Paired / Repeated is checked (on the subjects, i.e. rows, with values in both series) and Fisher's Exact otherwise (see Categorical Tests in the Statistics section). All effect sizes are signed by direction, and the other bracket style controls work as for continuous data. Labels compared within each category sit side by side; when one is wider than its category, all of them shrink together (to no less than 65%) so they don't overlap.
- Magnitude (McNemar's Question selector, the default) shows Δp, the difference in proportions (first series minus second) with Tango's paired score interval: how much more often one condition responded, in the chart's own units, using every subject. It is what reviewers of paired 0/1 data usually expect, and stays finite when no subject changed in one direction. Magnitude's menu also offers the paired odds ratio (b/c, labeled OR) and ln(Odds Ratio), with exact intervals; they are 0 or ∞ when a discordant cell is empty.
- Consistency (McNemar's Question selector) shows Cohen's g, the share of the changed subjects that changed toward the first series, minus ½. It describes only those subjects, so one changed subject gives its maximum, 0.5. Because a plain "g" on other charts is Hedges' g, the first McNemar bracket (the leftmost) spells it out as "Cohen's g" and the rest say "g".
- Discordant pairs: when Cohen's g or the odds ratio rests on fewer than 10 discordant pairs, the bracket adds their number, such as "g = 0.50 [−0.48, 0.50] (n=1)", and the Statistics tab notes it; "Always show discordant-pair count (n)" adds it to every McNemar bracket. Copy Chart Legend lists each comparison's discordant pairs (first only vs second only).
- Fisher's Exact always uses ln(Odds Ratio), with the exact CI matched to Fisher's p (Fay 2010), so it excludes 0 exactly when p is below α.
- p-values are printed to 3 decimals (p < 0.001 and p > 0.999 at the ends), with more decimals when rounding would land on or across 0.05 or 0.01 (0.04996 prints as 0.04996, not 0.050). A p-value outside 0 to 1 shows as n/a. The bracket list uses neutral colors: no p threshold is highlighted.
- Copy Chart Legend writes the methods sentence from what ran: the test (with the omnibus test and post-hoc for 3 or more groups), one- or two-sided, the comparisons (all pairs or each group against the named control), how a paired design handled missing values and its complete-case n, the question the effect size answers and its full name with its CI level (simultaneous for 3 or more groups, with the bootstrap method where used), and, when brackets are computed once per category, whether p-values were also adjusted across categories. For an Estimation Plot it describes the centers, the estimate and the bootstrap CIs.
- Adjust p across categories (Holm): shown when brackets are computed once per category (proportions charts, and "Within category" comparisons). Off by default, so each category is its own family, which suits categories that are separate outcomes or time points. Turn it on when the categories together answer one question: the comparisons of all categories are then one family, Holm-adjusted once from each comparison's unadjusted p-value (never adjusted twice; for Means with 3 or more series each pair's t-test takes the post-hoc's place), so the chance of any false positive in the whole figure stays at your significance level. The effect-size CIs then cover the same family: each is at the Bonferroni level for all M comparisons (1 − α/M), since Holm has no exactly matching intervals. Where the CI inverts the test behind the p-value (t-tests, Fisher's and McNemar's exact tests), a CI that excludes the null (0, or 1 for an odds ratio) always has a Holm-adjusted p below α, but a Holm-adjusted p below α can still have a CI that reaches it. The methods caption says so.
- 0/1 data on one series (or in "Within category" mode with 3 or more series): when every compared value is 0 or 1, the brackets compare proportions, as the Statistics window does, whatever Compare is set to. Independent groups: Fisher's exact test, with the odds ratio (the conditional maximum-likelihood estimate, first group over second) and its exact CI matched to the test (Fay 2010, as R's exact2x2 gives it): the odds ratios the same two-sided test does not reject, so the CI excludes 1 exactly when p is below α. When a group is all 0s or all 1s the odds ratio and one bound are 0 or ∞. The difference in proportions (Δp, first group minus second) comes first, without a CI, since no interval for it matches Fisher's p: 7/12 vs 2/11 shows "Δp = 0.40, OR = 5.77 [0.87, 52.2]" beside p = 0.089. Paired / Repeated: McNemar's exact test, with Δp, the paired odds ratio, ln(Odds Ratio) or Cohen's g as for proportions charts. With 3 or more groups the pairs are Holm-adjusted, the CIs are simultaneous (Bonferroni, each at 1 − α/m, so it excludes 1 exactly when the pair's unadjusted p is below α/m), and the Omnibus test header shows Fisher's exact test of the whole table or Cochran's Q (paired).
- Position: nudge a bracket with the up/down arrows beside it in the list, or move all visible brackets together with the arrows in the "All" row. Recomputing keeps your positions and show/hide choices.
- Show (above the bracket list) chooses which brackets are drawn: All comparisons (the default), Chosen in the list (checking or unchecking a bracket switches to this), Adjusted p < α (offered while p is shown), CI excludes 0 (1 for an odds ratio), or an effect at least a size you type (for example |g*| ≥ 0.5, either direction). Every comparison is still computed and adjusted as one family. A line says how many are drawn (Showing 4 of 27 comparisons), with Show All, and Copy Chart Legend says which were drawn and why. With many columns, choosing which comparisons to make before looking at the results (vs. Control, or the list) keeps a chart clear more defensibly than hiding results.
- Nudging, removing a bracket, Clear All and Reset Positions can all be undone with ⌘Z.
Data Entry
- Select a tab-delimited table in the Data Log or any text editor, then choose Chart Selection… (⇧⌘H) from the Text Tools or File menu.
- Or use File → New Spreadsheet (⌥⌘N), enter the data and click Data to Chart in its toolbar.
- Each column = one category. Each row = one replicate. First row can be column headers. For groups measured across conditions (a group column, codes or labels, and one column per condition), see Repeated Measures by Group.
- Double-click category labels on the chart to rename them.
Inspector Reference
Plot Style panel controls by chart type
- Bar/Horizontal Bar: point overlay style, point size/opacity, Mean / Bar display (with Median and quartile lines, Violin width and Violin opacity for violins), bar opacity, bar width, bar gap, mean offset (with Mean symbol or Mean line), error bar mode and cap width, connection lines (when Paired is on). A profile adds Subjects and Means, and a table with a group-code column offers Repeated Measures by Group.
- Estimation Plot: Differences (vs. any one group, or All pairwise, with 3 or more groups), point overlay style, point size/opacity, hide data points, hide mean marker & error bars, hide sampling distributions, mean marker style, mean offset, connection lines (when Paired is on).
- Box Plot: point overlay style, point size/opacity, connection lines (when Paired is on). Box: Notches, Copy Box Statistics.
- Kaplan-Meier Curve: censor marks, median lines, log-rank result, confidence band (with Band scale) and numbers-at-risk table toggles; curve and median line widths; Tests (weighting, strata, HR reference, Cox model, Firth-penalized Cox, pairwise tests); per-group color overrides.
- Ridge Plot: overlap, rug marks. Ridge colors follow the category palette or your per-category overrides, as for Pie wedges.
- Manhattan Plot: genome-wide and suggestive threshold values, line colors and visibility, the Bonferroni line (α, color), the genomic inflation λ, Open QQ Plot, the two chromosome colors, equal-width chromosomes (on by default), Read 23–26 as X, Y, XY, MT (PLINK, human), point size/opacity, automatic top-hit labels (one per locus) and the maximum label count.
- Line: error bars (SD, SEM or CI), Category gap (padding at each end of the X axis), Curved lines, and with several series Offset the series slightly. Curved lines joins the points with a smooth curve through every point instead of straight segments. It never rises above or falls below its neighbors, so it shows no peak the data don't have.
- Scatter (X,Y): point size and opacity, Connect Points, per-series color overrides. Fit lines are on the Statistics tab.
- Pie: Wedges (each wedge's color, name and Explode checkbox), and a note when negative values are left out.
- Volcano Plot / MA Plot and Heatmap: see Omics Visualization.
Axes & Labels panel controls
- All types: chart title (text, font, size, color).
- Bar/Line/Scatter (X,Y)/Estimation/Box Plot/Volcano/Heatmap/Kaplan-Meier Curve/Ridge Plot/Manhattan Plot: X axis label, Y axis label, axis label font, tick value font, axis color, tick color, axis line width, tick length/width. Kaplan-Meier's Y axis always ticks at 0, 25, 50, 75 and 100%. Ridge Plot's Y axis and Manhattan Plot's X axis show names instead of numbers, but their axis label fields still draw a title.
- Tick values: automatic ticks step by 1, 2 or 5 times a power of ten (25, 250 and so on also appear, since they stay whole numbers), so labels rarely need two decimals. A Min or Max you type is kept as typed.
- Rescale units automatically (Tick Values box; Bar, Horizontal Bar, Box Plot, Line and Scatter (X,Y)): when an axis title ends with a unit in parentheses or brackets, such as "Current (nA)", the axis switches to the prefix that avoids long decimals or long numbers, and the title changes to match: 0.02 nA reads 20 pA, 0.25 V reads 250 mV, 0.005 s reads 5 ms, 25000 pA reads 25 nA. It works for V, A, s, Ω (or ohm), M, mol, g, L, Hz, S, F, W and m, with or without a prefix. Other units (%, a.u., mV/ms, min, cm) and titles without a unit are left alone. Only the axis changes: the data, the Range fields and all statistics keep the unit you typed, and a clicked point's value is shown in the axis's unit. Exports match the screen. On by default; turn it off to keep the unit as typed.
- Bar/Line/Scatter (X,Y)/Estimation/Box Plot/Kaplan-Meier Curve/Ridge Plot/Manhattan Plot: grid color/width/dash/count/show. Heatmap has its own "Show cell grid" controls for the lines between cells. Volcano Plot and MA Plot have no grid, as is conventional.
- Pie: Labels (label mode, Position, Size, Font, Text color), Shape (inner radius, Explode distance, wedge stroke color and width), and the legend's Layout and Size under Appearance.
- All: show legend, background color (with dark/light invert offer).
- Legend font (Appearance) sets the font of the legend and of the text a chart adds itself, such as Venn and UpSet counts, gene and cluster labels, color-scale titles and effect-size brackets. A new chart starts in Settings' default font.
- Axis titles default to the table's column headers ("Dose (mM)" rather than "Categories"). A title you typed is never overwritten, even when the data are re-read. Without a header, each chart type gets a suitable generic title (such as X/Y for Cluster Scatter, Rows/Columns for Heatmap, Gene Set/Score for GSEA Bar, X Value/Y Value for Scatter (X,Y)).
Copy / Paste Chart Style
Copy a chart's look and paste it onto another chart: fonts, colors, sizes, axis styles, error bar mode and point overlay style. The target keeps its data, axis ranges, chart type, title and axis titles, and a Volcano Plot's color, size, shape or opacity mapping travels only to a column the target has.
- Press ⌥⌘C, or choose Copy Style from the Graph Utilities menu or the chart's right-click menu.
- In the target chart window press ⌥⌘V, or choose Paste Style (Graph Utilities menu or right-click), available once a style has been copied.
- Text and shape (line/arrow) annotations come along and replace the target's annotations, in the same positions. To copy a single annotation within one window, use the Duplicate button in its editor (click the annotation). See Text & Shape Annotations.
- Data, category labels and effect size brackets are not changed.
- ⌥⌘C / ⌥⌘V copy and paste the style of whichever window is in front: chart, graph or image.
- Graph windows: Paste Style brings the look (symbols, lines, colors, with per-sweep colors repeating across the target's sweeps, fonts, axes, ticks, the scale bar's look and the legend) and the annotations. Values in the source graph's data units stay the target's own: the X tick spacing, scale bar lengths and logarithmic axes, as do hidden legend entries. A sweep with its own line or symbol shape keeps its whole style: kept AP markers, a result graph's points, a fit's line, or a sweep you styled on its own. ⌘Z undoes the paste by itself, apart from a change made just before it.
References
Breslow N (1970). A generalized Kruskal-Wallis test for comparing K samples subject to unequal patterns of censorship. Biometrika, 57(3):579–594. The Gehan-Breslow weighting of the Kaplan-Meier test.
Brookmeyer R & Crowley J (1982). A confidence interval for the median survival time. Biometrics, 38(1):29–41. The median survival CI on Kaplan-Meier charts.
Brown LD, Cai TT & DasGupta A (2001). Interval estimation for a binomial proportion. Statistical Science, 16(2):101–133. https://doi.org/10.1214/ss/1009213286 Why the Estimation Plot uses the Wilson interval for a proportion.
Cohen J (1988). Statistical Power Analysis for the Behavioral Sciences, 2nd edition. Hillsdale, NJ: Lawrence Erlbaum Associates. Cohen's h for a difference in proportions.
Cox DR (1972). Regression models and life-tables. Journal of the Royal Statistical Society, Series B, 34(2):187–220. The proportional-hazards model behind the Kaplan-Meier hazard ratio.
Cumming G & Calin-Jageman R (2024). Introduction to the New Statistics: Estimation, Open Science, and Beyond, 2nd edition. New York: Routledge. The basis of the Estimation Plot.
Efron B (1977). The efficiency of Cox's likelihood function for censored data. Journal of the American Statistical Association, 72(359):557–565. The handling of tied event times in the hazard ratio.
Fagerland MW, Lydersen S & Laake P (2014). Recommended tests and confidence intervals for paired binomial proportions. Statistics in Medicine, 33(16):2850–2875. Tango's score interval among those recommended for a difference of paired proportions.
Fagerland MW, Lydersen S & Laake P (2015). Recommended confidence intervals for two independent binomial proportions. Statistical Methods in Medical Research, 24(2):224–254. Newcombe's interval among those recommended for a difference of independent proportions.
Firth D (1993). Bias reduction of maximum likelihood estimates. Biometrika, 80(1):27–38. The penalized likelihood behind Firth-penalized Cox on Kaplan-Meier charts.
Gehan EA (1965). A generalized Wilcoxon test for comparing arbitrarily singly-censored samples. Biometrika, 52(1/2):203–223. The Gehan-Breslow weighting of the Kaplan-Meier test.
Grambsch PM & Therneau TM (1994). Proportional hazards tests and diagnostics based on weighted residuals. Biometrika, 81(3):515–526. The Kaplan-Meier chart's proportional-hazards test.
Harrington DP & Fleming TR (1982). A class of rank test procedures for censored survival data. Biometrika, 69(3):553–566. The Fleming-Harrington weighting of the Kaplan-Meier test.
Heinze G & Schemper M (2001). A solution to the problem of monotone likelihood in Cox regression. Biometrics, 57(1):114–119. Firth's penalized Cox regression (R's coxphf), used when a hazard ratio is not estimable or Firth-penalized Cox is on.
Ho J, Tumkaya T, Aryal S, Choi H & Claridge-Chang A (2019). Moving beyond P values: data analysis with estimation graphics. Nature Methods, 16(7):565–566. https://doi.org/10.1038/s41592-019-0470-3 DABEST; the Estimation Plot's bootstrap intervals and sampling-distribution curves.
Hotelling H (1931). The generalization of Student's ratio. Annals of Mathematical Statistics, 2(3):360–378. The PCA chart's Confidence (group mean) ellipses: the T² region, exact at any group size.
Holm S (1979). A simple sequentially rejective multiple test procedure. Scandinavian Journal of Statistics, 6(2):65–70. The adjustment of the Kaplan-Meier pairwise tests.
Lê S, Josse J & Husson F (2008). FactoMineR: an R package for multivariate analysis. Journal of Statistical Software, 25(1):1–18. The PCA chart's Confidence (group mean) ellipses follow its shape; the radius is Hotelling's exact one instead (see Hotelling 1931).
McGill R, Tukey JW & Larsen WA (1978). Variations of box plots. The American Statistician, 32(1):12–16. Box plot notches.
Moher D, Hopewell S, Schulz KF, Montori V, Gøtzsche PC, Devereaux PJ, Elbourne D, Egger M & Altman DG (2010). CONSORT 2010 explanation and elaboration: updated guidelines for reporting parallel group randomised trials. BMJ, 340:c869. https://doi.org/10.1136/bmj.c869. Item 17b: for a binary outcome, report an absolute effect size, such as the difference in proportions (Δp), beside any relative one, such as an odds ratio.
Newcombe RG (1998a). Interval estimation for the difference between independent proportions: comparison of eleven methods. Statistics in Medicine, 17(8):873–890. The hybrid score interval (method 10) for the Estimation Plot's difference in proportions.
Silverman BW & Young GA (1987). The bootstrap: to smooth or not to smooth? Biometrika, 74(3):469–479. The smoothed bootstrap behind the Estimation Plot's medians and trimmed means.
Tango T (1998). Equivalence test and confidence interval for the difference in proportions for the paired-sample design. Statistics in Medicine, 17(8):891–908. The score interval for the paired difference in proportions: McNemar's Δp and the Estimation Plot's paired difference.
Tarone RE & Ware J (1977). On distribution-free tests for equality of survival distributions. Biometrika, 64(1):156–160. The Tarone-Ware weighting of the Kaplan-Meier test.
Venables WN & Ripley BD (2002). Modern Applied Statistics with S, 4th edition. New York: Springer. cov.trob, used for the PCA chart's t ellipses.
Wilson EB (1927). Probable inference, the law of succession, and statistical inference. Journal of the American Statistical Association, 22(158):209–212. The Wilson score interval for a proportion.
Graphs: The Waveform Viewer
Each graph window has a toolbar at the top, a bar of sweep controls above the plot, the plot itself, a status bar at the bottom and the inspector on the right. Every window keeps its own inspector settings. For zooming, cursors and moving through sweeps, see Navigating Graphs.
Toolbar Buttons (left to right)
- Export: save the graph as an image (PNG, JPEG, TIFF, GIF, PDF, SVG), copy it as PDF, send it to Keynote, or save its data as @Graph, ABF, AxoGraph, HDF5, MATLAB, NWB or CSV. File → Export… (⇧⌘E) opens the image export panel directly.
- Spreadsheet: shows the sweeps in an editable grid, one channel at a time (turn on 'Show all channels' to see them all). See Spreadsheets.
- Cursors (⌘K): show or hide cursors A and B.
- Inspector (⌘I): show or hide the inspector.
Export Visible…, in the bar above the plot, copies just the sweeps you're showing into a new window, a new .@graph file, or both. With the X axis zoomed, it can also cut each sweep to the range on screen.
The status bar shows the number of channels and sweeps, the samples per sweep and the duration. On its right are JP Correction (below) and, for a recording with two or more channels or while an Rₛ correction is applied, the Rₛ button (see Modifying Graphs).
The Inspector
The inspector opens when a file is loaded. Click a category icon at the top, then a tab below it:
- Display: Plot Style (symbols, lines, legend, sweep names), Axes & Labels (axes, ticks, grid, labels, title, background, scale bars, interval bars, error bars, trend/base lines), Range (axis limits, log scale), Groups (grouping, group order).
- Modify: Data Transform (Y scale and offset, X scale, Set X = 0), Graph Tools (Decimate, Interpolate, Resample, Integrate, Differentiate), Filter/Smoothing, Baseline, Rₛ Correction.
- Signal: Average, Normalize, Align at Peak, PSD / FFT.
- Analyze: Measure, Peaks, Curve Fitting, Synapse Detection, AP Detection, LFP / Spike Train Analysis.
In any inspector panel, pressing Return (↩) in a number field runs the panel's main action (Apply Filter, Measure, Fit and so on). The LFP / Spike Train Analysis panel has many actions, so there you click the one you want.
Graph Title and Axis Labels
In the Axes & Labels panel, 'Show title' adds a title above the plot with its own font, size and color. With 'Show axis labels' on, the X and Y label fields set the text along each axis (for example 'Voltage (mV)'), with the name and unit entered separately; a time axis picks its unit for you. You can also double-click an axis label on the plot to edit it.
Window Size
The small round button at the top right of the window sets its exact size in points (1/72 inch), the unit of PDF and SVG export. Match window, Copy as PDF and Send to Keynote use the size of the graph area inside it, so windows given the same size (with the inspector shown or hidden alike) export as figures of the same size. Any size from the window's minimum up to 10,000 points works.
Junction Potential Correction
Click 'JP Correction' in the status bar to turn it on, and type the liquid junction potential (LJP) in the mV field next to it. While it's on, membrane-potential channels show V(corrected) = V(recorded) − LJP, and measurements use the corrected values. Your data isn't changed: turning it off brings back the recorded values, and switching it or changing the value can be undone with ⌘Z. New graphs start with the on/off state and value set in Settings → Neurophysiology.
Only a voltage channel that looks like a membrane potential is corrected: a channel in mV or V whose values all lie between −120 and +180 mV and whose typical level (its median) is at least 20 mV away from 0, such as a cell at rest or a voltage-clamp holding potential. Current channels are left alone, and so are voltages near 0 or outside that range: extracellular recordings, TTL and trigger lines, and traces already relative to their baseline. A file with no such channel, or whose reader couldn't confirm the voltage scaling, opens with correction off.
Imaging Analysis
The Image window loads, displays and analyzes fluorescence microscopy data: single TIFFs, TIFF sequences, T-series and Z-stacks, including Leica, Nikon, Prairie View and Zeiss files. Intensity traces measured from regions of interest (ROIs) can be sent straight to a Graph window.
The window shows the image with its playback controls below it, and an inspector on the right with four tabs: Channels (display), ROIs (drawing, detecting and listing ROIs, pixel size and scale bar), Analyze (how traces are measured, and Measure) and Register (drift correction). The sidebar button at the top right shows or hides the inspector. After Measure, the traces appear in a graph below the image.
Opening Images
Image files can be opened in several ways:
- Drag a TIFF (.tif/.tiff), Zeiss CZI (.czi) or LSM (.lsm), Nikon ND2 (.nd2), Leica LIF (.lif), Prairie View XML (.xml), or a folder of TIFFs onto the Data Log, any open @Graph window, or the Dock icon.
- File → Open File… (⌘O) lists the image formats alongside the recording formats, and image files appear in File → Open Recent.
- File → New Data Importer (⌘N) opens a drop-zone window listing every importable file type by kind (Data Files, Image Files, Text / Spreadsheet Files); it closes once a file is accepted.
- Prairie View: drag the .xml file. @Graph asks for access to the folder of TIFFs beside it, if it can't already read it; click Open Folder in the panel that appears.
- Folder of TIFFs: files load in natural order, as in Finder (frame_2 before frame_10). Files holding several pages each load every page, in file then page order. A folder of ImageJ Z-stacks, one per time point, opens as a Z-stack over time, and a folder holding an OME-TIFF set opens as that set. A folder saved by Fiji takes its pixel size from the first file.
- A file holding more than 4 images (CZI scenes, ND2 positions, LIF or OME-TIFF series) shows Choose What to Open, listing each image with its size, channels, Z and T. All are checked to start: uncheck any you don't need (Check All and Check None help), then click Open. A file with 4 or fewer opens one window for each.
A folder of TIFFs is treated as a T-series by default. Enable 'Treat T-series as Z-stack' in the Channels panel to reinterpret the same folder as a Z-stack.
Automatic Display Setup
When an image loads, @Graph sets up the display automatically:
- Scale bar: shown when the file records a pixel size. Its length is a round number, 1, 2 or 5 × a power of ten (such as 20 µm or 50 µm), about 15% of the image width. For a file with none (such as a plain TIFF), enter it, or choose the objective, coupler, camera and binning, in the ROIs tab under Microscopy Setup (pixel size = camera pixel × binning ÷ (objective × coupler)); until then the scale bar has no length and ROI sizes aren't shown in µm. When the image is the camera's sensor size divided by 2, 3, 4 or 8, Microscopy Setup asks whether the camera was binned: leaving 2 × 2 binning out halves every length and quarters every area.
- Non-square pixels: when the file records different X and Y pixel sizes, each is used for its own axis. ROI widths use the X size, heights the Y size, areas both, and a line's length combines them. The scale bar uses the size of whichever axis is horizontal on screen, so it stays right after rotating by 90°. When the Y axis isn't a length (a Leica XT line scan, where Y is time), only widths are given and a scale bar is shown only while X is horizontal.
- Scale bar color: 'Auto' (on by default) picks white or black on every frame from the image behind the bar, so it stays legible. Turn Auto off to choose the color yourself with the 'White' checkbox.
- Display range: an ImageJ or Fiji TIFF opens with the display range it was saved with (each channel's, for a composite), as in Fiji. Other images open spanning the first time point's lowest to highest value. Click Auto to fit the range to the data instead.
Channels Panel
Each channel has its own row: a checkbox to show or hide it, its color swatch and name, the LUT, Raw and Smoothing, the display range (Min, Max and Auto) and, for a Z-stack, Z proj. Below the rows are Frame avg., Interval and the Z and T options.
- Raw (on by default for single-channel images): shows pixel values as a linear gray ramp from Min (black) to Max (white), with no color table. ROI measurements always use the raw detector values, whatever this setting.
- LUT (color table): used when Raw is off. Emission λ gives the hue of the fluorophore's emission peak; Channel Color shows the channel in its own color (picking a color with the channel's swatch selects it); Grays, Green, Red, Blue, Cyan and Magenta are single-color ramps; Fire (ImageJ's, ending in white) and Hot bring out detail in bright areas; Viridis looks even to the eye, though its lowest color is a dark purple rather than black, so in a multichannel composite it tints the background.
- Emission λ: shows a spectrum slider; drag it to the fluorophore's emission wavelength, or type one (380–700 nm) in the field beside it. Defaults: Ch1 = 520 nm (GFP/FITC), Ch2 = 610 nm (mCherry), Ch3 = 670 nm (Cy5), Ch4 = 460 nm (DAPI).
- Smoothing (default off): one setting for the whole image, so any channel's box turns it on or off for every channel. Off, each pixel is a sharp square, exactly as recorded. On, neighboring pixels are blended when the image is enlarged, on screen and in exports; this can make gradients easier to see but adds no real detail.
- Display range Min / Max: the range is cut into 256 equal steps, one per color, so pixels at or below Min are black and those in the top step, up to Max and above, take the LUT's peak color (white in Raw). A Max below Min inverts the ramp. Auto sets the range so 0.35% of the pixels are saturated, half shown black and half at the top color, as ImageJ's Enhance Contrast (saturated=0.35) does. It reads the whole series, not just the frame on screen: every time point, and for a Z-stack what the canvas shows (the channel's Z projection at each time point with Show Z Projection on, otherwise every slice). It is computed exactly from every pixel value and not limited to the file's declared bit depth. For a floating-point, signed or calibrated image, Min and Max are shown in the image's true values.
- Z proj.: how Z slices are combined, both for display (with Show Z Projection on) and for ROI measurements of a Z-stack. Changing it re-runs Auto while the Z projection is shown. It appears only for a Z-stack.
- Subtract (images with 2+ channels): subtracts another channel's signal from this channel's measured traces, ROI by ROI and frame by frame, for example to remove bleed-through or a reference signal. With Subtract background on, each channel's own background is taken off first; ΔF/F₀ is computed after. It is saved with the image and copied with Copy Style, and leaves the image itself unchanged.
- Frame avg.: averages this many consecutive frames into each point of the measured traces, reducing noise at the cost of time resolution. Each point is plotted at the mean time of the frames it averages (the bin's center), and frames at the end that don't fill a whole bin are left out, so every point averages the same number of frames; the Data Log says how many. The displayed image and exported movie are not averaged. 1× (no averaging, the default) to 10×.
- Interval: time between frames, read from the file when it records one, and used for the time axis. A file without one (such as a plain multi-page TIFF or a folder of TIFFs) shows 'not set': its traces are then plotted against frame number (counted from 0), there is no time readout, Time Window baselines and "Real time" playback are unavailable, and movies play at 10 fps. Type the interval here to set it; it shows up to 6 significant digits, so a 0.5 ms interval reads 0.0005. Prairie View, Nikon ND2, Zeiss CZI and LSM, and Leica LIF files record each frame's time. When those frames are evenly spaced, the interval is their mean. They count as even when every frame lies within 5% of an interval of an even grid from the first frame to the last, allowing more for timing jitter (8 times its SD, up to a quarter of an interval), so jitter alone doesn't make a steady recording uneven. When they are not (repeated cycles with a pause between them, or acquisition phases at different rates), each time point keeps its own recorded time: the time readout, Time Window baselines, the trace graph, Send to Graph, CSV export and the movie clock all use it, the Interval field shows their median interval, marked "median", and the Data Log gives the range of intervals. Typing another Interval replaces the recorded times with even spacing.
- Treat T-series as Z-stack: treats every frame as a Z slice of a single time point. It is offered only for a plain time series (one without Z slices). Only needed for a Z-stack saved without Z information (such as a folder of TIFFs); files with real Z depth (ND2, CZI, LSM) don't need it. When checked, Orthogonal Views come on, showing slice 1 (Show Z Projection shows the stack collapsed). Every Z-stack has a 'Z step' field, read from the file when it records one: enter the real slice spacing there when it doesn't, or the XZ/YZ Orthogonal Views draw each slice as tall as one pixel is wide, and look squashed or stretched.
- Treat Z-stack as T-series: the reverse, shown for a Z-stack of one time point. Every Z slice becomes a time point, for a time-lapse saved as a plain stack (ImageJ saves any stack that isn't a hyperstack as Z slices). Set the frame interval above it.
Raw shows what the detector measured. Use a LUT for figures or multi-channel composites; measurements are unaffected either way.
Image Canvas
The image is centered and scaled to fit. The surround is dark charcoal rather than black, so the image edge is always visible. ⌘= and ⌘− zoom in and out, ⌘0 fits the image again, and the arrow keys pan. The toolbar's Rotate 90° button turns the image, with its ROIs, text and arrows, clockwise (Option-click turns it the other way), Metadata shows what the file records about the acquisition, and Scale Bar shows or hides the scale bar. Right-click the canvas for Copy Image, Copy as PDF, Copy Style and Paste Style (and, on an ROI, Delete ROI and Duplicate ROI).
Hover over the image to read the pixel under the pointer in the top-left corner: its position in pixels (and in µm when the pixel size is known) and each visible channel's value, in the image's true values (the Z projection's, when one is shown). The readout is on screen only and never appears in exports.
ROIs stay within the image. If you draw or drag an ROI partly outside, it snaps back inside.
Drawing ROIs
Pick a tool from the toolbar (Rectangle, Ellipse, Polygon, Freehand, Line, or Pointer for selecting and moving) and draw on the canvas. ROIs stay in place when the window is resized.
- Freehand: drag around a region to trace its outline as you go; release to close it. Escape cancels a freehand or polygon ROI in progress.
- ROIs are named ROI 1, ROI 2, and so on (one more than the highest number on the image), each with its own color, matching its trace in the sweep graph.
- To move an ROI, drag it, with any tool: pressing on an existing ROI selects and moves it instead of drawing a new one (the pointer turns into a hand over an ROI). Hold Option while dragging to duplicate it, or hold ⌘ to draw a new ROI starting inside an existing one. A move stays inside the image and can be undone with ⌘Z.
- To delete the selected ROI, press Delete, or right-click it and choose Delete ROI. The right-click menu also has Duplicate ROI.
- You can also delete an ROI from the ROIs tab, or remove them all with the toolbar's Clear ROIs button (which also clears the measured traces) or the ROIs tab's Clear All.
- Every change to the ROIs can be undone with ⌘Z and redone with ⇧⌘Z: drawing, duplicating, moving, deleting, renaming, setting the background ROI, Load ROIs, Auto-Detect, Paste Style, and the AI Assistant's ROI tools.
Text & Shape Annotations
The Add Overlay menu at the top right of the image adds movable text labels, lines and arrows on the image, separate from ROIs. It works the same way as on Graph and Chart windows.
- Choose Add Text, Add Line or Add Arrow. Drag an overlay to move it; click it to open its editor for font, color, size and style.
- Drag the editor by its ≡ handle if it covers something. It returns to its usual spot when you select another overlay.
- Drag the middle of a line or arrow to move it whole, keeping its length and angle.
- When dragging an endpoint: hold ⇧ Shift to snap to horizontal or vertical; hold ⌥ Option to rotate around the other end at a fixed length; hold both to do both.
- Duplicate (in the editor) makes an independent copy with the same style, slightly offset and already selected.
- On a Graph or Chart window, 'Position by data value' in the editor pins a label, or both ends of a line or arrow, to X and Y values, typed in the units the axes show (a graph's X in its ms or s, its Y in the axis title's unit, after any junction-potential correction). An image window, and a spike-train raster, place overlays on the canvas only.
- Overlays stay in place when the window is resized, appear in every export (image files, clipboard, PDF, movie) and are saved in the .@graph file.
- Delete an overlay from its editor. Every change to an overlay can be undone with ⌘Z: adding, moving, editing, duplicating and deleting. In an image window, so can changes to a channel's display (LUT, color, Min, Max, Auto, Z proj) and name, rotation, the scale bar (with its Auto and White), Frame avg. and the measuring settings; changes made in quick succession, such as a slider drag, undo as one step.
ROIs Panel
The ROIs tab starts with Microscopy Setup (the pixel size) and the scale bar settings, then lists all ROIs under Regions of Interest, each with its color, its name (editable), a BG button, a show/hide (eye) button and a delete (−) button. A hidden ROI (one saved hidden, say) isn't drawn or measured; its eye button shows it again. When the pixel size is known, each row also gives the ROI's size in µm (a line's length), and for an area ROI the number of pixels it measures and their area.
- Rename an ROI by editing its name and pressing Return (or clicking elsewhere).
- Select an ROI to see its statistics below its row, for each visible channel on the plane shown (the current frame and Z slice, or the Z projection when one is shown): mean, standard deviation (sample, n − 1), min, max and integrated density (area × mean), as ImageJ's Measure gives them, with the ROI's pixel count and area. They update as you move through the image. The AI Assistant reads the same statistics for any ROIs.
- Click BG to make an ROI the background reference. The row turns orange and the button reads Background; click it again to make the ROI a normal one. Only one ROI can be background at a time.
- The background ROI has a dashed border and a '◆BG' label on the canvas and in exports.
- The background ROI gets no trace of its own; it is used only for background subtraction (Analyze tab).
- Save ROIs / Load ROIs: saves all ROI positions and names as a .atgroi file, or loads one and adds its ROIs, with their colors, to those already on the image, so the same ROI set can be reused on other recordings. A file saved from an image of another size has its ROIs rescaled to the same relative positions; any part of an ROI outside the image is cut off, and an ROI wholly outside is left out, with a note.
- Clear All: removes every ROI after a confirmation (⌘Z brings them back).
Auto-Detect ROIs
Auto-Detect ROIs (ROIs tab; click it to show its settings) finds bright regions in a channel and adds one polygon ROI per region. The settings start at usable defaults, so you can click Detect ROIs straight away; the ROIs appear on the image at once. Treat the result as a starting point: every detected ROI can be edited by hand.
- Channel: the channel to threshold.
- Detect from: Current Frame uses the frame on screen; Mean of All Frames averages the whole series, usually the better choice for finding where cells sit, and the default for a time series (two frames or more). Three activity images find cells that fire but are dim at rest, which a mean misses: SD over Time (each pixel's sample SD through the series), Max − Mean (how far it rises at its peak), and Correlation with Neighbors (the mean Pearson correlation of each pixel's profile with its eight neighbors': a cell's pixels rise and fall together, while background pixels share only noise, near 0; the local correlation image of CaImAn and Suite2p). In a simulation with 15 bright labeled cells and 15 dim cells that fired a few times, the mean found none of the dim ones; each activity image found all 15. They are offered for a series of more than two frames.
- Smoothing (σ, px): the image is smoothed with a Gaussian of this width before it is thresholded (default 1 px; 0 turns it off; up to 10). On a single frame at ordinary photon counts the noise otherwise dominates the histogram, and Otsu's threshold lands inside it: in simulated fields of 60 cells of varied brightness, a raw frame found as few as none of them among hundreds of noise specks, and a 1-px Gaussian found 98–100%. Area, circularity and outlines are measured on the thresholded smoothed image; the ROIs' traces are measured on the raw data.
- Background radius (px, 0 = off, the default): before thresholding, the background is removed, the brightness a square of this radius fits under at each pixel (a grayscale opening, the "top hat"), so uneven illumination or a broad glow doesn't decide which cells pass one threshold. About 3 times the cells' radius suits. In simulated fields under a strong vignette, a single threshold found 76% of the cells; with a 20-px background radius, 98%. A manual threshold is then measured up from 0 instead of the display Min.
- Split touching cells (on by default): a region where cells touch is cut along the neck between them, a watershed of the region's distance map, merging any two parts whose peaks rise less than half a pixel above the saddle between them (ImageJ's binary Watershed rule). A neck narrower than the cells splits; an oval, whose distance map has a single ridge, doesn't. It judges shape only. In simulation on thresholded, smoothed, noisy fields, every single cell stayed whole, 97% of ovals 1.8–2.5 times as long as wide stayed whole, and 81% of touching pairs with centers 1.6–2 radii apart were split. The area, edge and circularity filters then judge each part.
- Auto threshold (Otsu), on by default: picks the threshold from the image's brightness histogram. For a single frame every brightness level gets its own histogram bin, as in scikit-image, so the threshold lands on an exact level even in 12- and 16-bit images; a mean of all frames uses 256 bins. The histogram covers the 0.1st to 99.9th percentile of the plane, values beyond clipped to it, so one hot or saturated pixel can't stretch it. Turn it off to set the Threshold slider yourself, as a percentage of the channel's Min to Max display range (50% to start); on an activity image (SD, max − mean, correlation), which is not on the channel's scale, as a percentage of that image's own 0.1st to 99.9th percentile range.
- Min Area and Max Area (px², 9 and 5,000 by default): discard regions outside this size range, such as single-pixel noise or a thresholded background. With a pixel size, the panel gives the same range in µm². A Min Area above Max Area is flagged in the panel and refused by Detect.
- Min Circularity: 4π × area ÷ perimeter² of each region's outline (see the tip below), from 0 to 1, with holes filled, so a cell with a dark nucleus (a ring) or a few noise pinholes is judged by its outline. About 1.00 for a round cell at any size, 0.85 for an oval twice as long as wide, 0.67–0.70 at three times, about 0.56 for a crescent, lower for a thin streak. Regions below the setting are discarded. The default, 0.5, keeps round and oval cells; 0 turns the filter off. Two touching cells merge into one region, which the smoothing rounds out to score 0.67–0.75, like a long oval, so circularity can't reliably separate them; Split touching cells (above) does.
- Exclude regions touching the frame edge (on by default): a region cut off by the border has an unknown true size.
- Detect ROIs adds the regions found to the image and says how many. Change a setting and click Detect Again to replace the ROIs the last run added with a new set (ROIs you drew or loaded are kept). The AI Assistant's auto-detect works the same way, replacing the previous run's ROIs. ⌘Z undoes each run. The same image and settings always give the same ROIs.
- Detect from Mean of All Frames with drift correction on averages, for each pixel, only the frames that imaged it: the border uncovered by a frame's shift is left out of that frame instead of repeating the edge pixel. Frames that can't be read are left out and listed in the Data Log.
Each outline is the line where the smoothed image crosses the threshold, traced between pixel centers (marching squares). The pixels inside it are exactly the detected region, holes filled, so an ROI measures that region and no more, and two ROIs never share a pixel; touching cells that were split meet halfway between their pixels.
Drift Correction (Register Panel)
The Register tab corrects XY drift (thermal creep, stage settling, vibration) that would otherwise move cells out from under their ROIs during a long time-lapse. Each frame is shifted, without rotation or warping, to line up with one reference frame.
- Registration Channel: the channel drift is measured from. Prefer a bright, structural channel over a sparsely active indicator.
- Reference Frame: the frame every other frame is aligned to, numbered from 1 as in the frame counter. Use Current picks the frame on screen. Average (10 by default; 1 for none): the reference is the mean of this many frames centered on it, each first aligned to the reference frame (frames that fail are left out), and every frame, the reference frame included, is then registered to that mean. A single frame's noise limits accuracy at low photon counts: at 5 photons per pixel, a 10-frame mean halved the error (from 1.0 to 0.5 px) and cut frames off by more than 1 px from 48% to 8% in simulation. It also dilutes cell activity in the reference, which pulls the estimate when an indicator channel is used.
- Max Drift Search (50 px by default): the largest distance from the reference frame searched, in pixels, measured as a distance (not per axis). Set it comfortably above the largest drift you expect: a larger setting is slower and gives more room for a wrong match. The slider runs from 5 px to half the image's short edge.
- How it searches: first on a copy reduced by 2 at a time, only as far as the search distance needs and never below a 64-px short edge (so sparse fields keep enough structure), then refined level by level within the search distance, to a sub-pixel estimate. A frame is accepted only when its best match stands out clearly from the next-best match elsewhere and lies inside the search distance; a dark frame, or a shift beyond the search distance, fails instead of returning a wrong shift.
- Before registration each plane is passed through a 3 × 3 median filter, which removes hot pixels: they don't move with the tissue and pull the estimate toward zero (0.2% hot pixels gave a mean error of 3.8 px in simulation; filtered, 0.06 px). It also lowers the error from ordinary noise. Changing the registration channel's Z projection clears a computed correction, as changing the channel does.
- Compute Drift Correction processes the whole series, shows its progress, turns the correction on and reports the largest shift found ("Max drift: N px"). Frames that could not be registered are counted in the status line and listed in the Data Log; their shift is interpolated in time from the nearest registered frames (held at the ends of the series), and Measure lists them again with the traces, as those samples are less certain.
- Apply Correction turns the computed correction on or off without recomputing, to compare the two.
- Clear discards the computed correction.
When applied, the correction is used everywhere: the canvas, image and movie export, Measure, and Auto-Detect ROIs' Mean of All Frames. Export Data as TIFF is the exception: it saves the pixels as recorded.
Measure takes each ROI's values from the shifted frame without rounding them. A fractional shift is applied by bilinear interpolation between the four nearest pixels, which averages a little noise away: for a one-pixel ROI at a half-pixel shift the frame-to-frame SD halves, while an ROI of many pixels is barely affected. Pixels shifted in from beyond the frame's edge were never imaged, so they are left out: an ROI that drift moves partly out of view in some frames is measured, in every frame, on the pixels that stay in view in all of them, so a brightness gradient across the ROI can't make a trend as the edge passes through it. If no pixel stays in view throughout, the frames that see only part of the ROI are gaps, like a frame with none of it in view. The Data Log says how many frames this affected for each ROI and channel. On screen and in exports, the uncovered edge is filled in for display only.
Only shifts are corrected. Rotation or non-rigid tissue deformation needs a dedicated registration tool.
Export Image, Movie and Data
The Export toolbar menu has two parts. As Shown (for figures and talks) has Export Image… and Export Movie…, which save what the window shows. Raw Data (for analysis) has Export Data as TIFF…, which saves the measured pixel values. File → Export… (⇧⌘E) also opens Export Image.
- As Shown exports look as they do on screen: current colors and display range, the Z slice or projection shown, rotation and drift correction, ROIs (background ROI dashed with its ◆BG label), overlays, the scale bar if shown, and the Smoothing setting. Text, outlines, ROI labels and the scale bar keep the size they have against the image in the window (at its fit, before zooming), whatever the export size. With every channel hidden, the image is black with its ROIs and overlays, as in the window. The pixel readout is never included.
- Export Image saves the current frame as PNG, TIFF, JPEG, GIF, PDF or SVG. PNG or TIFF is best for figures. JPEG and GIF lose detail or colors, so the panel marks them with a warning. PDF and SVG hold the picture as pixels, not vector shapes. Images are saved without transparency.
- Scale: a whole number. 1× keeps native pixels; 2×, 3×, 4×, 6× or 8× draws each image pixel as a sharp square block instead of blurring it (unless Smoothing is on). A small image starts at a scale that brings its long edge to about 512 pixels, so labels and the scale bar stay legible. The panel shows the output size in pixels.
- Resolution (300 dpi by default) sets only the print size stored in the file, shown in cm and inches; the pixels stay the same. For PDF and SVG it sets the size of the page. JPEG also has a quality slider (92% to start).
- If the scale bar is on but the image has no pixel size, the panel warns you and the bar is left out. Set the pixel size under Microscopy Setup in the ROIs tab.
- Export Movie saves every time point, or a fly-through of the Z slices. For a file with both, choose Time Points or Z Slices under Animate. A time movie shows the Z slice or projection on screen; a fly-through shows the current time point.
- Movie formats: MP4 (H.264) is small and plays everywhere, for sharing and talks. ProRes 4444 (.mov) is visually lossless, for editing. TIFF Stack keeps every frame exactly as shown (uncompressed RGB), and Fiji opens it with the frame interval or Z step set.
- Frame rate: 1, 2, 5, 10, 15, 24, 30 or 60 fps, or Real time when the recording's own rate is in that range. It starts at real time when it can, at 60 fps for a faster recording, and at 10 fps for a slower one or a file with no frame interval. The panel says how much faster or slower than real time the movie plays. The movie contains every acquired frame (Frame avg. does not apply).
- Show the elapsed time (or the Z position) on each frame burns in each frame's own recorded time since the first frame, or its depth (z = 2.50 µm; the slice number when there is no Z step). The elapsed time needs a frame interval.
- A progress bar shows while the movie is written. Cancel Export stops it and leaves no file. H.264 needs even frame sizes, so an odd size gets one black row or column, never a resample, and it allows at most 4096 pixels on a side: for larger frames, choose a smaller scale, ProRes 4444 or TIFF Stack.
- Export Data as TIFF saves the measured pixel values of every channel, Z slice and time point, for analysis in Fiji, napari or Python. Choose OME-TIFF (written as BigTIFF above 4 GB) or ImageJ TIFF (limited to 4 GB). The file keeps the pixel size, Z step, frame interval, and channel names and colors (an ImageJ TIFF also keeps each channel's display range); for unevenly spaced frames, an OME-TIFF keeps each frame's own time. 8- and 16-bit values, signed ones included, are saved exactly. For a floating-point or calibrated image, choose Calibrated values (32-bit floating point, as the measurements use them) or Stored levels (16-bit). Colors, contrast, rotation, drift correction, ROIs and annotations are not applied. A progress bar and Cancel Export are shown here too.
For figures, turn Raw off, choose a LUT (Emission λ recommended) and optionally turn on Smoothing. For sharing data, keep Raw on and Smoothing off. To analyze the pixels elsewhere, use Export Data as TIFF, not an image or movie.
Analyze Panel
The Analyze tab controls how intensity traces are computed and displayed.
- Sweep Mode: Raw Intensity (ADU, analog-to-digital units), ΔF/F₀ (fractional change from baseline), ΔF (absolute change), or Z-score. A Z-score's mean and SD come from the Whole Trace (SD ÷ n, as scipy.stats.zscore) or from the Baseline frames (sample SD, before frame averaging), chosen under Sweep Mode. Whole Trace compares shapes, but every transient raises its SD and lowers every z-score. Baseline reads each point in baseline noise SDs whatever the events do: in a simulation, one transient scored 6.2 against the whole trace and 14.2 against the baseline, and with two more transients, 3.9 and still 14.2.
- Baseline (F₀): shown for ΔF/F₀, ΔF and a baseline z-score. Options: First N Frames (10 by default), Frame Range (first and last frame, numbered from 1 as in the frame counter), Sliding Percentile (below), or Time Window (start and end, in seconds: the frames whose time lies in that range, ends included, with the first frame at 0 s; each frame's recorded time when the frames are unevenly spaced). Frame counts and numbers are acquired frames, even when Frame avg. is above 1×: F₀ is the mean of exactly those frames, taken before averaging, so it never takes in frames past the end of the baseline. A Time Window needs a frame interval; without one, ΔF/F₀ and ΔF are not computed and the Data Log says so. The same happens if the baseline holds no measured frame.
- F₀ from the Mean or the Median (window baselines): the median, with 1.4826 × the median absolute deviation as its spread, is barely moved by a transient that falls inside the baseline; its standard error, for the zero test below, is about 1.25 times the mean's.
- A baseline of a single frame (First N Frames with N = 1, say) has no spread, so whether F₀ differs from zero can't be checked; the Data Log says so. N can't be set below 1.
- Sliding Percentile baseline: for each frame, F₀ is a low percentile (8th by default) of the measured frames within half the window (30 s by default; frames with no frame interval) on either side, cut at the ends of the series, so it follows slow drift and photobleaching instead of fixing F₀ at the start (the usual calcium-imaging baseline, as in Dombeck et al. 2007). A low percentile of noisy frames sits below the baseline itself (1.41 noise SDs at the 8th), so F₀ is raised by that amount, using the trace's robust frame-to-frame noise: in simulation, ΔF/F₀ between events read 0.03–0.14 uncorrected and within ±0.01 corrected. Keep the window several times longer than a transient and well under the bleaching time constant. A point whose F₀ can't be told apart from zero (3 standard errors of the percentile) is a gap. With a baseline z-score, the scale is the robust SD of the trace about F₀(t).
- Background: turn on 'Subtract background' to subtract the background ROI's mean intensity from every ROI, frame by frame, before Sweep Mode is applied. Mark a BG ROI in the ROIs tab first (the panel names the one in use). If Subtract background is on but there is no visible background ROI, the Data Log says so. When a channel also has Subtract set, each of the two channels has its own background taken off before one is subtracted from the other.
- Subtract neuropil: F − r × Fneuropil, with r = 0.7 by default (the usual two-photon value) and editable from 0 to 2. The neuropil is a ring around each ROI from 2 px out, widened 5 px at a time until it holds 350 pixels (up to 50 px), leaving out every ROI's pixels so no cell counts as another's neuropil; it is drift-corrected like the ROI, and background-subtracted too when that is on: (F − B) − r·(Fnp − B). With a channel's Subtract set, each channel is corrected before one is subtracted from the other. The Data Log gives each ring's size. In a simulated cell picking up 0.7 of the neuropil's fluctuation, the trace's correlation with the neuropil fell from 1.00 to 0.00 and the transient kept its size.
- Photobleaching (Off, Single or Double Exponential): an offset plus one or two exponential decays is fitted to each trace after background and neuropil subtraction, robustly (iteratively reweighted with Tukey's bisquare, so transients barely pull it), and the decay of the bleaching part is undone, F' = C + (F − C)·g(0)/g(t), so the trace keeps its starting brightness and a constant offset isn't scaled. Time constants between 1/50 of the recording and 10 times it are searched; a trace with no clear decay is left as it is, with a note, and the correction is capped at 20×. In simulation, the robust fit's time constant was within 1.3% (median; at most 7%) of the true one with transients present, against 7% (at most 21%) for a plain least-squares fit. The Data Log gives each fit's time constants. For ΔF/F₀, a Sliding Percentile baseline already follows bleaching.
- Background-subtracted traces can go below zero, and should: near background level, noise swings both ways. Clipping at zero would bias F₀ and every ΔF/F₀ upward.
- If F₀ is not clearly above zero (not more than three standard errors above it, as happens when background subtraction removes almost all the signal), ΔF/F₀ is not computed for that trace, because dividing by it gives meaningless values. The trace is drawn as a gap, not a flat line that would look like a non-responding cell, and the Data Log records which ROI and channel was affected. Use ΔF or Raw Intensity for such traces.
- Measure: measures every visible, non-background ROI in every frame, for each visible channel (for a Z-stack, on the channel's Z projection), and plots the traces in the sweep graph below. Everything is measured with the settings as they are when you click Measure (ROIs, channels, Sweep Mode, baseline, frame averaging, drift correction): changing one while it runs doesn't affect that run. The traces keep those settings; after changing one, click Measure again. With more than one channel, each trace is named by ROI and channel.
- How an ROI is measured: each frame's value is the mean of the pixels whose centers lie inside the ROI (an ROI too small to hold any pixel center takes the pixels it touches; a line takes the pixels along its center line). Parts of an ROI outside the image are left out. The result is the same for every file format, and with drift correction on it is taken on the corrected frame. The ROIs list gives each area ROI's size and the number of pixels it measures, with their area in µm², which is what the trace averages; for a small or hand-drawn outline this can differ from the outline's own area. With the view turned 90°, width and height are given as seen on screen.
- Gaps: a frame whose plane, or any Z slice of it, can't be read is a gap in the trace, whatever the Z projection, and the Data Log counts them.
- Image Info: size, frame count, channels, Z slices, bit depth (the detector's real depth, such as 12-bit, when the file records it), pixel size (X × Y when the pixels aren't square) and frame interval ("not set" when the file has none; marked as the median when the frames are unevenly spaced).
A Whole Trace z-score expresses each trace in its own standard deviations, which helps compare ROIs with very different baseline brightness; to judge how far an event stands above the noise, use a Baseline z-score.
The Sweep Graph
After Measure, a graph below the movie controls shows one sweep per ROI, in the ROI's color; with more than one channel, each channel of an ROI has its own dash pattern (the first solid). The Y axis label follows the Sweep Mode (F (ADU), ΔF/F₀, ΔF or Z-score). The X axis is time, or the frame number (counted from 0) when the file has no frame interval; Send to Graph and CSV export use the same X, and a graph opened by Send to Graph keeps the unit (frame or s). With frame averaging, each point sits at the center of its frames, and Send to Graph shows that through the graph's X offset. Unevenly spaced frames are sent as X-Y data, each point at its own time; filters, spectra and other analyses that assume evenly spaced samples will be wrong on them, as the Data Log notes.
Sweep navigation (as in Graph windows):
- Tab / Shift-Tab: next / previous sweep. Stops at the first and last sweep.
- Space (images with one time point; in a T-series Space plays the movie): show one more sweep, returning to all sweeps after the last.
- Comma key: first sweep. Period key: last sweep.
- The header bar has matching navigation buttons, an All button to show every sweep again, and Clear, which removes the traces.
- While stepping through sweeps, the others stay in the legend, dimmed.
Axis interaction on the sweep graph:
- Drag in the plot area: zoom both axes to the rectangle.
- Drag on the Y-axis strip: zoom Y only.
- Drag on the X-axis tick numbers: zoom X only.
- Double-click the Y-axis strip or X-axis tick numbers: type exact axis limits.
- Double-click the plot area: zoom to fit the data.
- The X and Y pencil buttons above the graph rename the axis labels: X takes a name and a unit (such as "Time" / "s"), Y a single label (such as "ΔF/F₀"). Only the label changes, not the numbers. Reset restores the default label.
Send to Graph
Send to Graph (in the sweep graph header) opens all traces together on one graph in a Graph window, with the Y unit of the Sweep Mode the traces were measured with, so you can use its grouping, statistics and export tools. If the window from the last Send to Graph is still open, it is reused.
After sending to Graph, use the Grouping panel to arrange sweeps, or Groups mode to compare ROIs side by side.
Export CSV
The Export CSV toolbar button (available after Measure) saves the measured traces as a CSV file: a Time(s) column (Frame when the file has no frame interval), then one column per trace, labeled with the ROI name (and channel, when there is more than one). Values are exactly those in the sweep graph, with the Sweep Mode (ΔF/F₀, Z-score and so on) applied.
Z-Stacks and Z Projection
For a Z-stack (such as an ND2, LSM or CZI file), the main canvas shows one Z slice by default. Check 'Show Z Projection' in the Channels panel to show the stack combined using each channel's Z proj. setting. For a Z-stack saved as a folder of TIFFs, open the folder, then check 'Treat T-series as Z-stack' in the Channels panel.
Z projection modes:
- Max Intensity: the brightest value through the stack at each pixel. Best for showing the full extent of labeled structures (dendrites, fibers).
- Mean: the average through the stack. Less noisy, but can look dim because background counts equally.
- Sum: the total through the stack, proportional to the photons detected at each position. When the largest sum the stack could hold, slices × the bit depth's maximum, is too large for a 16-bit image, the image shows the sum divided by the smallest whole number that fits, and the Channels panel says by how much ("Sum shown ÷ 2"). The factor is the same at every time point, channel and in exported movies, so displayed sums compare across the series. Measure an ROI for the true sum.
- Min Intensity: the dimmest value through the stack. Useful for transmitted-light images or dark objects on a bright background.
- Standard Deviation: how much each pixel varies through the stack (the sample SD, ÷ (n − 1), as in ImageJ), highlighting regions that change most. The image shows it rounded to whole counts; ROI measurements use the exact value.
Auto sets the range for the selected projection, since projections (especially Standard Deviation) can have very different value ranges from a single slice.
With more than one channel, an All Channels row below the channel rows has its own Auto button and Z proj. picker, which apply to every channel still following them. Using a channel's own Auto or Z proj. makes just that channel stop following them.
T-series, Z-stacks, and Combined T×Z Files
A badge next to the frame counter shows what is loaded: "T-series: N", "Z-stack: N", "T×Z series: N×N" or "Single frame". Hover over it for the counts; for a T×Z file it also explains the two playback bars.
The main transport below the canvas always steps through time (T). When the file has more than one Z slice, a separate Z transport with its own Play/Pause and speed control appears above it. The two can play separately or together. When the file records a Z step, the Z transport shows the current slice's depth from the first (z = 2.5 µm).
Each transport has Play/Pause (Space plays a T-series), step buttons, a scrubber and a Speed menu (1 to 30 fps); the time transport also has a Loop button. For time, the Speed menu also offers Real time when the file has a frame interval: it plays at the recording's own rate, so a slow time-lapse plays as slowly as it was recorded, and a fast recording skips frames to keep time.
Orthogonal Views
'Show Orthogonal Views (XZ/YZ)' (Channels panel, on by default for Z-stacks; a saved or duplicated stack keeps it as it was shown, with its Show Z Projection, XZ/YZ projection, Z slice and Min/Max) shows XZ and YZ views below the canvas, which is the XY view. Each has two panes: on top, the whole stack projected using the 'XZ/YZ proj:' setting; below, the slice at the current Y (for XZ) or X (for YZ). XZ and YZ are drawn at true physical proportions, using the X and Y pixel sizes and the Z step.
- The X / Y / Z steppers above the panes move the position, and all panes update together. The Z transport's Play button animates through Z.
- Show Z Projection (Channels panel, available for any Z-stack) switches the main canvas from a single Z slice to the Z projection chosen by each channel's Z proj. setting, whether or not Orthogonal Views is showing. The top XZ/YZ panes use their own 'XZ/YZ proj:' setting. While the canvas shows the projection with Orthogonal Views off, the Z slider and its buttons are dimmed, as there is no slice to step through.
- The XZ panes show a yellow line for X and the YZ panes a light-blue line for Y, matching the main canvas crosshair, plus a white line for the current Z plane.
- To move the position, use the steppers, drag anywhere in an XZ or YZ pane, or drag the crosshair on the main canvas (with any tool). Grabbing near one line moves only that axis; grabbing near the crossing moves both.
- All panes use the same LUT, display range and colors as the main canvas, and follow drift correction when it is on.
- Scale bars: a checkbox next to the 'XZ/YZ proj:' picker adds a scale bar to each pane. The panes share one physical scale, so the bar reads correctly along either axis. Each bar picks black or white from its own pane.
Orthogonal Views works on any Z-stack: a native one (ND2/CZI/LSM) or a folder of TIFFs opened with 'Treat T-series as Z-stack' checked.
Supported File Formats
- TIFF (.tif, .tiff): 8-, 16- or 32-bit integer samples, signed or not, and 32- or 64-bit floating point, uncompressed or compressed with LZW, Deflate or PackBits, in strips or tiles, including BigTIFF. 12- and 14-bit cameras store theirs as 16, or packed: packed 9- to 15-bit samples open as they are, a 10-bit image with its 0–1,023 range. Other kinds (1-bit, 16-bit floating point, and JPEG or zstd compression) are refused with a message saying why.
- TIFF channels and stacks: the red, green and blue of an RGB image are its three channels. A multi-page TIFF with no ImageJ or OME information opens as a T-series, and the Data Log says so (check Treat T-series as Z-stack for a Z-stack). A stack saved by tifffile (Python, napari) with its axes opens with its channels, Z and T.
- TIFF values: signed 8- and 16-bit samples (in plain, OME and ImageJ TIFFs, folders of TIFFs and Prairie View) are stored shifted up by half the range (32,768 for 16-bit), and Min, Max and every ROI measurement use the true signed value, exactly. 32-bit integer and floating-point data (deconvolved or processed stacks, say) is read once for each channel's range. Whole numbers spanning at most 65,535 are kept exactly; other data is kept as 65,536 evenly spaced levels across each channel's own range, so rounding is at most half a level, 1/131,070 of that channel's range (below the noise of nearly all data), and a ratio channel beside an intensity channel keeps its precision. Min, Max and every ROI measurement are in the file's values. The Data Log gives each channel's range and level spacing, and counts any NaN or infinite values, which are stored as the lowest value.
- ImageJ TIFF: an ImageJ hyperstack opens with its channels, Z slices and time points, pixel size, Z spacing and frame interval; stacks over 4 GB (which ImageJ writes with a single page header) open too. An ImageJ composite opens in its saved channel colors, and an ImageJ or Fiji TIFF opens with the display range it was saved with (each channel's, for a composite), as in Fiji; click Auto to fit the range to the data instead. A description written in Latin-1, as older ImageJ versions did, is read too, so its µm is recognized.
- ImageJ calibration: ImageJ's straight-line value calibration (value = c0 + c1 × stored) is applied to every ROI measurement, so a "16-bit signed" image, which ImageJ stores with an offset of −32,768, measures its true values instead of 32,768 too high (which shrinks every ΔF/F₀), and Min and Max are shown in calibrated values. The Data Log names the calibration, or says when one isn't applied (a non-linear function).
- ImageJ stack layout: a header whose channels × slices × frames don't match the file's pages isn't used: the pages open as time points, without the header's frame interval, and the Data Log says so. A stack whose header gives only its image count opens as a time series, where ImageJ shows a Z-stack; check Treat T-series as Z-stack for one. A plain stack (slices only, no hyperstack) opens as a Z-stack, as in ImageJ, unless it records a frame interval and no Z spacing, which marks a recording over time: its images then open as time points and the Data Log says so. Treat Z-stack as T-series switches any other.
- OME-TIFF (.ome.tif): channels, Z and T in any DimensionOrder, including sets split across several files. Channel names, colors and emission wavelengths, pixel size, Z step and frame interval are read from the OME-XML, in any of OME's length units from femtometers to kilometers (inches and feet too) and time units from femtoseconds to days; a size or interval in a unit @Graph doesn't know is not used, and the Data Log says so. A file describing several images opens each in its own window. Signed 8- and 16-bit and 32- and 64-bit floating-point OME-TIFFs open as plain TIFFs of those types do. When a file's OME-XML can't be used, it opens as a plain TIFF only if it has no separate channels or Z planes; otherwise it is refused with the reason, since its channels and planes would be taken for time points.
- Prairie View (.xml plus its .tif files): T-series and Z-series from Prairie View 4 and 5, with any number of channels and cycles. Drop the .xml file or the folder. Bit depth, pixel size, channel names, the Z step (from the recorded stage positions, adding up every Z device) and the time between time points (from the recorded frame times) are read from the XML. A Z-series opens as a Z-stack per cycle. A bidirectional Z-series is put in one direction, and the Data Log says which stacks were turned. Image files the XML names but the folder lacks, and planes with no file, show as blank and are listed in the Data Log.
- Folder of TIFFs: opens as a T-series in natural name order ('Treat T-series as Z-stack' turns it into a Z-stack). A folder of ImageJ Z-stacks, one per time point, opens as a Z-stack over time; a folder holding an OME-TIFF set opens as that set. A folder of TIFFs saved by Fiji takes its pixel size from the first file. Files with their own channels, or with both Z and T, are refused (open one of them instead).
- Zeiss CZI (.czi): from Zeiss Axioscope / LSM 800 / 900 / 980 / Airyscan. Multi-channel, Z, T and combined T×Z acquisitions, 8- or 16-bit, uncompressed or saved with ZEN's lossless (zstd) compression. Channel colors, names, voxel sizes (X, Y and Z) and the time between frames are read from the file. Each scene opens as its own image, a tile scan is stitched from its tiles at their recorded positions, and a color camera's exposure (DAPI, GFP, DIC…), recorded in red, green and blue, opens as one channel, their sum, in the color that holds its signal (gray when none does); Settings ▸ Imaging can keep the three colors as channels instead, for a stained brightfield image. A line scan along Z (XZ or XZ-T) opens as one image per time point with Z as the vertical axis. CZIs compressed with JPEG XR, JPEG or LZW are refused with a message saying what to do (save from ZEN uncompressed or with zstd, or export as OME-TIFF).
- Zeiss LSM (.lsm): LSM 510 / 710 / 780 / 880. Multi-channel Z-stacks, time series and T×Z, 8-bit, 12-bit and floating point, including files over 4 GB. Channel names and colors, voxel sizes (X, Y and Z) and the time between time points (from the recorded time stamps) are read from the file. A line scan opens as one image with time down the vertical axis, and an X-Z scan as one image per time point with Z down it. Only the first position of a multi-position file opens; the Data Log says how many more it holds.
- Nikon ND2 (.nd2): files from NIS-Elements 3 and later, 8- or 16-bit, uncompressed or with lossless compression, multi-channel, including combined T×Z acquisitions (a Z-stack at every time point; see "T-series, Z-stacks, and Combined T×Z Files" above). Z and T are taken from the acquisition's own loops. Channel names, colors, emission wavelengths, pixel size (X, Y and Z step) and the time between time points (from the recorded frame times) are read from the file. Each XY position of a multipoint acquisition opens as its own image, named as in NIS-Elements, and a color camera's exposure (DAPI, GFP, DIC…), recorded in red, green and blue, opens as one channel, their sum, in the color that holds its signal (gray when none does); Settings ▸ Imaging can keep the three colors as channels instead, for a stained brightfield image. When every channel has the same description (a color camera calls each exposure "Brightfield"), channels are named by their optical configurations instead. Lossy (JPEG 2000) files are refused with a message.
- Leica LIF (.lif): LAS X files. Every image series in the file opens in its own window, titled with the file and series names. 8- to 16-bit, multi-channel (including color camera images), Z, T and combined T×Z. Channel names (the dye when the file records one, else the detector), pixel size (X, Y and Z step) and the time between time points are read from the file. An XT line scan opens as one image with time as the vertical axis, and an XZ or XZ-T line scan as one image per time point with Z as the vertical axis (at the Z step); a tile scan shows its first tile. Series that can't be shown (spectral λ scans, floating-point data) are skipped, with the reason in the Data Log.
- Leica FLIM (FALCON / STELLARIS): the images LAS X computes join the series as extra channels, hidden at first (check Show FLIM channels in the Channels panel, then each channel's own box): Intensity and Phasor Intensity in photon counts, Fast Flim and Standard Deviation as lifetimes in picoseconds. Phasor Real and Phasor Imaginary (signed values) and the raw photon data are not read.
Files that record channel colors (CZI, LIF, LSM, ND2, OME-TIFF) open in those colors. Otherwise a single-channel image opens in Raw, and channels 1 to 4 of a multi-channel image use default emission colors.
Saving and Reopening Image Sessions (.@graph)
An Image window can be saved as a .@graph file that recreates it exactly: pixel data, ROIs, display settings and analysis settings. Use File → Save (⌘S).
- What is saved: all pixel data, losslessly, as the exact detector values, and the original bit depth, so 8- and 12-bit data keep their display scale; all ROIs (position, name, color, background flag, visibility); each channel's name, LUT, color, display range, visibility and Subtract setting; the frame interval; Sweep Mode, all baseline settings, background and neuropil subtraction, photobleaching correction and frame averaging; drift correction; the microscope setup and pixel size; the scale bar and its position and color; text, line and arrow overlays; axis labels; smoothing and rotation; which channels are FLIM channels, each channel's link to the master Auto and Z proj, and the Auto-Detect ROIs settings.
- Large images save and open one plane at a time, so a big multichannel series never has to fit in memory all at once.
- Unsaved changes: the window title shows • only when something that is saved has changed. Moving through frames, playing, or opening Orthogonal Views does not count.
- Self-contained: the file includes the pixel data, so it does not need the original image files.
- Reopening: double-click the file or drag it onto @Graph. The window reopens with its ROIs and settings; click Measure to extract the traces again.
- File size grows with image size and frame count: a 600-frame, 64×106-pixel single-channel recording is about 8 MB (2 bytes per pixel, per frame, per channel).
- Save (⌘S): once a window has been saved or was opened from a .@graph file, ⌘S saves to that file without asking. The first save asks where to save.
- Save As (⇧⌘S): saves to a new name or location; the window then belongs to the new file, and later ⌘S saves go there.
Save with ⌘S after drawing ROIs and setting up the display; reopening the file later brings you back to exactly that point.
Copy and Paste Image Style
Display settings and ROIs can be copied from one Image window and pasted onto another, without touching the pixel data, to give a set of recordings the same LUT, display range and ROI layout.
- Copy: press ⌥⌘C, click Copy Style in the toolbar, or right-click the image and choose Copy Style.
- Paste: in the target window, press ⌥⌘V, click Paste Style, or right-click and choose Paste Style. Paste Style is grayed out until a style has been copied.
- What is copied: each channel's LUT, color, display range, emission wavelength, Raw, Smoothing, Z projection and Subtract channel; Sweep Mode, baseline, Subtract background, neuropil subtraction, photobleaching correction and the scale bar; all ROIs. Pasted ROIs replace the target's ROIs; a style copied with no ROIs leaves the target's. ⌘Z undoes the whole paste.
- If the source has more channels than the target, settings go to the first channels and an alert says so. Extra channels in the target are left unchanged.
- If the images differ in size, ROIs are rescaled to the same relative position (an ROI 25% in from the top-left stays 25% in).
Close and Quit Protection
@Graph warns before discarding unsaved work:
- Closing a window (⌘W) with unsaved changes (a • in its title) asks whether to Save, Don't Save, or Cancel.
- Quit (⌘Q): if any window has unsaved changes, an alert lists them and offers Review Changes… (the default: brings each window forward in turn with its own Save / Don't Save / Cancel; canceling stops the quit), Cancel, or Discard Changes and Quit. A window that has never been saved stops the review: save it, then quit again.
The • appears in a window's title after any change since the last save, including display changes such as the LUT, display range or ROI edits. Save with ⌘S to clear it.
Omics Visualization
These chart types open in an ordinary chart window with the same Chart inspector: Volcano Plot (with its MA Plot mode), Heatmap, Dot Plot, Cluster Scatter, GSEA Bar, Grouped Diverging Bar, Venn Diagram, UpSet Plot, Manhattan Plot, Stacked Composition Bar and PCA Plot. They are grouped under "Omics Visualization" in the Chart Type picker. All except MA Plot (a display mode of Volcano Plot), Stacked Composition Bar and PCA Plot (which you reach by switching chart type) have a build command in the Omics Plot menu: File → Omics Plot, the Text Tools menu's Omics Plot submenu, or the Omics Plot button in the Spreadsheet toolbar. The same menu also has Compute GSEA (Permutation)….
Volcano Plot
Plots log₂ fold change (X) against −log₁₀(p-value) (Y), the standard view for differential expression and other large-scale comparisons. Points are colored Up, Down or Not Significant by adjustable fold-change and significance thresholds, and significant points are drawn on top of the gray ones.
- Two ways to build one. 'Compute from Replicates': assign columns to Group A and Group B (at least 2 each; fold change is B relative to A) and choose a Significance Test: Moderated t-test (eBayes), the default for new analyses, or Welch's t-test. The moderated t-test (limma's empirical Bayes method) borrows information about variability from all features, so it gives steadier and more powerful results with the few replicates typical of omics experiments. A saved chart keeps the test it was made with. Either way, p-values get Benjamini-Hochberg (BH) FDR correction. 'Already Have Fold Change / p-values': choose existing columns (such as DESeq2, edgeR or limma output), which are plotted as they are; if there is no adjusted p-value column, BH-FDR is calculated from the raw p-values.
- Column roles are pre-filled from header names (such as 'log2FC', 'padj', 'FDR', limma's 'P.Value'). Check them before generating. A table exported from R, whose header has one name fewer than the rows (no corner cell), is read with the names in the right columns; quoted cells and decimal commas are read too.
- The setup window warns when row names repeat (every row is still plotted) and counts cells it could not read as numbers; "NA" and blank cells are treated as missing.
- 'Read as' says how the fold-change column is read: Log₂ fold change (used as is), Signed linear (4 is 4-fold up, −4 is 4-fold down) or Ratio (4 is 4-fold up, 0.25 is 4-fold down). The setup window guesses and says why: a header that says log2 means log₂; otherwise negative values together with values between −1 and 1 mean log₂, negative values with none between −1 and 1 mean signed linear, and all-positive values mean a ratio. Change it if the guess is wrong. Values that are invalid for the chosen reading (a signed value between −1 and 1, a ratio of 0 or below) are counted and left out, and the chart's statistics note states the reading used.
- A p-value outside 0 to 1 is not a probability: it is counted in the setup window and left out of the plot, the significance count and the Benjamini-Hochberg correction.
- 'Compute from Replicates' asks what scale the values are on: Already log₂, Linear intensities or Raw counts. Linear intensities are log₂-transformed before the test. Zeros (and negative values) have no log, so you choose what happens to them: Treat as missing (the default, since a zero intensity usually means not detected) leaves them out like empty cells, and Add pseudocount adds half the smallest positive value in the table to every value first. With a pseudocount, a row with a zero gets a fold change that depends on that offset: (83, 0, 135, 104) against (30, 59, 83, 112) gives log₂FC +0.57 with a pseudocount of 3.3 and −0.72 without. A fixed +1 on small linear values (TPM, ratios, relative qPCR quantities) would shrink every fold change, so it is not used. The chart's statistics note states the choice, the offset and how many values were left out.
- Raw counts (RNA-seq read counts) follow the edgeR and limma workflow: features with too few counts to analyze are filtered out (edgeR's filterByExpr), libraries are normalized for sequencing depth and composition (TMM), counts are converted to log₂ counts per million (log-CPM, prior count 2), and the moderated t-test runs with an intensity-dependent prior (limma-trend), so the Significance Test is set to the moderated t for counts. The fold change is the difference in mean log-CPM between the groups. The statistics note reports how many features were filtered and the normalization factors. Counts must be complete: a feature with a blank or negative count is left out, and the setup window says how many.
- Intensity-dependent prior (limma-trend): with the moderated t-test on log or linear intensities, this checkbox (off by default) lets the prior variance follow average intensity, since low-abundance features are noisier (limma's eBayes with trend = TRUE). It is recommended for proteomics and other intensity data, and always on for raw counts.
- Minimum valid values per group (2 by default; 0 turns the filter off): features with fewer valid values than this in either group are left out before testing, so they enter neither the variance prior nor the FDR correction (common proteomics practice, as in Perseus and DEP). With zeros treated as missing, a zero is not a valid value. The setup window shows how many features the setting removes. Raw counts are filtered by filterByExpr instead.
- Scale checks: @Graph checks your values against the scale you chose and lets you know when they don't seem to match: values that look already log-transformed when you chose Linear intensities or Raw counts (the check used by NCBI's GEO2R), values that look linear when you chose Already log₂, and whole numbers that look like read counts when you chose Linear intensities or Already log₂.
- Moderated t-test (eBayes) follows limma. With the minimum-valid filter off, a row with values in only one group is not tested, but its variance still helps estimate the shared prior. With the filter at 1 or off, a row with exactly one value in each group has no variance of its own, so, as in limma, it is tested on the shared prior variance alone, and its p-value rests on the other rows (with no prior, it is not tested); a row with one value in one group and two or more in the other is tested as usual.
- The moderated t matches limma, lmFit then eBayes. The shared prior is fit by limma's fitFDist when every row has the same residual df, and by fitFDistUnequalDF1 when missing values make the df differ (limma's default since 3.62). With limma-trend, the prior follows average expression, as eBayes(trend = TRUE) fits it: a natural-spline trend when every row has the same residual df, and fitFDistUnequalDF1's weighted lowess trend when missing values make the df differ, as in current limma. As in limma, any 3 or more rows give a prior. The chart's statistics note gives the prior (d₀ and s₀²) and how many rows it rests on, and calls it weak with fewer than 10, and unreliable when more than half of the rows' variances are exactly zero (where limma warns that eBayes is unreliable). With fewer than 3 rows, or too few nonzero variances, no prior can be fit, and the note says each gene got an ordinary pooled t-test instead.
- Effect sizes: for statistics computed by @Graph, each feature gets its log₂ fold change with a confidence interval (at the level in Settings → Statistics), its standard error, t statistic and degrees of freedom. They appear in the point popup, the chart's spreadsheet and exported tables (log2FoldChange, its CI bounds, SE, t and df, then pValue and adjustedPValue). For the moderated t-test the interval matches limma's topTable(confint = TRUE); for Welch's t-test it is the Welch interval, as R's t.test gives it.
- Imported p-values without adjusted p-values: @Graph computes BH adjusted p-values over the rows you pasted. If the list was filtered (only significant genes, say), that correction is too lenient, so @Graph warns when the p-values look filtered, and you can enter the full count in 'Tests in the original analysis' so the correction counts every test, as R's p.adjust with n does. The figure caption states the number of tests used.
- When nothing is significant, @Graph explains why. If some features pass the p-value cut-off but none changes enough to pass the fold-change cut-off, it says so and gives the largest fold change among them, so you can lower the fold-change cut-off in Plot Style.
- A p-value of exactly 0 (numerical underflow) is plotted just above both the smallest non-zero p-value and the significance line, so it is never drawn below a line it counts as passing; the figure caption says so when it applies.
- Thresholds (Plot Style): a point is Up or Down when its |log₂FC| is at or above Fold change (1 by default, a 2-fold change) and its p-value is below Significance (0.05 by default). "Use adjusted p-value for y-axis and thresholds" is on by default; turn it off to use raw p-values. The Up, Down and N.S. colors, point size and opacity are set there too. The Y axis title follows the choice ("-Log10(Adjusted P-value)" or "-Log10(P-value)") unless you typed your own. A feature with a log₂ fold change of exactly 0 is never Up or Down.
- The figure caption states how the statistics were obtained (computed here, with the test, filters, normalization and prior used, or imported), the thresholds used and how many features are up and down.
- Volcano Plot can be chosen as the Chart Type only for a chart that already holds volcano data.
- The AI Assistant can read an open Volcano Plot's results (each feature's log₂ fold change with its CI, then p and adjusted p) and change its thresholds.
Build one from selected text with File → Omics Plot → Volcano Plot from Selected Text… (⌥⌘L), the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu. Smart Visualization also sends data with fold-change and p-value columns here.
When @Graph calculates the adjusted p-values itself, a note says so in Plot Style and in each point's popup.
MA Plot
Plots average expression (X, log₂) against log₂ fold change (Y). M is the log ratio and A the average log intensity, terms from microarray analysis. MA Plot is a display mode of a Volcano Plot, using the same data; switch with the Display control at the top of Plot Style.
- Mean expression (A) is on the log₂ scale. With 'Compute from Replicates' it is the average log₂ value over all samples, the same as limma's AveExpr (mean log-CPM for raw counts). With 'Already Have Fold Change / p-values', choose a Mean Expression column in the setup window (DESeq2's 'baseMean', limma's 'AveExpr' and edgeR's 'logCPM' are recognized); the header decides the scale first: one that says log or AveExpr is used as is, and baseMean or any other mean without "log" is converted to log₂ (a mean of 0, such as a gene with no counts, has no log₂ and is left off the MA plot). For any other header, negative values mean the column is already on a log scale. Without one, MA mode is unavailable and the Display control explains why.
- Reference lines: a solid line at M = 0 (no change) and the fold-change thresholds as two horizontal dashed lines.
- Switching modes resets the title and axis labels to suit the new mode; later edits are kept.
Aesthetic Mapping
Works in both Volcano and MA modes. Any extra column in your data (one not used for name, fold change, p-value or mean expression) can drive point color, size, shape or opacity. Extra columns are those marked Exclude in 'Compute from Replicates', or left unassigned in 'Already Have Fold Change / p-values'. Their numbers are read with the table's own decimal separator, so decimal commas (12,5) work.
- Color: a gradient between two colors you choose, replacing the Up/Down coloring. The legend becomes a gradient bar with the column name and its low/high values.
- Size: scaled between a minimum and maximum, with a min/mid/max legend.
- Shape: each distinct value gets its own symbol (circle, square, triangle, diamond, cross), with a legend. Beyond five values the rest share the fifth symbol, labeled "Other" in the legend. Best for a column with a few categories.
- Opacity: scaled between a minimum and maximum.
- The four are independent and optional; with none mapped, the plot uses the plain Up/Down coloring.
Mappings can also be set in the setup window's 'Aesthetic Mapping' section (shown when extra columns exist), so the plot opens with them. In the setup window, a column can drive only one aesthetic at a time.
Labeling Individual Genes
Works in both Volcano and MA modes. Click a point to see its name, log₂ fold change (with its confidence interval, SE, t and df when @Graph computed the statistics), p-value and adjusted p-value, plus its value for any mapped column. Check 'Show name on plot' in that popup to label the point on the chart.
- Labels are saved with the chart.
- Plot Style lists the labeled genes under 'Labeled Genes (n)'; Clear All removes them all.
- Removing one label or clearing all can be undone with ⌘Z.
Type in 'Search / highlight gene…' (Plot Style) to outline and label the matching points, whatever the case. Exports, prints and copies show them as the window does; clear the search to leave them out.
Labeling Genes by Criteria
'Label Genes Matching Criteria' in Plot Style labels many genes at once.
- Two optional thresholds: minimum |log₂ fold change| and a p-value the gene must be below (shown as 'Adj. p-value' when adjusted p-values are in use), the same strictly-below rule as the significance threshold.
- A category filter: Any, Significant (Up or Down), Up only, or Down only.
- The button shows how many genes match, such as 'Label Matching Genes (47)', and adds them all to the labels in one click.
Heatmap
A grid of colored cells, one per row × column value, for expression matrices, correlation matrices or any numeric table.
- Data: a table with row names in the first column and column names in the first row; every other cell is a number. Opening a .gct, GEO series matrix, .loom or .h5ad file builds one directly (see Supported File Formats).
- Normalize (Plot Style): None (raw values), Z-score per row, or Z-score per column (each value minus the row or column mean, divided by its sample SD, as pheatmap and seaborn scale). A row or column whose values are all the same has no variation to scale, so its z-scores are 0 (the mid color; R gives NaN there), and the inspector says how many there are. Z-score per row is the default. A separate Log2 transform toggle is applied first (with "Add 1 first" it is log₂(x + 1), which keeps zero counts); leave it off if the data are already log₂.
- Color scale: Low/Mid/High colors, blue–white–red by default, or a preset (the colorblind-safe ColorBrewer Red–Blue and Purple–Green, or the classic Blue–Black–Red). The value range is automatic unless you set Min and Max.
- The automatic range follows ComplexHeatmap's default. Data of both signs in similar amounts (between 25% and 75% of the non-zero values positive: z-scores, fold changes) get a scale centered on 0 that reaches the 99th percentile of |value|; any other data, including mostly-positive data with a few negatives, count as one-sided. One-sided data (raw or log₂ expression) run from the 1st to the 99th percentile, with the mid color halfway. With fewer than 100 distinct values the full data range is used. Using percentiles rather than the extremes stops one outlier from washing every other cell out toward the mid color: cells beyond the range take the end color, and the legend marks a clipped end with ≥ or ≤. A manual range puts the mid color at 0 when it spans 0, otherwise halfway. A manual Min at or above Max has no scale: the inspector says so and the automatic range is used until it is fixed. The methods sentence states the limits and how they were chosen.
- 'Show axis' (Plot Style) shows or hides the border, and 'Show legend' (Axes & Labels) the color scale. Row and column names are always shown, thinned when there are too many to fit. Swap Rows and Columns transposes the matrix.
- 'Hide all-zero rows' and 'Hide all-zero columns' hide rows or columns with no non-zero values, useful for sparse single-cell matrices. Clustering is unavailable while either is on.
- Cell grid lines are on by default but switch off automatically when the table has 30 or more rows or columns; turn 'Show cell grid' (Axes & Labels) back on if you want them.
- Drag a rectangle to zoom (drag again to zoom further), and double-click to return to the full view. Dendrograms are hidden while zoomed.
Build one with Smart Visualization (⇧⌘V) on a pasted matrix, with File → Omics Plot → Heatmap from Selected Text… (⌥⌘M), or by opening a .gct, GEO series matrix, .loom or .h5ad file.
Clustering & Dendrograms
Rows and columns can each be hierarchically clustered, so similar ones sit together, with a dendrogram drawn alongside.
- 'Cluster rows' and 'Cluster columns' (Plot Style) are independent.
- Linkage (Complete, Average (UPGMA), Single or Ward) appears when either is on. New heatmaps use Complete, the default of pheatmap, ComplexHeatmap and R's hclust; a saved heatmap keeps the linkage it was saved with.
- The tree and leaf order are exactly those of R's hclust (the order pheatmap draws), including how tied distances are resolved. Results are reused until the data or clustering settings change, so redrawing a large clustered heatmap is fast.
- Clustering changes only the display order; turning it off restores the original order. Labels, search and click-to-inspect follow the displayed order.
- Clustering works on the plotted values (after Log2 and normalization) and is limited to 2,000 rows or columns.
- Distance (Plot Style, under Linkage): Euclidean (the default) compares levels; Correlation (Pearson) is 1 − r, so rows that rise and fall together sit together whatever their level (pheatmap's "correlation", R's as.dist(1 − cor())); Correlation (Spearman) is 1 − ρ on ranks, so one extreme value matters less.
- Ward is Ward's method (R's hclust "ward.D2"). Ward needs Euclidean distances, so with a correlation distance it uses √(2(1 − r)), the Euclidean distance between the standardized profiles, and rows that correlate best still merge first. This matches R's hclust on sqrt(2 * (1 - cor)) with "ward.D2" (pheatmap applies Ward to 1 − r directly, so its tree can differ); a note under Linkage and the methods sentence say so.
- With Euclidean distance, a pair with missing values is compared over the coordinates both have, scaled up to the full length, as R's dist() does. With correlation, it is correlated over the coordinates both have (R's use = "pairwise.complete.obs"). A correlation with a constant row or column has no value (R stops with an error there), so that pair is treated as uncorrelated (r = 0).
- Optimal leaf ordering (off by default) flips dendrogram branches so the most similar neighbors sit side by side (Bar-Joseph et al. 2001, as R's seriation and cba packages do). The tree and its clusters stay the same; only the drawing order changes. Off, each merge's earlier cluster is drawn first. Above about 1,000 rows or columns it takes a few seconds the first time.
- The Chart Legend box's methods sentence states the transform, the z-scoring, the distance, the linkage and the leaf ordering.
Search & Highlight
The 'Search rows/columns…' field in Plot Style finds row and column names containing the text (any case). Matches are shown in bold orange with an orange band across the row or column.
Label Density
When there is less than about 8 px per label, @Graph draws every Nth row or column label instead of all of them, and a caption below the chart says so ('Showing every Nth label…'). Enlarge the window to see more labels.
Click-to-Inspect
Click any cell to see its row and column names and raw value, plus its log₂ value when Log2 transform is on and its Z-score when a Z-score normalization is on.
Editing the Underlying Table
The spreadsheet button (table icon) in the chart window's toolbar opens the matrix in a table that handles genomics-scale data (tens of thousands of rows, thousands of columns).
- Double-click any cell to edit its value directly.
- Click a row to select it; click a column header to select the whole column.
- Click and drag across cells to select a rectangular block, then ⌘C to copy it as tab-delimited text.
- The leftmost columns show the row index and row (gene/feature) name side by side.
- Edits can be undone with ⌘Z.
To save a heatmap matrix (or any chart's data) as a file, use Export → CSV (.csv) or TSV (.tsv); see Exporting. This works even for very large matrices.
Venn Diagram
Compares 2 or 3 named sets of items (gene names, protein IDs, sample lists) as overlapping circles, each region labeled with its count. Matching is exact and case-sensitive, as in R and UpSetR, ignoring only surrounding spaces: ' TP53 ' and 'TP53' are the same item, but 'TP53' (human) and 'Tp53' are not, so use one naming convention across all sets. Missing-value placeholders (NA, N/A, NaN, NULL, None, ".", "-" and "--", in any capitalization) are not items, and quote marks around a name (as R's write.csv writes them) are removed. Venn Diagram can be chosen as the Chart Type only for a chart that already holds set data.
- Build one with File → Omics Plot → Venn Diagram from Selected Text… (or the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu) from a table with one set per column: the set name in the header row and one item per line, 2 or 3 columns.
- With 2 sets, circle sizes and overlap are drawn to scale. Each count sits in the middle of its region; a region too small for its count (or with no area, such as an empty overlap) is labeled just outside, with a thin leader line to it. With 3 sets a fixed triangular layout is used, not to scale. Counts and percentages are always exact.
- A set with no items yet is not drawn: a note above the diagram names it, so it can't be mistaken for a set of one item. Add items with Edit List or Pull from Volcano Plot. (With 3 sets its circle stays in the layout and its regions show 0.)
- Each set's row in the inspector shows its item count, a color picker, 'Edit List…' (replace the items, one per line) and, when there are 3 sets, Remove (undo with ⌘Z). Click a set's name to edit it. 'Add a 3rd Set' appears when there are only 2.
- 'Show percentages' adds each region's share of all distinct items under its count.
- The figure caption states the layout (to scale with 2 sets, schematic with 3), what each count means, the matching rule and, with a background size, the fold enrichment and overlap test.
- Export → CSV or TSV, and the chart's spreadsheet, give the sets in the paste format: one column per set, its name in the header and its items below. Editing them in the spreadsheet updates the diagram (keeping 2 or 3 sets).
Overlap Significance
To test whether an overlap is larger than chance, @Graph needs the size of the background the sets were drawn from (such as every gene tested). Enter it as 'Background size' in the Plot Style panel's 'Overlap Significance' box; leave it blank to skip the test.
- Click an overlap region to see its items (Copy puts the list on the clipboard, one per line). With a background size entered, the popup also shows the fold enrichment (items the sets share, divided by the number expected if they were independent samples from the background, as SuperExactTest reports it) and a one-tailed hypergeometric p-value for over-representation (below 0.001 in scientific notation, such as 6.5e-12). Both count every item the sets share, including any also in another set. The background must be at least the number of distinct items across all the sets; if it is smaller, the inspector says so and no p-value is shown.
- 2-set overlaps use the standard hypergeometric test; the all-three overlap uses its exact multi-set extension (as in SuperExactTest).
- The test asks only whether the overlap is larger than expected by chance, not whether its items are individually significant.
- When a set is pulled from (or sent from) a Volcano Plot, the Overlap Significance box suggests the number of features that plot tested as the background, with a Use button: every tested feature could have made the list, so they are the population the overlap is tested against. With sets from two Volcano Plots it suggests the features tested in both.
Sending / Pulling from a Volcano Plot
A Venn set can be filled with the significant genes of an open Volcano Plot, for example to compare hits across several differential-expression analyses.
- Pull (from the Venn diagram): each set row has a 'Pull from Volcano Plot…' menu listing the open Volcano Plots. Choose one and a direction (Up only, Down only, or Up or Down).
- Send (from the Volcano Plot): in its 'Send to Venn Diagram' section, pick a direction, then a set in an open Venn diagram, or 'New Venn Diagram…' to create one with Set 1 filled.
- The genes follow the Volcano Plot's current thresholds; after changing them, pull or send again to update the set.
- In a region's popup, names link to an open Volcano Plot point only when they match exactly, case included, as the counts do.
UpSet Plot
Compares any number of named sets of items (2 or more), and is clearest with 4 or more, where Venn circles become unreadable. Each set's size is a horizontal bar on the left; each combination of sets that occurs is a vertical bar on top, largest first, with a dot matrix below showing which sets it includes. It uses the same set data and matching rules as Venn Diagram.
- Build one with File → Omics Plot → UpSet Plot from Selected Text… (or the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu) from a table with one set per column (set name in the header row, one item per line), 2 or more columns (above 8 it asks first). Smart Visualization sends 2 or 3 columns to a Venn Diagram instead.
- Each combination bar counts the items in exactly those sets and no others (exclusive intersections, what UpSetR draws, called "distinct" mode in ComplexHeatmap's make_comb_mat), so the bars add up to the number of distinct items; the axis is titled Exclusive Intersection Size. Plot Style's Count items can switch to counting the items in at least those sets, whatever else they are in (make_comb_mat's "intersect" mode; ComplexUpset calls it inclusive intersection), titled Inclusive Intersection Size. Every combination that shares an item then gets a bar, even one no item is in exactly (such as A and B when every shared item is also in C), and an item is counted in several bars.
- Click a bar or its column of dots to list its items, filter them and copy them, one per line. The AI Assistant can switch the counting mode and read the same item lists, for a Venn diagram too.
- Up to 40 combinations are drawn, largest first (UpSetR's default; equal sizes in set order); a note below the chart says how many were left out and how many of the items the bars drawn cover. The figure caption states the counting mode, the limit and how many combinations there are.
- Up to 63 sets.
- A 0/1 membership table also works, the format UpSetR's upset() reads: an optional first column of item names, then one column per set marked 1 for members and 0 otherwise. A set no item belongs to (a column of 0s) is read as an empty set.
- Colors are set automatically and can't be changed in the inspector.
- Export → CSV or TSV, and the chart's spreadsheet, give the sets as Venn Diagram does: one column per set.
- Smart Visualization and drag-and-drop send a table of 4 or more named, mostly non-numeric columns here.
Dot Plot
A grid of circles, one per group × feature (such as cell type × gene). Circle area shows one value (usually percent expressed) and fill color a second (usually average expression), as in Seurat.
Scale each feature (on for new plots, as Seurat's DotPlot does by default) colors each feature by its z-score across the groups (standard deviation with n − 1, as R's scale), clipped at ±2.5, so each gene shows where it is high or low whatever its overall level. It uses the diverging Low/Mid/High colors centered on 0; the color legend reads Color (z per feature) and spans −2.5 to 2.5. A feature with fewer than 2 values, or the same value in every group, has no z-score and draws gray. Turn it off to color by the values themselves (scanpy's default) on a sequential scale, light (the Mid color) for low values and dark (the High color) for high ones. The table and export keep the values as entered either way.
log1p before scaling (off by default) takes log(1 + x) of the color values first (the legend then reads Color (z of log1p), or Color (log1p) unscaled). Seurat averages expression on the linear scale and takes log1p before scaling, so turn it on for linear-scale averages to match Seurat, and leave it off for values already on a log scale. A value of −1 or below has no log1p and draws gray.
- Data (preferred): one table (separated by tabs, commas or semicolons) with a header row, one row per group × feature, 4 columns: Gene/Feature, Cell Type/Group, Percent Expressed, Average Expression. The size and color columns are recognized from their headers (such as "pct"/"percent" vs "avg"/"mean"); if unclear, @Graph asks once. If a gene and group pair appears on more than one row, the first row is used and the Data Log lists the repeats. Values may carry a percent sign (45%). A row with a size but no color value (NA) draws a gray dot; rows that can't be read are counted in the Data Log.
- Data (alternative): two tables, each with a header row and a name column, separated by a blank line. The first gives dot size, the second dot color. They must list the same rows and columns, in any order: @Graph pairs them by name, and if the names differ it says which ones instead of drawing the chart. Column names may be numbers, such as Seurat's and scanpy's numbered clusters (0, 1, 2): two headers listing the same names mark two tables.
- Each dot has a thin outline, so a dot colored like the background (the mid color is white by default) still shows. Every positive size gets a dot at least 1 pt across, so a very small value is never lost (only those tiny dots are larger than their area says). A size of 0 or a missing size draws no dot; a negative size draws none either, and the Data Log counts them.
- Order Groups by Similarity and Order Features by Similarity put similar groups (or features) next to each other: hierarchical clustering (complete linkage, Euclidean distance) of their colors as drawn, z-scores when Scale each feature is on, as Seurat's cluster.idents and scanpy's dendrogram order groups. Each is a one-time reorder of the data, undone with ⌘Z, so the order can still be changed by hand. No tree is drawn.
- Hide dots below size draws no dot for sizes below it (Seurat's dot.min, scanpy's dot_min), in the size values' units, such as 5 for 5% expressing. Hide features and groups with no dots leaves out every feature and group whose sizes are all zero, missing or below that size, as Heatmap hides all-zero rows and columns; the inspector says how many are hidden, and the table and export keep them.
- The AI Assistant can set the scaling, the size threshold and the hiding, and order groups or features by similarity, each undone with ⌘Z.
- Export and the chart's spreadsheet give one row per dot as Feature, Group, Size, Color, the order the long-format paste reads, so an exported table pastes back as the same chart. A feature and group repeated on several rows keep the first row everywhere: in a paste, in the spreadsheet and from the AI Assistant.
- "Swap Rows and Columns" transposes both matrices if features and groups came in the other way round.
- The Color Preset menu sets the Low/Mid/High colors, which can then be adjusted individually (with scaling off, only Mid and High are used, labeled Low values (light) and High values (dark)). The color range is automatic unless you set it: −2.5 to 2.5 for z-scores, and for unscaled values the 1st to 99th percentile (the full range with fewer than 100 distinct values). The legend marks a clipped end with ≥ or ≤.
- The figure caption states that dot area is proportional to size (and the largest value), the Hide dots below size threshold, the coloring (the z-score with its n − 1 SD and ±2.5 clip, of log1p when on, or the sequential range) and how many features and groups are hidden.
- "Show legend" (Axes & Labels → Appearance) shows the size and color legends. The size legend's dots are drawn at the plot's own scale, so a plot dot the size of the legend dot labeled 50 stands for 50. Its values are round numbers (such as 100, 75, 50, 25). When the plot's dots are too large for the legend column, it shows smaller values at the same scale.
Build one with File → Omics Plot → Dot Plot from Selected Text…, the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu.
Cluster Scatter
The UMAP/t-SNE-style scatter plot of single-cell studies (as in Seurat): points at their embedding coordinates, colored by cluster or cell type, with an outline around each cluster.
- Data: a table (separated by tabs, commas or semicolons) with a header row and 3 columns in this order: X, Y, Cluster (number, number, text), one row per point.
- "Swap X and Y" swaps the coordinates of every point, if the columns came in the other order.
- Axis ranges are automatic unless set in the Range panel. A range whose minimum isn't below its maximum (for example, one entered the wrong way round) is ignored and that axis stays automatic, as in Volcano Plot.
- "Show Cluster Outlines" draws a straight-edged outline (convex hull) around each cluster of 3 or more points.
- Label clusters (off by default) writes each cluster's name at the median of its points, as Seurat's DimPlot(label = TRUE) does.
- Same scale on both axes (on for new charts) keeps one unit of X as long as one unit of Y, so cluster shapes are not stretched. A typed axis range is used as entered instead.
- Point size and opacity are adjustable, and each cluster's color can be overridden (↺ resets it to the palette). With more than eight clusters, each cluster gets its own color from ggplot2's default palette, as in Seurat.
- Smart Visualization and drag-and-drop recognize an X/Y/Cluster table and send it here. Smart Visualization also recognizes numbered clusters (0, 1, 2…) when a header names the clusters or the embedding (UMAP, tSNE, PC).
Build one with File → Omics Plot → Cluster Scatter from Selected Text…, the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu.
GSEA Bar
A diverging horizontal bar chart for gene set enrichment results: one bar per pathway or gene set, extending left or right of zero according to the sign of its score, sorted from highest to lowest.
- Data: a table (separated by tabs, commas or semicolons) with a header row and 2 or 3 columns: Name, Score and an optional Significance (p-value or FDR). With 3 columns, score and significance are recognized from the words in their headers, as fgsea, the GSEA desktop application and clusterProfiler name them: "NES", "ES" or "enrichmentScore" for the score, and "padj", "pval", "FDR q-val", "NOM p-val", "p.adjust" or "qvalue" for significance. Only whole words count, so "Genes" is not read as "ES" and "Adjusted NES" is still a score; if unclear, @Graph asks once.
- A whole results table works too (4 or more columns under a header row), such as fgsea's pathway, pval, padj, log2err, ES, NES, size, leadingEdge, the GSEA desktop application's NAME, ES, NES, NOM p-val, FDR q-val, FWER p-val, or clusterProfiler's ID, Description, setSize, enrichmentScore, NES, pvalue, p.adjust, qvalue. Columns are picked by header, not position: the name from pathway, term, description or name (before an ID, else the first text column), the score from NES (ES only when there is no NES), and opacity from an adjusted p (padj, p.adjust, FDR q-val, then qvalue, then FWER) before a raw one (pval, NOM p-val). Other columns are ignored. @Graph asks only when no single score column stands out, and the Chart inspector and figure caption state the columns used, for example "Score: NES; opacity: padj (BH-adjusted)".
- Positive scores use the Up color and negative scores the Down color, both adjustable.
- If significance is given, it sets each bar's opacity on a log scale: solid at 0.001 or below, about 78% at 0.01, 63% at 0.05, fading to 35% at 1 (not adjustable), and the legend shows this key; bars without it are fully opaque.
- A header row is recognized only when its second field is not a number (for a table of 4 or more columns, when none of its fields is); quoted cells and decimal commas are read.
Build one with File → Omics Plot → GSEA Bar from Selected Text…, the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu.
Computing GSEA Directly (Permutation)
'Compute GSEA (Permutation)…', next to 'GSEA Bar from Selected Text…' in the Omics Plot menu, runs a preranked Gene Set Enrichment Analysis (Subramanian et al. 2005; see References) and plots the result as a GSEA Bar chart.
- Input is two pasted blocks: a Ranked Gene List (tab-delimited Gene, Score, such as log fold change or a t-statistic) and a list of gene sets, one per line. Choose the gene-set layout: ".gmt: name, description, genes" (the MSigDB format; the second column is always the description and is skipped, whatever it says) or "Name, then genes". If most .gmt descriptions look like genes from your list, @Graph asks you to check the layout first.
- A gene listed more than once keeps the score with the largest absolute value, and the caption says how many were combined. If 1% or more of the scores are tied, the caption notes it, because the order of tied genes is arbitrary and can shift the enrichment scores. When the highest and lowest points of the running sum are equally far from zero, ES is 0, as in fgsea.
- Gene sets are tested when 15 to 500 of their genes are found in the ranked list, the GSEA default; change the range with Gene-set size in the setup window.
- For each gene set it reports the enrichment score (ES), the normalized enrichment score (NES, comparable between sets), a permutation p-value, a Benjamini-Hochberg FDR and the leading-edge genes: the genes ranked before the running-sum peak for a positive ES, or after its lowest point for a negative ES, which drive the enrichment. As in the fgsea package (Korotkevich et al. 2021) and the GSEA desktop application, the p-value compares a positive ES only with positive null scores (and a negative ES only with negative ones), because the two tails of the null differ in shape.
- Significance comes from comparing each set with random gene sets of the same size drawn from the ranked list (gene-set permutation), as in the GSEA desktop application's Preranked mode and fgsea. All sets of the same size share one set of random draws, which makes large analyses fast, and the same data give the same results every time.
- Permutations are chosen automatically for the number of sets tested: 10 × (sets tested) / 0.05, at least 10,000. The smallest possible p-value is about 2 / permutations and the FDR multiplies it by the number of sets, so this lets a strongly enriched set reach an FDR well below 0.05 however many sets you test. Very large runs are limited to a few minutes of computing, and the caption then says so. You can also turn off Automatic permutations and enter a number (at least 1,000).
- When no random set scored as extreme as a gene set, its p-value is at the permutation floor, 1/(n + 1), and the true p may be smaller. The caption counts these sets, and the data table's Note column marks each one.
- Bars are sorted by NES, with FDR setting each bar's opacity. The chart's data table (and Copy Data or export) holds the full results table: gene set, NES, FDR (BH), size, ES, nominal p, leading-edge size and leading-edge genes ("/" separated), and the note. Cancel closes the setup window and opens nothing. The Chart inspector and figure caption record how the analysis was run: permutations and how they were chosen, the size range, how many sets were tested, duplicates, ties and the FDR method.
- The AI Assistant's compute_gsea follows the same rules (automatic permutations, size range 15 to 500 unless set).
Grouped Diverging Bar
Like GSEA Bar, bars extend either side of zero by sign, but each category can hold several series, each drawn as its own thin sub-bar within the category's band. Useful for comparing, say, fold changes under several conditions for each gene.
- Data: a table (separated by tabs, commas or semicolons) with a header row and 3 columns: Category, Series, Value. Categories appear in the order they first occur in the table. A wide table also works: Category, then one numeric column per series named in the header, one row per category. Values may carry a percent sign (45%); rows that can't be read are counted in the Data Log. Axis titles default to the headers (such as "Log2FoldChange", "Gene"), otherwise "Value" and "Category"; edit them in Axes & Labels.
- Orientation: Horizontal (default) puts categories in rows with bars going left and right; Vertical puts categories along the X axis with bars going up and down and the category names rotated below. Switching it swaps the X and Y axis titles too, so each stays with the axis it names (the X title is always at the bottom).
- Each series has its own lane in every category, in the order the series first appear, so a series is always in the same place and color. A category without a value for a series leaves that lane empty, marked NA.
- A category and series repeated on several rows: the first row's value is used, in Grouped Diverging Bar and Stacked Composition Bar alike (first row wins). The inspector, the Data Log and the figure caption say how many rows repeat; combine them in the table first if they should be added.
- "Swap Category and Series" swaps the two text columns if they came in the other order. It also clears per-series color overrides.
- Each series' color can be overridden (↺ resets it to the palette). With more than eight series, each series gets its own color from ggplot2's default palette.
- Smart Visualization and drag-and-drop recognize a Category/Series/Value table and send it here. When a category and series pair repeats (replicates of a two-factor experiment), Smart Visualization opens a grouped Chart instead.
Build one with File → Omics Plot → Grouped Diverging Bar from Selected Text…, the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu.
Manhattan Plot
The standard genome-wide association study (GWAS) display: one point per variant, placed by chromosome and position along X, with −log₁₀(p-value) on Y, threshold lines for genome-wide and suggestive significance, and labels on the strongest hits.
- Data: a table separated by tabs, commas, semicolons or spaces (as PLINK writes it). Columns are found by their header names: chromosome (CHR, CHROM, #CHROM, Chromosome), position (BP, POS, Position, base_pair_location), p-value (P, PVAL, PVALUE, P-value, PBOLT_LMM) and, optionally, a name for labels (SNP, ID, RSID, variant_id, MarkerName), so PLINK's CHR SNP BP … P order reads as it is. Without those names, the columns are read in the order Chromosome, Position, P-value, Name. A header row is recognized by its content, so a table without one keeps its first row. Rows that can't be read are counted in the Data Log.
- X axis: chromosomes run in genome order (numbered chromosomes, then X, Y, XY, Z, W, then MT, then any others alphabetically), and neighboring chromosomes alternate between two colors you can set. By default ("Equal-width chromosomes" on in Plot Style) every chromosome gets the same width and each variant sits at its relative position within its chromosome, so small chromosomes stay readable. Turn it off for cumulative base-pair positions, as qqman and topr draw them: each chromosome is as wide as its largest position in your data, so chr1 is drawn about five times as long as chr21. If any chromosome has no positive position, equal widths are used either way. The figure caption states the layout. Chromosome names that would overlap their neighbor are left out, as R does; every chromosome keeps its tick.
- Chromosome names: "chr1", "Chr1", "CHR1", "01" and "1" are one chromosome, as are "M" and "MT". "Read 23–26 as X, Y, XY, MT (PLINK, human)", on for new charts, shows PLINK's numeric codes as X, Y, XY (pseudo-autosomal) and MT. It applies only when no chromosome is above 26 and none is already named X, Y, XY or MT, so other species keep their numbered chromosomes; turn it off for a species with more than 22 autosomes.
- Genome-wide (default 5×10⁻⁸) and suggestive (default 1×10⁻⁵) thresholds are dashed lines, each with its own value, color and visibility in Plot Style. 5×10⁻⁸ is the convention for human GWAS; other species or study designs may need another value. The figure caption states the thresholds drawn.
- "Show Bonferroni line" (off by default) adds a line at α / m, where m is the number of plotted variants (α is 0.05 unless you change it). That is the p-value each test must beat to keep the chance of any false positive among them at α. The inspector and the figure caption state m.
- Genomic inflation λ: Plot Style and the figure caption report the median of the χ² statistics the p-values imply (1 degree of freedom), divided by 0.4549, its median when no variant has an effect (Devlin & Roeder 1999). Near 1 is what the null gives; well above 1 (say 1.1 or more in a large scan) suggests population structure or other confounding inflating every test.
- Open QQ Plot (Plot Style) opens the p-values as a QQ plot in a new window: observed −log₁₀(p), sorted, against the value expected if no variant had an effect (ppoints, as qqman), with the y = x line and a shaded 95% band for each point (its Beta(i, m − i + 1) order-statistic interval, as GWASTools draws it). Under the null the points follow the line inside the band; a lift along the whole range points to inflation, a lift only at the top to real hits. Its point color, size and opacity are set in its own Plot Style, and it exports like any chart.
- Top-hit labels name one lead variant per locus: the smallest p at or below the genome-wide threshold, then the next one more than 500 kb from every labeled variant on its chromosome, up to Max labels (10 by default). Turn off Auto-label top hits to label none. Labels need a name column (SNP, ID or the 4th column). Labels never overlap: one that would is moved up, with a line to its point, or left out. The figure caption describes the rule.
- Point size and opacity are set in Plot Style.
- A p-value of exactly 0 (numerical underflow, not a true zero) is plotted just above both the smallest non-zero p-value in your data and the genome-wide line, so it never sits below the line it is labeled for. Its height is a lower bound on its significance rather than a measured value. Plot Style and the figure caption say how many variants this applies to.
- Up to 250,000 variants; above that the chart shows a message instead.
- The data can be edited in the chart's spreadsheet.
- The AI Assistant can build a Manhattan plot and adjust its thresholds (the Bonferroni line included), colors, chromosome widths, points and labels.
Build one with File → Omics Plot → Manhattan Plot from Selected Text…, the Text Tools menu's Omics Plot submenu, or the Spreadsheet toolbar's Omics Plot menu. Smart Visualization opens a table here when its first three headers are a chromosome, a position (BP, Pos, Position) and the p-value.
Stacked Composition Bar
Shows Grouped Diverging Bar data as one stacked bar per category, for composition (such as cell-type proportions per sample) rather than signed differences. To make one, build a Grouped Diverging Bar, then switch its Chart Type to Stacked Composition Bar.
- Series stack in the same order in every bar (the order they first appear in the data), so each series is easy to compare across categories.
- "Show as percentage" (Plot Style) scales every bar to 100%. Off by default, so bar heights show the raw totals.
- Negative values are left out of the stack, and the inspector says how many were left out.
- A category and series repeated on several rows: the first row's value is used, as in Grouped Diverging Bar, so stacks, totals and percentages match it. The inspector, the Data Log and the figure caption say how many rows repeat.
- Show totals (n), on for new charts, writes each bar's total at its end: "n = …" in percent mode, where 50% of 4 and 50% of 4,000 look the same. Label segments writes each segment's share of its bar inside it, where it fits. Sort bars by orders the bars by one series' share, largest first. Error bars are deliberately not offered: a stacked segment has no common baseline to read them against; use Grouped Diverging Bar or a bar chart of the replicates for variability.
- In percent mode the value axis's title gets "(%)" unless it already says percent. A category with no positive value draws an empty bar, and the inspector says how many there are.
- Orientation, "Swap Category and Series" and per-series colors work as for Grouped Diverging Bar.
PCA Plot
A principal component analysis biplot computed from the matrix: samples plotted at their scores on two components (PC1 and PC2 unless you choose others), each axis title giving that component's % variance explained, and features' loadings drawn as arrows from the origin. To make one, build a Heatmap from a numeric matrix with row and column names, then switch its Chart Type to PCA Plot.
- "Samples are: Columns / Rows" (Plot Style) says which way the samples run. The default, Columns, matches the usual layout of genes in rows and samples in columns.
- "Log2 transform" runs the PCA on log₂ of the values. It is the same setting as the Heatmap's, so both chart types analyze the same numbers. Turn it on for raw counts or intensities, so a few very high values don't dominate; leave it off for data already on a log scale. A zero or negative value has no log₂ and counts as missing. For counts, also check "Add 1 first: log2(x + 1)", which keeps zeros (only negative values count as missing).
- "Scale variables (unit variance)" standardizes each feature to unit variance first (as R's PCA does when asked to scale). Off by default, as log₂ expression data are usually on comparable scales; turn it on for features measured in different units.
- "Top N most variable features" (500 by default): PCA can run on only the features with the highest variance across samples (after the Log2 transform, if on), as DESeq2's plotPCA does with its default of 500. Those features carry most of the structure, while thousands of low-variance genes mostly add noise. It is on automatically for new charts with more than 500 complete features and at least 10 times as many features as samples (a typical gene-expression matrix). Turn it off to use every feature, or change the number; the inspector says how many features are in use.
- X and Y: choose any two components to plot. PC1 and PC2 is the default; PC1 vs PC3 or PC2 vs PC3 can show structure the first two miss. Each axis title shows that component's % of the variance.
- Variance explained: small bars show the % of variance of the first 10 components, with the plotted pair highlighted. Copy Variance Table or Save as CSV… gives every component's standard deviation, variance, % of variance and cumulative %, the same numbers as R's summary(prcomp(...)).
- The figure caption states the samples, the features used, the transform, centering and scaling, the plotted components with their % of variance, the % for PC1 to PC5, and the sign convention (each component's largest loading is positive).
- "Show loading vectors" draws arrows for the features with the largest loadings on the two plotted components (the number shown is adjustable).
- "Show sample labels" writes each sample's name beside its point. Samples are not grouped automatically, but you can recolor individual samples to highlight a subset.
- Ellipse per color group (off by default) draws one ellipse around each group of samples sharing a point color, so give each group's samples the same color first. Type: Normal (the default) is ggplot2's stat_ellipse(type = "norm"), from the group's mean and covariance. t is stat_ellipse's default, a multivariate t fit (MASS::cov.trob), so an outlier stretches it less. Both are expected to hold about Level of the group (radius √(2·F(level; 2, n − 1))) and need at least 4 samples. Confidence (group mean) is the confidence ellipse for the group's center: Hotelling's T² region (covariance ÷ n, radius √(2(n − 1)/(n − 2)·F(level; 2, n − 2))), which covers the true mean at the stated level for any group size. FactoMineR and factoextra draw the same shape with the large-sample radius √χ²(level; 2), whose "95%" ellipse covers the mean only about 67% of the time with 4 samples and 84% with 8. It also needs 4 samples and shrinks as the group grows. Level is 95% by default. Plot Style and the caption say which groups got no ellipse. The axes widen to fit the ellipses.
- The PCA is recalculated whenever the matrix changes, such as after editing a cell in the spreadsheet.
- Missing values: a feature (such as gene) with a missing value in any sample is left out, as PCA in R and DESeq2 works on complete data; filling the gap with the feature's mean would pull that sample toward the center and understate the feature's variance. Plot Style says how many features were left out.
- A feature counts as constant only when its spread is at rounding level next to its own values (under 10⁻¹³ of them), so features in small units, such as a capacitance in farads, or tightly spread on a large offset, are analyzed like any other. A constant feature takes no part in the PCA, and Plot Style says how many there are.
- Needs at least 3 samples and 2 complete features; shows a message instead above 500 samples or 50,000 features, or if no feature varies.
Build a Heatmap first (File → Omics Plot → Heatmap from Selected Text…, ⌥⌘M), then switch its Chart Type to PCA Plot.
Inspector Reference
- Plot Style for Volcano / MA Plot: Display mode, fold-change and significance thresholds, use-adjusted-p toggle, Up/Down/Not-significant colors, point size, point opacity, aesthetic mapping (color/size/shape/opacity by extra data columns), Label Genes Matching Criteria, labeled genes list with Clear All, the 'Search / highlight gene…' field, and Send to Venn Diagram.
- Plot Style for Heatmap: normalization mode, Log2 transform (with Add 1 first for log₂(x + 1)), color scale and value range, Swap Rows and Columns, cluster rows/cluster columns toggles, linkage method, distance, optimal leaf ordering, search field, Show axis (border), hide all-zero rows, hide all-zero columns. Show legend and Show cell grid are in Axes & Labels.
- Plot Style for Dot Plot: Swap Rows and Columns, Order Groups by Similarity, Order Features by Similarity, Hide dots below size, Hide features and groups with no dots, color preset menu, Low/Mid/High color pickers, Scale each feature (z-score), log1p before scaling, auto/manual color-scale range.
- Plot Style for Cluster Scatter: Swap X and Y, Show Cluster Outlines, Label clusters, Same scale on both axes, point size, point opacity, per-cluster color overrides.
- Plot Style for GSEA Bar: Positive (Up) and Negative (Down) colors.
- Plot Style for Grouped Diverging Bar / Stacked Composition Bar: Horizontal/Vertical orientation, Swap Category and Series, per-series color overrides, plus Show as percentage for Stacked Composition Bar.
- Plot Style for PCA Plot: Samples are Columns/Rows, Log2 transform (with Add 1 first for log₂(x + 1)), Scale variables (unit variance), Top N most variable features, X and Y components, variance-explained bars with Copy Variance Table and Save as CSV…, Show loading vectors (with a count of features shown), Show sample labels, Ellipse per color group (Type, Level), default point color, point size, point opacity, per-sample color overrides.
- Plot Style for UpSet Plot: Count items (In exactly these sets / In at least these sets). Sorting, the 40-combination limit, colors and the layout are automatic.
- Axes & Labels: X axis label, Y axis label, axis label font, tick value font, axis color, tick color, axis line width, tick length/width. Volcano and MA Plot have no grid. Dot Plot, Cluster Scatter, GSEA Bar, Grouped Diverging Bar, Stacked Composition Bar, PCA Plot and Manhattan Plot have grid controls (show/hide, color, width, opacity, dash, line count). Heatmap has cell grid controls (show/hide, color, width, opacity, dash). PCA Plot's axis titles are set by the plotted components (such as "PC1 (x%)", "PC3 (x%)"). UpSet Plot, like Venn Diagram, has no editable axis labels or grid.
- Copy / Paste Chart Style (⌥⌘C / ⌥⌘V) copies the look (colors, fonts, thresholds, mapping, normalization, clustering) without the data.
References
Bar-Joseph Z, Gifford DK & Jaakkola TS (2001). Fast optimal leaf ordering for hierarchical clustering. Bioinformatics, 17(Suppl 1):S22–S29. The Heatmap's optimal leaf ordering.
Devlin B & Roeder K (1999). Genomic control for association studies. Biometrics, 55:997–1004. The Manhattan Plot's genomic inflation factor λ.
Hao Y, Stuart T, Kowalski MH, et al. (2024). Dictionary learning for integrative, multimodal and scalable single-cell analysis. Nature Biotechnology, 42(2):293–304. Seurat; the Dot Plot's ordering by similarity and Cluster Scatter's cluster labels.
Kolde R (2019). pheatmap: Pretty Heatmaps. R package version 1.0.12. The clustered heatmap whose tree and leaf order the Heatmap matches.
Korotkevich G, Sukhov V, Budin N, Shpak B, Artyomov MN & Sergushichev A (2021). Fast gene set enrichment analysis. bioRxiv 060012. https://doi.org/10.1101/060012 fgsea; the sign-specific GSEA p-value.
Law CW, Chen Y, Shi W & Smyth GK (2014). voom: precision weights unlock linear model analysis tools for RNA-seq read counts. Genome Biology, 15:R29. limma-trend on log-CPM, used for the Volcano Plot's raw counts.
Love MI, Huber W & Anders S (2014). Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biology, 15:550. plotPCA's top 500 most variable features, the PCA Plot's default for gene-expression matrices.
Murtagh F (1985). Multidimensional Clustering Algorithms. COMPSTAT Lectures 4. Würzburg: Physica-Verlag. The algorithm of R's hclust, which the Heatmap's clustering follows step for step.
Murtagh F & Legendre P (2014). Ward's hierarchical agglomerative clustering method: which algorithms implement Ward's criterion? Journal of Classification, 31:274–295. Ward's method on correlation distances in the Heatmap.
Robinson MD & Oshlack A (2010). A scaling normalization method for differential expression analysis of RNA-seq data. Genome Biology, 11:R25. TMM normalization for the Volcano Plot's raw counts.
Smyth GK (2004). Linear models and empirical Bayes methods for assessing differential expression in microarray experiments. Statistical Applications in Genetics and Molecular Biology, 3(1):Article 3. The moderated t-test (limma's eBayes).
Subramanian A, Tamayo P, Mootha VK, et al. (2005). Gene set enrichment analysis: a knowledge-based approach for interpreting genome-wide expression profiles. Proceedings of the National Academy of Sciences, 102(43):15545–15550. https://doi.org/10.1073/pnas.0506580102 The method behind Compute GSEA (Permutation).
Wang M, Zhao Y & Zhang B (2015). Efficient test and visualization of multi-set intersections. Scientific Reports, 5:16923. The exact multi-set overlap test and the fold enrichment in the Venn Diagram popup.
Wickham H (2016). ggplot2: Elegant Graphics for Data Analysis, 2nd edition. New York: Springer. The default color palette for more than eight clusters or series, and the PCA Plot's 95% ellipse.
Graph Display Settings
All display options are in the Display category of the inspector, and the plot updates as you change them. Plot Style holds symbols, lines and the legend; Axes & Labels holds the axes, ticks, labels, title, background, scale bars, interval bars, error bars and trend/base lines; Range sets axis limits and log scales; Groups sets the grouping and group order.
Plot Style
The top of the panel says what you're editing: a sweep, the selected group, or 'All sweeps (global)' when nothing is selected. Click a sweep or a group panel to select it; Clear returns it to the global style.
- Symbol: shape (Dot, Circle, Square, Triangle, Diamond, Cross, Plus, Tick, and filled circles, squares and triangles), size (1–20 pt) and color. Choose None for lines only. A raster always draws ticks.
- Line: Solid, Dashed, Dotted, Dash-Dot or None; width (0.5–5 pt) and color. Curved joins the points with a smooth curve that never passes its neighbors. If the X values double back, the curve follows the table's order instead and can swing past the points, and the inspector says so; sort the table by X to avoid that. Traces of more than 2,000 samples stay straight.
- Wavelength color: beside each color well, type a wavelength from 380 to 700 nm in the λ field, step it with the arrows, or drag along the spectrum, and @Graph picks the matching color. Handy for coloring fluorescence traces by excitation or emission wavelength.
- Palette colors: 'Use rainbow spectrum for overlaid sweeps' (named for the active palette, chosen in Settings → Appearance) gives each sweep a different color from the palette, which it keeps when other sweeps are shown or hidden. Choosing a line color for a group or for all sweeps turns it off. Turn on 'Color by position within group' to restart the colors in each group, so the first sweep of every group shares a color.
- Apply current style to Sweep / Group / All: apply the current style to the selected sweep only, to its whole group (clearing per-sweep styles in it), or to every group (clearing all per-sweep and per-group colors, symbols and lines). Y ranges, ticks, scale bars, error bars, trend lines and visibility stay per group.
- Rename a sweep: click the sweep on the graph, then edit the 'Name' field at the top of this panel. The name ("Sweep N" by default) appears in the legend and wherever else the sweep is listed. Renaming can be undone with ⌘Z and is saved in the .@graph file.
Axes & Labels
- Show or hide the X and Y axes, and choose whether an axis crosses at zero. Log axes are set in the Range panel (see Logarithmic Axes below).
- Grid: show or hide it. Grid lines fall on the major ticks.
- Axis line width, and the colors of the axis lines, axis text and grid.
- Tick marks: major and minor length, direction (inside, outside or symmetric) and minor ticks per major.
- Tick spacing: 'auto' for rounded spacing, or an exact major interval (linear axes only; a log axis places its own ticks). X is shared by all panels; Y is set per panel.
- Automatic ticks step by 1, 2 or 5 times a power of ten, so labels rarely need two decimals. The X axis picks the time unit that fits (a 3 ms zoom reads in ms, a long recording in min). 'Rescale Y units automatically' (on by default) does the same for Y: when a small range would need two or more decimals, the axis switches to a smaller prefix of the channel's unit, so 0.05 mV steps read 50 µV and the title reads Voltage (µV). A Y scale bar label follows the same rule. Only the labels change: the data, the Y range fields and every measurement stay in the channel's own unit. A log Y axis, or a Y interval you typed, keeps the unit as it is.
- Labels: show or hide tick values and axis labels, and set their font, size and text. The left margin widens when a Y tick label is long, so the labels never run into the axis title. All panels share it, so their plots line up.
- Graph Title: 'Show title' adds a title above the plot, with its own font, size and color.
- Background color: when you switch between a dark and a light background, @Graph offers to invert the axis, text, grid and title colors so they stay readable.
Logarithmic Axes
Each axis has a Logarithmic scale checkbox in the Range panel, and in the range box that opens when you double-click its tick labels, as on charts. A log axis is labeled at powers of ten, with minor ticks at 2 to 9 times each; a narrower range is labeled 1, 2 and 5 times a power of ten, so there are always at least three labels. A Min or Max of zero or less is ignored and that end fits the data. Values at or below zero, and samples at time zero or earlier on a log time axis, are not drawn, and the Range panel says how many.
A log time axis shows s, ms, µs or ns, chosen from its upper end. Scale bars are hidden while an axis is logarithmic, and a log Y axis shows values without junction-potential correction.
Legend
Turn on 'Show legend' (Plot Style panel) to draw a key on the plot with one row per sweep, showing its name and a sample of its line and symbol, so sweeps that share a color but differ in line or symbol can still be told apart.
- The key always matches what is drawn, including rainbow colors and per-sweep or per-group styles.
- Drag the key to move it.
- Double-click a row to select that sweep and open a small editor: rename the sweep, or click 'Remove from Legend' (or press Delete) to drop the row from the key without affecting the sweep.
- 'Legend title' (optional) adds a heading above the rows, such as 'Trial 1'.
- Removed rows are saved with the file and carried by Copy/Paste Style.
- The legend is included in every export (PDF, SVG, PNG, clipboard) as shown on screen.
Scale Bars
Turn on 'Show scale bars' to draw L-shaped scale bars, as in many neuroscience figures. For the classic axis-free look, also turn off Show X axis and Show Y axis. Enter lengths as a number in axis units, a value with a unit such as '500 ms' or '50 pA', or 'auto' for a round length in the unit the axis shows. Drag the corner to move the bars. Each group can have its own Y bar length when units differ. The bars have square ends and are drawn as one L, so each is exactly the length its label states. Scale bars aren't drawn when either axis is logarithmic, since a length has no single size there.
Scale bar and interval bar labels share one font and size. The screen and every export use the chosen font (PDF embeds it). The X scale bar's label uses the same unit as the X axis, such as ms.
Interval Bars
Horizontal bars mark a time interval, such as a drug application, at a chosen height, with an optional label above or below. Add as many as you like. They're drawn in the Axis lines color, like the axes and scale bars, with square ends, so each covers exactly the interval it marks.
- Turn on 'Show interval bars' and click 'Add Bar'.
- Double-click a bar on the graph to set its start time, end time, Y value, label text and label position. The numbers are in the axes' own terms: times as the X axis shows them (after Set X = 0, in its unit, such as ms) and Y as the Y axis shows it (junction-potential corrected when that is on). The inspector list shows them the same way.
- Delete a bar from that popover or with the trash icon next to it in the inspector list. ⌘Z undoes a deletion.
- In a graph with stacked panels, bars are drawn (and editable) only on the top panel, using its Y scale. Reordering panels in Group Order & Visibility moves them to the new top panel.
Interval bars are included in PDF, SVG and image exports.
Trend/Base Line
A reference line for each group: 'Trend' fits a straight line, 'Base' draws a flat line at the mean Y value. It is computed from the group's average trace over an X range you choose and drawn across the full width of the panel.
- Turn on 'Show for [group]' (or 'Show trend/base line' for a single-group graph) and choose Trend or Base.
- Set the X start and end of the data used for the fit, as the X axis reads them (in its unit, after any 'Set X = 0' shift); the fit stays on the same stretch of data if the shift is changed later. The line itself always spans the whole panel.
- On a logarithmic axis the fitted straight line is drawn as the curve it becomes there.
- Color and line style can be set per group (default: axis color, dashed).
- Works best on a group that is already a single averaged trace. For a group of raw sweeps, the fit uses their sample-by-sample average.
Error Bars
Draws vertical error bars with caps at every visible point, using another sweep's values as the ± size, such as a separately loaded SEM or SD column. These are separate from the SD/SEM bars drawn automatically on time-binned summary graphs (Synapse Detection).
- For each group, turn on 'Show for [group]' (or 'Show error bars') and pick the source sweep.
- Values are paired sample by sample, so the source sweep should have the same number of samples and sample rate as the sweep it annotates.
Grouping Modes
- Single group (all sweeps): all sweeps overlaid in one panel (⌥⌘G).
- Combine groups of N: each run of N consecutive sweeps forms one group.
- Combine every N: sweeps are dealt out in turn (sweep 1 → group 1, sweep 2 → group 2…). Used for multi-channel files.
- Split by channel: one group per recording channel, whatever order the sweeps are in. Offered when the file has more than one channel.
- Separate all sweeps: one panel per sweep (⌥⌘S).
- Clear all style overrides, in the same panel, removes every per-sweep and per-group color, symbol and line. Each group keeps its own Y range, ticks, scale bar, error bars, trend line and visibility.
Group Order & Visibility
With more than one group, the Groups panel has a 'Group Order & Visibility' section. Use each group's ↑ and ↓ buttons to change the top-to-bottom order ('Reset order' restores it), and its Show/Hide button to hide a group ('Show all' shows every group again). The order is saved in the .@graph file.
To make one stacked panel taller and its neighbor shorter, drag the gap between them up or down (the pointer shows ↕ over it). The other panels keep their heights, and every panel keeps room for its axes. Double-click a gap, or choose Reset Panel Heights from a panel's right-click menu, to make all panels the same height again (⌘Z undoes either). Only the panels' heights change, not their Y ranges. The heights are saved with the graph, used in every export, and scale with the window. While the number of panels differs (a group hidden, another grouping), the panels share the height equally.
The Groups button in the header bar (the eye) lists every group of the current grouping, with its sweeps (such as 'Sweeps 1, 4, 7' for every-third grouping), and shows or hides each with a click; the list stays open for several changes. Right-click a panel to hide it, or to show all groups again.
Match Y Ranges, in the Range panel, gives all groups with the same unit the same Y range, so figure panels can be compared by eye.
Modifying Graphs
Modify operations change the sample values in the graph (never the original recording file). Each one can be undone with ⌘Z and redone with ⇧⌘Z.
Filter, Smoothing and Baseline have an 'Apply to' menu: Selected group, All groups, All sweeps, Visible sweeps or Selected sweep. Filter and Smoothing start on Selected group, and Baseline on All groups. When the sweeps come from more than one recorded channel, a Channel menu below it limits the change to one channel, so that All sweeps need not filter a command or stimulus channel; All channels is the default. Fit overlays and AP-marker sweeps are never changed, as in Protocols and Batch Processing: they are derived from the data, not recorded.
In any Modify panel, pressing Return (↩) in a number field (frequency, window size, region start/end, scale factor, offset) runs the panel's main action.
Saving is disabled while a filter, smoothing or baseline operation is still running. Wait for the 'Applied…' message before saving. An Undo or another edit made while it runs cancels it, and nothing is applied.
Filter / Smooth (⇧⌘F)
Choose a Type, enter its Frequency (Hz) (or band edges, or Points), choose Apply to, then click Apply Filter. The types (Butterworth filters are zero-phase, run forward and backward, unless Causal is on):
- Low-pass: removes high-frequency noise (typical cutoff: 1–5 kHz). A Butterworth filter: the flattest passband and the steepest roll-off for its order, but it overshoots a step (by about 7% at order 4, run forward and back) and rings after it.
- Low-pass (Bessel): the filter patch amplifiers use (their 4- and 8-pole settings). It barely overshoots a step (0.5% at order 4, forward and back), so rise times, action-potential shapes and event kinetics come through undistorted; the price is a gentler roll-off, so it removes less just above the cutoff. Its cutoff is the −3 dB point, as amplifier filters are specified (SciPy's norm='mag'). Orders 1–8. Use it to match an amplifier's filter, or whenever waveform shape matters more than a sharp cutoff.
- Order (low-, high-, band-pass and band-stop): 1–8, 4 to start. A higher order cuts more steeply but rings more after a sudden step; run forward and back, the roll-off far beyond the cutoff is 12 dB per octave per order (for a band-pass or band-stop, whose order is that of the whole filter, 6 dB per octave per order on each side of the band).
- Causal (one pass, forward only), for every low-, high-, band-pass and band-stop filter: off by default. Off, the filter runs forward and back, so nothing shifts in time, but each event's filtered edge starts slightly before the event itself, which can make an onset or latency read early. On, it runs once, as an analog filter does: nothing appears before an event, but the whole trace is delayed, and each cutoff is the −3 dB point of the one pass (the roll-off is then 6 dB per octave per order, half that of forward and back). For a low-pass, the panel and the message give the delay (the filter's group delay at low frequencies, nearly constant across a Bessel filter's passband); subtract it from measured times. A causal high-pass or band filter shifts each frequency differently, so it changes event shapes.
- High-pass: removes slow baseline drift (typical cutoff: 0.1–1 Hz).
- Band-pass: keeps a frequency band.
- Band-stop (notch): attenuates the band between the two frequencies you enter and leaves the rest alone. Use it when the interference covers a range. For a single interfering frequency, the Mains hum and Single-frequency options are more precise.
- Band-pass and band-stop are true Butterworth band filters (the standard low-pass-to-band transform, as MATLAB and SciPy build them), so a narrow band keeps a flat passband. Order is the order of the whole filter, as for low- and high-pass, and is even (2, 4, 6 or 8), since the band is built from a prototype of half that order.
- A cutoff or band edge must be below the Nyquist frequency (half the sample rate) of every sweep filtered, and a band's high edge above its low edge; otherwise the panel says so and nothing is changed. The panel shows the Nyquist frequency, or its range when sweeps have different rates. The filter itself applies the same rule, so no entry point (Protocols, the AI Assistant) can have a cutoff quietly moved below Nyquist.
- A low-pass filter's gain at 0 Hz is exactly 1, so even a very low cutoff leaves the baseline level untouched (−70 mV stays −70 mV).
- Every cutoff and band edge you enter is the −3 dB point of the filter as applied. Running forward and backward squares the response, which would otherwise put the entered frequency at −6 dB (as forward-backward filtering in MATLAB and SciPy does), so @Graph designs each filter to make the two passes together 3 dB down there.
- Sweep ends: as in SciPy's sosfiltfilt, each end of a sweep (and of each stretch between blank cells) is extended by a mirror image of the trace, so its level and slope carry on past the end, long enough for the filter to settle; the extension is removed afterwards. The mirror turns about the end of a straight line fitted to the first (or last) 2 ms rather than about the single end sample, so one sample's noise shifts a sweep's filtered baseline less (about 2.5 times less for a high-pass), while a trace that starts or ends on a slope, such as a ramp, is still continued exactly. Within about one time constant of each end the result is still an estimate: a low-pass or band-stop ends near that line's end, and a high-pass or band-pass near 0.
- Mains hum (50/60 Hz): removes power-line interference. See below.
- Single-frequency: removes one exact frequency by subtracting a fitted sine wave, and its harmonics only if you ask (Harmonics: Fundamental only, the default; Those present; or First N). Use it when you know the interfering frequency precisely (a stimulator, pump or chopper) and it doesn't drift. It removes the frequency whether or not it is there, so it suits short sweeps the Mains hum filter cannot test. How the sine waves are fitted, and where from, is as for Mains hum below.
- Boxcar: running average; fast but distorts the edges.
- Median: keeps sharp transitions better than boxcar, and stays quick on long recordings (a 201-point window over 10 million samples takes under 2 seconds).
- For Boxcar and Median, Points is the window in samples: at least 3, and odd (an even value runs one point longer). The message after filtering states the window used.
- Three-point: the lightest possible smoothing, each sample replaced by a ¼, ½, ¼ weighted average of it and its two neighbors.
The Butterworth filters have an accurate flat passband at every order. The Smoothing section, below the filters, offers Boxcar (moving average), Gaussian and Savitzky-Golay (the default), with a Window (ms) field (2 ms to start), its own Apply to menu and an Apply Smoothing button. Savitzky-Golay is best when peak heights must be preserved: it fits a polynomial over the window, with the order set in the panel (2–6, default 4). Higher orders keep peak heights and widths closer to the data but smooth less at the same window, and 2 smooths most, so 4 suits spikes and synaptic events. The window needs at least order + 2 samples; below that a lower order is used, so it always smooths. At the first and last half-window it uses the polynomial fitted to the end window, as the method is defined, rather than a mirror image of the trace. Gaussian's window spans ±3 standard deviations of the kernel. The window is typed in ms and converted for each sweep at its own rate to the nearest odd number of samples, at least 3 (1.2 ms at 5 kHz is 7 samples); the line under the field and the message after smoothing show the samples and the time actually used. A window of 0 ms or less is refused. Smoothing, Boxcar, Median and Three-point all compute in double precision, and each stretch between missing samples is smoothed on its own, so a missing sample stays missing instead of spreading over a window.
Mains Hum (50/60 Hz)
Enter the nominal line frequency (60 Hz in North America, 50 Hz in most of Europe and Asia). The filter then:
- Measures the frequency actually present within ±0.5 Hz of the nominal value. Grid frequency drifts, so subtracting at exactly 60.000 Hz can leave most of the hum behind. When the strongest frequency in that range sits at its edge, there is no hum peak in the range (a real 59.4 Hz rhythm, say), and nothing is removed.
- Tests whether hum is there at all, and which harmonics: each one's power, through a Hann window, must exceed 20 times the background power 3 to 5 frequency bins either side (an amplitude about 4.5 times the background; on noise alone about 1 harmonic in 2,000 passes). The fundamental is tested too, so a sweep without hum is left unchanged. Harmonics: Those present (the default) removes each harmonic that passes, up to the 40th; Fundamental only and First N remove those once the fundamental passes.
- The test needs at least 8 cycles of the line frequency in the stretch it looks at (133 ms at 60 Hz, 160 ms at 50 Hz). On a shorter sweep nothing is removed and the message says why; use Single-frequency, which does not test, if you know hum is there.
- Fits a straight line plus the sine waves to the data, jointly, and subtracts the sine waves (not the line) from the whole sweep. This removes almost no bandwidth: a genuine 58 Hz oscillation survives intact. The line keeps a membrane potential of −65 mV or a slow drift from being mistaken for hum.
The fit is robust. An ordinary least-squares fit would take part of the response as hum: an action potential has a component at every frequency, and a train of responses at 20 Hz has its own components at 60, 120, 180 Hz…. Instead, samples that a line plus hum cannot explain are set aside (a Huber fit, then Tukey's bisquare, the standard robust regression), so on a hum-free 0.2 s sweep with one action potential the filter changes the trace by under 0.02 mV, where least squares would change it by 0.8 mV.
Estimate from chooses which samples the hum is fitted to; it is always subtracted from the whole sweep. Whole sweep (the default) suits recordings that are mostly baseline. When responses fill much of the sweep, as in a stimulus train or rhythmic activity, no fit to the whole sweep can tell them from hum: choose Between cursors A–B and place the cursors on a quiet stretch, such as the baseline before the stimulus, or Outside cursors A–B and bracket the response. Fitted on a stretch and subtracted beyond it, the hum's frequency and phase are carried over; the longer the stretch, the more precisely (a 0.2 s stretch measures the frequency to a few hundredths of a hertz, which can leave a fraction of the hum a second away). Protocols take the same choice as two times in ms.
The message after filtering gives the frequency and harmonics removed, and the Data Log lists each sweep: frequency, harmonics, the fundamental's amplitude, the samples fitted, the share set aside as signal, and why any sweep was left unchanged. When more than 10% of a sweep was set aside, the message suggests fitting a quiet stretch instead. Missing samples stay missing and do not affect the fit.
Because hum frequency and amplitude drift over time, long records fitted to the whole sweep are fitted in overlapping two-second segments, run in parallel and blended smoothly, so the removal tracks the hum along the record. Which harmonics to remove is decided once for the whole record, by majority over the segments. Sweeps shorter than one segment, and fits to a cursor stretch, are fitted in one piece.
Hum removal is a remedy, not a substitute for a clean recording. Grounding, shielding and moving the offending transformer or lamp away from the rig remove the hum at its source, along with anything else that path was adding.
Data Transform: Scale/Offset Axes (⇧⌘X)
This panel holds Y axis scale and offset, X axis scale, and Set X = 0.
- Y Axis Scale & Offset: each value becomes value × scale + offset (the same formula in Protocols, and in Batch Processing, which applies it to the recorded values). Useful for unit conversion or inverting polarity (scale = −1). The Scope checkboxes below it, 'Visible sweeps only' and 'Apply to all groups', choose the sweeps; by default it changes the visible sweeps of the selected group. It works on the values as the graph shows them, junction-potential correction included. Error bars scale with the values. The ⓘ button shows the formula. Scale and Offset must be plain numbers: text the parser doesn't read as a number, such as '1/1000', '50%' or '1.5k', is refused rather than read as its leading digits. The unit is not changed; if the scale changes it (A to pA, say), edit the Y-axis label.
- X Axis Scale: multiplies every X value (time, or the X column of X-Y data) by the factor. Applies to the whole file. For evenly sampled data this is the same as rescaling the sample rate, so the factor can't be negative. The cursors, the Set X = 0 shift, a fixed X range, X error bars, and the sweeps' recorded start times scale too, so the view and the recording-time layout stay on the same data. The unit is not changed; edit the X-axis label if the scale changes it.
- Set X = 0: shifts the X axis so a chosen time becomes zero (see below).
Baseline Correction (⇧⌘B)
Choose a Method, set the window in the Start and End fields (or with cursors A and B, or Set from cursors), choose Apply to, then click Apply Baseline. ⇧⌘B opens the panel with the Start field ready for typing.
- Mean subtraction: subtracts the mean of a time window, in ms as the X axis shows it (after Set X = 0). You can also type a unit, such as '0.1 s'. A sweep that ends before the window starts is left unchanged, and the panel says how many. A window that starts before the sweep's first sample is refused.
- Median subtraction: the same with the window's median, which a spontaneous event or an artifact inside the window barely moves (a 15 mV event across 4% of a window moved the mean by 0.67 mV and the median by under 0.01 mV).
- Line through two windows: give a window before the response (the region fields) and one after it (the second window; it starts on the last 10% of the sweep). The straight line through each window's mean, at the window's middle, is subtracted from the whole sweep: a drift that runs straight across the response is removed without fitting the response itself (a 20 mV step on a 4 mV per 100 ms drift reads 19.96 mV). Protocols and the AI Assistant offer it too; Batch Processing, which has one region, does not.
- The line under the fields lists the samples averaged, numbered from 0 at the sweep's start: 'Samples 31–32' means samples 31 and 32. Each end goes to its nearest sample and both are included, the rule Measure uses, so a baseline and a Measure mean over the same times average the same samples. A window that runs past a sweep's end uses that sweep's samples up to its end, and the message says how many sweeps that happened to.
- Single point: set Start = End (or cursors A and B to the same place) to zero the trace on the one recorded sample nearest that time, for example 'Sample 32 (1600 ms)' at 20 Hz. Set from cursors moves both fields to that sample's time so you see exactly which point is used; the cursors stay where they are. A time exactly halfway between two samples uses the later one. If the sweeps in Apply to have different sample rates, each uses its own nearest sample. A window shorter than one sample interval uses the one sample nearest it. One sample's noise sets the zero, so a short window is steadier when the trace is noisy.
- Linear detrend: fits and removes a straight line, eliminating slow drift. Polynomial fit does the same with a curve. Fit to: the whole sweep (the default), only the region in the Start–End fields, or everything except it. A fit to the whole sweep fits the response too and takes part of it away (a 20 mV step on a drifting baseline came out 17.6 mV after a linear detrend and 5.4 mV after order 2); fit the stretches without a response and the step stays 20.0 mV. The fitted curve is always subtracted from the whole sweep.
- All baseline arithmetic is in double precision, so a 10-million-sample sweep is corrected as exactly as a short one. Missing samples are skipped in the mean and the fits and stay missing. Baseline correction works along a time axis, so X-Y data are refused.
- Polynomial: fits and removes a polynomial of order up to 8. Fitted to a stretch, it is computed on that stretch's own scale, so even a high order on a short stretch gives the true least-squares curve. When a sweep (or the region fitted) has too few samples for the order, or the fit is singular, a lower order is used, down to a straight line, and the message names the sweeps and the order used. A sweep with too few usable samples is left unchanged and named.
- The window follows cursors A and B. Opening the panel shows the cursors, at the baseline's last spot or over the middle of the view, so drag them onto a quiet stretch before the stimulus. You can also edit the Start and End fields and press Return (↩) to apply.
- After correction the Y axis rescales to the new data, even if you had set a manual range. Junction-potential correction is turned off, since both set the reference level. Undo restores both with the data.
Set X = 0 (Data Transform panel, ⇧⌘X)
Shifts the X axis so a chosen time (or X value, on X-Y data) becomes x = 0, for example to align sweeps to a stimulus onset. The data values are unchanged; only the axis labels move. Measure and Peaks report times on this shifted axis. It sits in the Data Transform panel, below X Axis Scale.
- With the cursors showing, drag cursor A to the new zero point (the field follows it), then click Apply.
- Or type a value as the axis shows it, in the axis unit, and press Return (↩) or click Apply.
- 'Active offset' shows the current shift in the axis unit.
- Reset removes the shift, back to the recording's own time: 0 at each sweep's start, or, for a file whose first sample isn't at 0, that first sample's time (see Supported File Formats → Recording Times).
- Apply and Reset can both be undone.
Series Resistance Correction: Rₛ (⇧⌘I)
The Rₛ Correction panel has two modes, chosen at its top: Current clamp corrects a recorded voltage (as bridge balance does), and Voltage clamp corrects a recorded current (Traynelis 1998). The panel picks the mode that matches the recording, from the amplifier's telegraphed mode when the file stores it, else from how fast its voltage steps are (as VI and IV Plot judge it), and warns when the other mode is chosen. Both corrections stand apart from the data: Remove and ⌘Z undo them, and a saved graph keeps them.
Current Clamp
In current clamp, current flowing through the electrode's series resistance (Rₛ) adds an instant voltage jump at the start and end of each current step (ΔV = I × Rₛ). This artifact distorts resting potential, AP threshold, sag ratio and steady-state voltage. Rₛ correction removes it from the voltage sweeps: check the Injected Current box, then click Apply Rₛ Correction. The message and the Data Log give the Rₛ applied.
It needs a voltage channel (mV) and the injected current, which can come from three places. The Injected Current box at the top of the panel says which one is in use:
- A recorded current channel (pA or nA). Used whenever there is one.
- The file's protocol. An episodic ABF file stores its current-clamp protocol in its header, so even a voltage-only recording gives the exact timing and size of each step. The panel summarizes it, such as 'steps of −100 to +400 pA across 17 sweeps (sweep 1: −100 pA at 146.8 ms)'. Each sweep's Rₛ is measured on its largest step, and the correction follows the whole protocol.
- A step you enter. For files with neither, or to override the protocol, check 'Describe the current step' (or 'Use a step I enter instead') and give the start and end times (as the X axis shows them), the step on sweep 1 and the change per sweep: −50 pA and +10 per sweep gives −50, −40, −30 … pA. The voltage jump is looked for within 2 ms of the start you enter, and the step is moved to where it is (the message says so); with no jump there, the automatic estimate is refused rather than measured at the wrong place.
- How Rₛ is measured: for each sweep, a straight line is fitted to the voltage just after the step and extrapolated back to the step's edge, the clock tick of the last sample before the step. The size of that jump, divided by the current step, is Rₛ. Extrapolating separates the instant ohmic jump (Rₛ) from the membrane charging that starts right after it; reading the jump at the first sample after the step would add a sample of charging (22.6 MΩ for a true 20 MΩ at 20 kHz on a 20 pF cell). The correction subtracts Rₛ × ΔI for the duration of the step.
- 'Log per-sweep Rₛ estimates to Data Log' (on by default) lists each sweep's fit: where it starts and ends after the edge, and its slope.
- The estimate assumes the electrode and amplifier follow the step within one sample. A slower response, such as an uncompensated pipette capacitance, leaves the jump incomplete where the line starts and Rₛ reads low (about 86%, 72% and 44% of the true value for electrode time constants of 40, 100 and 200 µs at 20 kHz). The panel checks for it over all the sweeps together, from how far the first samples after the step fall short of the line, and warns when they do; neutralize the pipette capacitance when recording, or use the amplifier's bridge-balance value as a manual Rₛ.
- Post-onset window: how long after onset the voltage is fitted. It is set automatically from the file's sample rate to give about ten samples (1.0 ms at 10 kHz, 0.4 ms at 25 kHz and above), and the panel shows how many samples it holds. If you type your own value, keep it under about a tenth of the membrane time constant; beyond that the fit starts measuring membrane charging instead of Rₛ.
- Sample rate: accuracy barely changes between about 8 and 25 kHz and improves above that. Below 8 kHz the window reaches its 1.0 ms limit and the estimate is roughly twice as noisy; the panel warns you when this applies.
- Baseline window: the time before step onset used for the pre-step voltage and current (default 5 ms).
- Finding the step in a recorded current: its start and end are where the mean current over the next millisecond differs most from the mean over the previous one, so a current monitor that was low-pass filtered (its edges spread over several samples) or is noisy is handled; an unfiltered step is placed on its exact sample. The step's size is read after the edge has settled, 1 ms after onset. The whole sweep is searched, so a step starting in its first milliseconds is found, and in a biphasic step the first phase is taken. The step should last at least about 2 ms.
- Correct: 'Every current step, relative to the sweep's start' (the default), 'The measured step only', or 'The whole current, holding current included'. Rₛ is measured on one step, but every change of the injected current drops across it, so with every step a multi-step or biphasic protocol is corrected throughout. With the measured step only, the second phase of a biphasic pulse keeps its error. 'Holding current included' removes I × Rₛ everywhere (2 mV for −100 pA at 20 MΩ); use it only when the current channel reads 0 with no current injected. The Data Log names the choice; 'Log per-sweep Rₛ estimates' adds the per-sweep table to its summary.
- The recorded current is read as constant levels between its steps, each level its own mean, so the corrected trace has sharp edges and none of the current's noise. With a protocol (or a step you enter) instead of a recorded current, the whole command is always followed: 'The measured step only' isn't offered, and the choice sets whether its holding level counts.
- Each sweep gets its own Rₛ estimate, so Rₛ drift during a recording is followed. The message after applying, and the Data Log, report the Rₛ actually applied: the mean over the measured sweeps and its range.
- This mode removes the Rₛ drop from a recorded voltage; for a voltage-clamp current, use the Voltage clamp mode (below). A voltage that jumps at once to 90% or more of its final deflection, with no membrane charging after it, looks like a voltage-clamp command (or a pipette without a cell), and the automatic estimate is refused with that explanation.
- A sweep with no clear current step (such as the 0 pA sweep of a family), or whose jump is inside its own noise (a small step), has no Rₛ of its own. It is left out of the mean, and the channel's pooled Rₛ, to which a small step's jump still contributes, is applied to it, scaled by its own step (so nothing changes for 0 pA). The Data Log names these sweeps below the table instead of listing them in it.
- The pooled Rₛ is the weighted least-squares slope of the measured jumps on their current steps, each sweep weighted by the inverse variance of its own jump. It is set to 0 only when it lies within 3 of its standard errors of 0 (on the summed degrees of freedom of the sweeps' fits).
- If amplifier bridge balance was used, the remaining Rₛ may be zero (fully compensated) or negative (over-compensated); both are handled. Only when the pooled Rₛ is itself within the noise is the correction zero. The test for a jump matches 3σ (two-sided p = 0.0027), as Student's t on the noise level of the 5 ms baseline pooled with the fit's own scatter. The short fit window alone has only 2 to 7 degrees of freedom, and on 2 a real 1 mV jump at 5 kHz was set to zero in most sweeps.
- An estimate that can't be Rₛ is refused with an explanation: a jump in the opposite direction to the current step (over-compensation, swapped channels or an artifact), or an Rₛ larger than the input resistance implied by the steady-state response. Use the manual override in those cases.
- Manual override: check 'Use manual Rₛ instead of auto-detect' and enter a value (in MΩ) to apply to every sweep. Use it when automatic estimates are unstable or refused, or when you measured Rₛ another way (such as bridge balance at the amplifier). Zero and negative values are allowed. A manual Rₛ needs no step: with a protocol of ramps or pulse trains, it is applied along the whole command.
- Re-applying replaces the current correction rather than adding to it: with a correction active the button reads 'Re-apply Rₛ Correction', so changing from 50 MΩ to −10 MΩ leaves −10 MΩ applied.
- The Rₛ button in the status bar appears for recordings with two or more channels and whenever a correction is applied; it shows the active value and turns orange while a correction is on. Click it to open the Rₛ panel.
- Remove restores the uncorrected voltage exactly, as long as nothing else has changed the samples since (a filter, baseline correction or scale/offset). After such a change, use ⌘Z to step back instead.
- Saving keeps the correction. While it is still the last change to the samples, the file holds the uncorrected voltage and the correction itself (each sweep's Rₛ step and where it applies), and reopening rebuilds the corrected trace exactly, so Re-apply and Remove work as before saving; the file stays its usual size. After a later change, the corrected samples are saved as they are and the Rₛ button in the status bar records the correction.
Typical Rₛ values: 5–20 MΩ for whole-cell patch, 30–100 MΩ for perforated patch, 50–200 MΩ for sharp electrodes. Rₛ is only part of the input resistance (steady-state deflection divided by current) and always smaller than it. If a computed Rₛ looks implausible, check the channel units first.
Voltage Clamp
In voltage clamp, the current flows through whatever Rₛ the amplifier left uncompensated, so the membrane sits at Vₘ = Vcmd − I·Rₛ instead of at the command, and the membrane capacitance charges through Rₛ, which filters fast currents with a time constant of Rₛ·Cₘ. A 500 pA current through 20 MΩ moves the membrane 10 mV toward the current's reversal potential, and at 30 pF an EPSC's 0.3 ms rise slows to about 0.7 ms. The Voltage clamp mode corrects the recorded current for both, point by point, as Traynelis (1998) describes:
- Vₘ = Vcmd − I·Rₛ; the ionic current Iₘ = I − Cₘ·dVₘ/dt, which removes the Rₛ·Cₘ filtering; and Icorr = Iₘ · (Vcmd − Erev) / (Vₘ − Erev), the current the cell would have passed at the command potential. 'Fraction to correct' (default 100%) applies part of it, as Traynelis's program does.
- Rₛ and Cₘ, Measure automatically (the default): from a voltage-step test pulse in the same sweeps (a step of 0.5 to 25 mV, 2 ms or longer, that returns to the level before it), fitted as Membrane Test fits it. Recorded with the same amplifier settings as the data, the pulse gives the Rₛ the amplifier left uncompensated, which is exactly what needs correcting, so no compensation % is needed. Rₘ comes with it. By default the sweeps' pulses are averaged first, as Membrane Test does; 'Use each sweep's own test pulse' follows an Rₛ that drifts. The Data Log warns when Rₛ changes by more than 20% across the sweeps.
- Other sources: 'Measure in a window I set' (the test pulse that starts in that window), 'From the last Membrane Test' (run E-Phys Tools → Membrane Test… on a membrane-test recording made with the same settings, then come back), 'From the amplifier's telegraphs' (the whole-cell Rₛ and Cₘ dials an ABF file stores) and 'Values I enter'. Only when the Rₛ is a total, the telegraphed dial or a dial reading you type, does the panel ask for the online Rₛ compensation % that was set on the amplifier, and it corrects the remainder.
- With whole-cell capacitance compensation on, the amplifier cancels the test pulse's transient, so there is nothing to measure. When the file's telegraphs say compensation was on, Measure automatically says so and uses the telegraphed values (enter the compensation %). When a pulse shows no transient that can be fitted, the panel says so plainly and asks for another source. ABF 1 files telegraph Cₘ but not Rₛ: 'Values I enter' starts with the telegraphed Cₘ filled in. Measure shows what will be used, and where it came from, before you apply.
- Vcmd: the file's protocol (an ABF's epochs), else a recorded command or Vₘ channel (read as its constant levels, so its noise isn't differentiated), else a holding potential you enter. The panel says which.
- Erev: typed, or 'Erev from the last IV Plot' (see IV Plot below). About 0 mV suits AMPA and NMDA receptor currents. The Data Log reports how sensitive the result is to it, computed from your data, for example 'a 5 mV error in Erev changes the corrected peak by about 1.1%'. When the command is within 5 mV of Erev the correction is refused: there is too little driving force for it to mean anything. Samples whose Vₘ comes within 10% of the command's distance from Erev, or crosses it, are left unscaled and listed in the Data Log, and a command within 5 mV of Erev gets only the capacitive correction.
- Noise: undoing the Rₛ·Cₘ filtering takes the derivative of Vₘ, which amplifies high-frequency noise in proportion to frequency and Rₛ·Cₘ. So the derivative is taken through a zero-phase low-pass (Gaussian). With 'Choose the dV/dt low-pass automatically' on (the default) it is the highest that at most doubles the sample-to-sample noise, starting from a quarter of the sample rate or the amplifier's filter; a lower one is quieter but slows fast rises, and spreads sharp edges slightly both ways in time. The Data Log gives the low-pass used and how much the noise grew. For a very noisy recording, low-pass filter it first (Filter/Smoothing), or average sweeps.
- 'Correct the leak separately (uses Rₘ)', on by default: with Rₘ known (from the test pulse, a Membrane Test, or entered), the resting leak is moved to the command potential on its own and only the rest of the current is rescaled with Erev. Traynelis's original rescales the whole current, holding current included, as one conductance; with Rₘ = 300 MΩ that left EPSCs 1.5 to 8% small (amplitude and charge) at Rₛ 5 to 25 MΩ in simulations, which the separate leak removes. Off, the Data Log says how much the holding current was rescaled.
- Accuracy, on simulated single-compartment cells (Rₛ 5 to 25 MΩ, Cₘ 10 to 50 pF, Rₘ 300 MΩ, a 20 kHz recording behind a 5 kHz filter, 2 pA noise, an AMPA-like EPSC with 0.2 ms rise and 3 ms decay at −70 mV, Rₛ and Cₘ measured from a −5 mV test pulse): the test pulse gave Rₛ and Cₘ within 2%; the corrected EPSC's amplitude came within 2% and its charge within 0.3% of the true current, where the raw recording was 5 to 44% small in amplitude and 3 to 15% in charge, and its 10–90% rise time within 6 to 34% (raw: 10 to 260% slow), the remainder being the low-pass's price for keeping the noise within 2×. Only the 5 MΩ, 10 pF cell's test pulse couldn't be measured: its transient (0.05 ms) lasts one sample at 20 kHz, and the panel says so. Without noise the amplitude and charge come within 0.1%. With the leak not separated and no low-pass, the result matches Keine's MATLAB implementation of Traynelis's program (Zenodo 2538615) in charge to 0.05%.
- Assumptions and limits: a single-compartment cell (space-clamp errors in dendrites can't be fixed offline), and a current channel whose zero is right (Vₘ uses the absolute current). The driving-force step treats the conductance as linear, so it is exact for ligand-gated currents but only approximate for voltage-gated currents, whose gating also depends on the true Vₘ: on a simulated delayed-rectifier K⁺ family at Rₛ 15 MΩ, steady-state currents 13 to 48% small became 9 to 35% small after correction, and the activation kinetics stayed distorted. For voltage-gated currents, correct the IV Plot's voltage axis instead (below), which is exact at steady state.
- Long recordings are corrected in the background; the panel shows a spinner and the window stays usable. The status bar's Rₛ button reads 'Rₛ = … MΩ (VC)' while a voltage-clamp correction stands. Saving keeps it as a recipe (each sweep's Rₛ and Cₘ, Erev, the fraction, the low-pass, the command source) with the uncorrected current, and reopening recomputes the same corrected trace.
- The AI Assistant can apply it too (apply_vc_rs_correction), with the same choices.
Graph Tools
Graph Tools work on the graph whose window they were opened from and open the result in a new window; the original is unchanged. Each sweep is processed at its own sample rate and length, so a recording whose channels were sampled at different rates stays correctly timed. If a tool can't run (for example, the graph already has the requested rate, or it is an X-Y graph with its own X values), the sheet stays open and says why.
- Decimate… reduces the point count by a whole-number factor N. By default each sweep is filtered against aliasing and every Nth point kept (described below). With 'Average Y values within each bin' on, each new point is the mean of N samples, placed at the center of its bin, optionally with a second graph of the SD or SEM of each bin for error bars; a partial bin at the end of a sweep is dropped. Averaging is only a weak anti-alias filter: content just above the new Nyquist frequency is only about 4 dB down (about 10 dB at 1.5 times it) and folds back into the result, so turn averaging off when the trace has content there. Off, each sweep is low-pass filtered (zero-phase, at 80% of the new Nyquist frequency) and every Nth point kept, including the last one when it falls on that grid, so nothing aliases. This gives the same points as Resample to the same rate.
- Interpolate… inserts 1 or more new samples between each pair: linear by default (never overshoots, but flattens a peak between samples), or band-limited (a windowed-sinc kernel), which recovers such a peak at the cost of ringing near steps and clipped samples. Batch processing, protocols and the AI Assistant offer the same choice.
- Resample… converts every sweep to one new sample rate, with anti-alias filtering when lowering it and windowed-sinc reconstruction, accurate to about 0.02% for content up to 30% of the source rate. A whole-number reduction (such as 20 kHz to 2 kHz) keeps every Nth filtered sample instead, as Decimate does. Each sweep keeps its duration. Near the source's Nyquist frequency, and within about 8 samples of each end of a sweep, the reconstruction is less exact.
- Results open at the source's true time: a recording whose first sample isn't at 0 keeps that shift, and averaged Decimate points sit at their bin centers. They also keep the source window's Set X = 0 shift, cursors A and B and X zoom (see Cursors).
- Integrate: the running integral (trapezoidal rule) of each visible sweep, over the full sweep or between cursors A and B. The Y unit becomes unit·s (such as mV·s). Between cursors, the final value equals Measure's Area for the same window. A missing sample stays missing in the result, and the intervals on either side of it add nothing to the total. On X-Y data the points are taken in increasing X (sorted first), and points with a missing X are left out.
- Between cursors, a sweep that has no sample between them is left out of the result and named; when no sweep has one, nothing is computed. On a graph whose sweeps have different sample rates, the result's time axis starts at the first sweep's first sample in the window, so another sweep can be shown up to one of its sample intervals early.
- Differentiate: the first derivative of each visible sweep, over the same choice of range. The Y unit becomes unit/s (such as mV/s), and on X-Y data unit per X unit, labeled d/dX (an I-V curve's slope, in pA/mV). 'Pre-smooth (pts)' (None, 3, 5, 9, 15, 25) applies a boxcar smooth first (Protocols and the AI Assistant accept any count; an even one runs one point longer, and their report says so), recommended for noisy traces because differentiating amplifies noise. The whole sweep is smoothed before a cursor window is cut, so the window's ends average real samples on both sides, and near the sweep's own ends the average narrows symmetrically, which leaves a straight line's slope intact. The derivative is the three-point difference over the actual X spacing (exact for a parabola, as numpy.gradient computes it), so unevenly spaced X-Y data are differentiated as accurately as evenly sampled sweeps.
The derivative of a raw voltage trace sampled at 25 kHz shows large values (thousands of mV/s). This is correct. Pre-smoothing (9–25 points) brings out features such as action potential upstrokes.
Signal Processing
Signal Processing operations open the result in a new graph window and leave the original unchanged. They're in the inspector's Signal category, and the most common ones also have keyboard shortcuts.
Average Sweeps (⇧⌘A)
Averages the visible sweeps into one sweep per group (so a voltage + current recording gives one average of each) and opens the result in a new window. The sweep name gives the number of sweeps behind each sample, such as 'Group 1 avg (n=30)', or its range, such as 'n=24–30', where sweeps have unequal lengths or gaps (after Align at Peak, for example); with a shaded band it also names the spread, such as '± SEM', so the legend says what the shading is. A group whose sweeps are in different units (mV with pA) or have different X values is refused with the reason. Sweeps at different sample rates are interpolated linearly onto the group's highest rate, never past a sweep's own last sample, and the Data Log says so. Click Average Visible Sweeps in the Average panel, or press ⇧⌘A to run it right away without opening the inspector.
The Average panel has more choices, which ignore which sweeps are visible and give one average per recording channel. On a multi-channel recording, sweep numbers here count trials within each channel, as Review sweeps does: All Odd on a voltage + current file averages trials 1, 3, 5… of the voltage channel and, separately, the same trials of the current channel:
- All, All Odd, All Even: every sweep, or sweeps 1, 3, 5… or 2, 4, 6….
- Every N: each run of N consecutive sweeps separately (N = 3 on 9 sweeps gives averages of 1–3, 4–6 and 7–9).
- Every Nth: sweeps N, 2N, 3N….
- Average Custom: the sweeps you list, such as '3, 5-7, 33-41'.
Variability (in the Average panel, and used by ⇧⌘A too) shows how much the sweeps spread around each average: None, SD, SEM, or a Confidence interval (95% unless you type another level). Each is worked out at every sample from the sweeps that have a value there, so where sweeps have different lengths or gaps each sample uses its own n:
- SD: the sample standard deviation, with n − 1 in the denominator.
- SEM: SD/√n.
- Confidence interval: mean ± t(n − 1)·SEM. It is pointwise: each sample's interval covers the true mean at that sample 95% of the time, but the band as a whole is not a simultaneous band for the entire trace.
- Samples with fewer than 2 sweeps get no error (the band has a gap there).
Show it as a Shaded band around the mean, in the mean's color, or as Mean + and − sweeps: two extra sweeps, such as 'Mean + SEM' and 'Mean − SEM', drawn dashed and thinner in the mean's color, in the same panel. The band is saved in a .@graph file, drawn in every figure export (PDF, SVG, PNG and the other image formats), kept by Export Visible and Scale / Offset, and hidden if you change the mean in any other way. The sweeps are ordinary sweeps, so every file format, export and measurement sees them. The Data Log states the measure and the n behind each average.
Normalize (⇧⌘R)
Divides each sweep by a reference value and opens the dimensionless result in a new window. Two modes:
- Per sweep: each sweep is divided by its own value, so differences in amplitude are lost. Choose its largest absolute peak (the default), positive peak, negative peak, its value at cursor A, or a number you enter. Handy for comparing shapes, such as AP waveforms across conditions.
- Per sweep, relative to a baseline window: Percent of baseline (100 × value / baseline mean, its own baseline reading 100%, the way synaptic plasticity is plotted; a negative baseline, such as a field EPSP's slope, still reads +100%); ΔF/F₀ ((F − F₀) / F₀, with F₀ the baseline mean, for fluorescence traces that arrive as sweeps; F₀ must be positive, so subtract background first); and z-score ((value − mean) / SD of the baseline window, SD with n − 1; of the whole sweep without a window). The first two need a baseline window. Peak points and polarity don't apply to them.
- Per sweep, Min–max: each sweep scaled from 0 (its smallest value) to 1 (its largest).
- Global (all sweeps): the sweeps are divided by the largest peak among them (absolute by default, positive, or negative), so relative amplitudes are kept and only the largest sweep reaches ±1. Handy when amplitude differences matter, as in dose-response or run-down. Each unit is scaled on its own, so a current sweep is never divided by a voltage peak.
Measure from: a baseline window (the default, the first 5 ms of the sweep to start with) or zero. With a baseline, each sweep's own mean over the window is subtracted first and the trace becomes (value − baseline) / (reference − baseline), so a response is scaled by its amplitude, not by where it sits. Measured from zero, an action potential from −70 mV with an afterhyperpolarization to −78 mV has its 'largest peak' at −78 and comes out upside down, and an EPSC on a holding current is divided by whatever sample is furthest from 0; the panel warns when the sweeps sit far from zero.
Peak = mean of N points: the reference is the mean of N samples centered on the peak (or on cursor A). With one point, the single most extreme sample, noise biases the reference outward: a 50 pA EPSC in 5 pA noise comes out at 0.85 rather than 1. A few points spanning the top of the peak reduce that.
Keep polarity (on by default): each sweep is divided by the size of its reference, so a negative-going response stays negative and its peak becomes −1. Turned off, it is divided by the signed reference and a negative-going trace is turned upside down (peak +1). Protocols keep the setting they were saved with.
A sweep with no reference (no positive peak above the baseline, an empty baseline window, cursor A missing) is left unchanged and named in the message; the Data Log lists each sweep's reference. Fit curves and AP markers are not normalized. By default it uses the visible sweeps of every group. Values are taken as the graph shows them, with junction-potential correction if it's on. ⇧⌘R opens this panel in the inspector, where you choose the options and click Normalize → New Window.
Align Sweeps at Peak (⌥⌘K)
Shifts each visible sweep so its main peak falls at the same time, X = 0 in the new window (Set X = 0 moves it like any other), for overlaying action potentials, EPSPs or other stereotyped events to compare their shape. Set the options below in the Align at Peak panel and click Align at Peak, or press ⌥⌘K to align on the largest absolute peak immediately, without opening the inspector. Each sweep moves by its own amount, so the new window doesn't take the original's cursors, X shift or zoom.
- Peak direction: Largest absolute peak (default), Positive peak or Negative peak. With the largest absolute peak, the polarity is chosen once for all sweeps (from their median excursion above and below rest), so a biphasic event aligns on the same phase in every sweep instead of on its peak in some and its trough in others.
- Search for the peak between cursors A and B only: otherwise the whole sweep is searched, and a stimulus artifact, a spontaneous event or, in pure noise, the largest noise sample becomes the 'peak'.
- Align on: The peak (default) or Half-way up the rising phase, which is the first sample before the peak's top that is half-way from the resting level (the median before the peak in the search window) to the peak. The single peak sample moves with the noise, and lining up noise maxima inflates an average of the aligned sweeps (500 aligned 20 pA EPSCs averaged to 23.8 pA); the steep middle of the rise barely moves. Either way, sweeps are shifted by whole samples.
- Fit curves, AP markers and flat sweeps are left out, and the message and Data Log say so. X-Y data have no time axis and are refused.
- By default every sample is kept: each sweep is shifted, not cut, and the result is as long as the longest lead-in plus the longest tail. This works at any time scale, from a millisecond spike to an event lasting minutes.
- Trim the lead-in before each peak: keeps only the time you enter in 'Keep before the peak (ms)' ("5 ms", "2 s" and "1 min" are all accepted) and drops earlier samples. The tail is never cut.
- Where a shifted sweep has no data, it has a gap, which Measure and the other tools skip.
- Sweeps are shifted by whole samples, so each peak lands on the nearest sample to the common time, not exactly on it. For brief events at low sample rates this blurs an average of the aligned sweeps: for a 0.25 ms action potential at 10 kHz, the average's peak reads about 3% low and its half-width about 5% wide; at 50 kHz the effect is under 0.3%. For brief events recorded below about 20 kHz, raise the rate first (Graph Tools → Interpolate, band-limited) and then align.
Power Spectral Density / FFT (⌥⌘P)
Computes the power spectral density (PSD) of each visible sweep by Welch's method (Hann-windowed segments, averaged) and opens it in a new graph window with frequency (Hz) on the X axis. In the PSD / FFT panel, set the options below and click Compute PSD / FFT; ⌥⌘P runs it with default settings immediately.
The spectrum is computed in the background, so @Graph stays responsive on a long recording. A progress bar shows in the panel (for ⌥⌘P, at the bottom of the graph) with a Cancel button; canceling, or closing the graph window, stops it, and no window opens and nothing is added to the Data Log.
Settings
- Segment size (Welch FFT window): Auto, or a fixed size from 1024 points up to the length of the shortest sweep. Each choice shows its frequency resolution (Hz/bin). Auto uses the largest power of 2 up to a quarter of the shortest sweep, so at least 7 overlapping segments are averaged (such as 131,072 points, about 0.19 Hz, for a 30 s sweep at 25 kHz), but never below 64 points, so a sweep shorter than 256 samples has fewer segments. Larger segments give finer resolution but a noisier spectrum. A sweep shorter than the smallest segment (64 points) is one segment of its own length, with the Hann window and its normalization at that length, zero-padded to 64 points (as SciPy's welch does when the data are shorter than a segment). Sizes are powers of 2, so the samples after a sweep's last whole segment are left out (18% of a 10,000-sample sweep at the largest size); the Data Log says how many.
- Segments overlap by 50%, and each segment's mean is removed first so the resting potential doesn't swamp the low frequencies. 'Remove from each segment: Linear trend' removes each segment's least-squares straight line instead, so a slow drift (5 mV across a sweep, say) doesn't raise the lowest few bins.
- The whole spectrum is computed in double precision (it is stored at single precision afterwards), so bins far below the peak, and the lowest bins of a trace on a large offset, are as reliable as the rest.
- Amplitude (√ of power): shows the square root, the amplitude spectral density in units/√Hz (such as µV/√Hz), the way amplifier and electrode noise is usually quoted; with Normalize off, the RMS amplitude spectrum in units. In dB the two read the same, so it applies to linear values only.
- Confidence interval: shades each spectrum's pointwise interval at the level typed (95% by default), from the χ² distribution on the estimate's equivalent degrees of freedom: 2 per segment (per taper with multitaper), less for overlapping segments, by Welch's (1967) formula including the overlap between different tapers; half at 0 Hz and Nyquist. Seven half-overlapping Hann segments give about 13.4 degrees of freedom. In simulated white noise the intervals covered the true spectrum 95.0–95.1% of the time for 1–20 segments, with or without multitaper. The interval is for each frequency on its own, not a band for the whole spectrum at once. The Data Log gives the degrees of freedom.
- Normalize to PSD (on by default): gives true power density in units²/Hz (such as mV²/Hz), which doesn't depend on the sample rate or segment size. Off gives the power spectrum in units², where a sinusoid of amplitude a peaks at a²/2 (its mean-square power) when its frequency falls on a bin; half a bin away the Hann window's peak reads up to 1.4 dB lower, so sum the bins around a peak for its exact power. Use it for sizing a line-noise or stimulus peak. These match the 'density' and 'spectrum' scalings of Welch's method in SciPy and MATLAB.
- Y scale: Linear; Logarithmic axis, which keeps the power values linear and draws them on a log axis, the way to see the wide range of a noise spectrum; or dB values (10·log₁₀ of the power), for export. A bin with no power is shown at a floor set by the spectrum's own peak (300 dB below it), so a trace in A reads like the same trace in pA. Don't average dB spectra: the mean of dB values is a mean of logarithms and reads low (2.4 dB for single-segment spectra of noise, 0.3 dB with 7 segments); Average says so in the Data Log.
- Fit curves and AP markers are left out, so a short fit sweep can't shrink everyone's segment.
- Max frequency: limits the X axis. At 0, the spectrum runs up to the Nyquist frequency, and the window opens zoomed to where the power is (to three significant figures, so a 0.2 Hz rhythm opens on 0–0.381 Hz).
Interpreting the output
Whole-cell voltage recordings typically show a 1/f² (brown noise) spectrum: power falls steeply with frequency. Typical values for a patched neuron at rest:
- 1–5 Hz: 0.1–1 mV²/Hz (slow membrane potential fluctuations, drift)
- 10–50 Hz: 0.001–0.1 mV²/Hz (synaptic noise, channel noise)
- 100–500 Hz: 10⁻⁵ to 10⁻³ mV²/Hz (amplifier + pipette noise floor)
- Single-sweep PSDs are inherently noisy. The log-log slope of −2 is only apparent when averaging many sweeps or using a longer recording.
For a smoother spectrum, average the PSD sweeps (linear power, not dB values): press ⇧⌘A in the PSD window. To compare spectra from several files, use Combine Open Graphs.
Multitaper
An alternative to the single Hann window above, useful when the spectrum still looks noisy after averaging every available segment (a short recording, or a large segment size chosen for fine resolution). Turn on Multitaper and each segment is analyzed with several tapers instead of one; their spectra are averaged before Welch's own segment averaging runs, trading some frequency resolution for a further reduction in noise.
- Time-bandwidth product (NW): sets how many tapers are used (K = 2 × NW − 1, shown next to the field) and how much the frequency resolution widens (roughly 2 × NW divided by the segment duration). NW runs from 1 to 10. Start at NW = 3 (5 tapers), the standard default for LFP/EEG-scale work.
- Lower NW (2–2.5, fewer tapers): sharper resolution, for when nearby spectral features need to stay distinguishable, or the segment is already long enough that Welch's own averaging is doing most of the noise reduction.
- Higher NW (4–6, more tapers): more smoothing, for short segments, noisy signals, or when only the power summed across a broad band matters rather than its fine structure.
- The info button next to the NW field shows the resulting resolution in Hz for the current segment size.
- Protocols, Batch Processing and the AI Assistant offer the same Multitaper option and NW.
@Graph builds the tapers from a closed-form formula (sine tapers, Riedel & Sidorenko 1995) rather than the Slepian/DPSS tapers of Thomson's original method. They optimize different things: Slepian tapers keep the most energy inside the band ±W (least leakage from far away), while sine tapers minimize the local bias, the smearing of the spectrum's shape within the band, and leak a little more from far away. For smooth spectra the two give nearly the same result, and the closed form avoids an eigendecomposition over segments that can run past half a million points.
Histogram (⌃⌘H)
Graph Utilities → Convert to Histogram… bins the amplitude values of the graph's sweeps and opens the result in a histogram window. Handy for looking at the distribution of membrane potential or noise. With several groups, choose the selected group or all groups. Fit curves and AP markers are left out: they aren't recordings.
- Set either the bin width or the bin count, and the histogram is built from the one you set last. A width gives bins with edges at whole multiples of it (a width of 5 mV gives edges at …, −70, −65, …); a count gives exactly that many equal bins from the smallest value to the largest. The starting width (about 30 bins) and the range shown come from the group being binned, and follow when you choose another group, until you type a width or count yourself.
- Each bin holds values from its lower edge up to, but not including, its upper edge, as R's hist(right = FALSE) makes them (R's default closes bins on the right instead). With a width, a largest value lying exactly on an edge gets a bin of its own, so integers 0 to 10 at width 1 give eleven bars of 1 (NumPy puts 10 in with 9). With a count, the last bin also holds values equal to its upper edge, so the largest value is counted.
- Values are compared with the edges at the precision they are recorded in (32 bits), so data on a decimal grid, such as 0.1 mV steps, bin evenly at any decimal width.
- Values: optionally bin only values between two limits (the bins then span the limits, and values outside are counted and reported), and only samples between the graph's cursors. Limits keep one outlier from squeezing the rest into a few bars.
- When the recording's values come in fixed steps (a digitizer's resolution), the setup form says so and offers the nearest width that is a multiple of the step, so every bar spans the same number of levels rather than alternately 16 and 17. The starting width is such a multiple.
- With All groups and a bin count, "Same bins for every group" (on by default) bins every group over the range of all of them, so their bars and percentages line up. A width gives every group the same edges anyway.
- Each histogram shows n, the values binned, and how many missing values were skipped or fell outside the limits. Frequency (%) is of n.
- Y axis: Count, Frequency (%), or Density (count ÷ (n × bin width), per unit of X, so the bars' areas sum to 1). Density is the one to use for comparing groups of different size or histograms with different bin widths, as R's hist(freq = FALSE) and matplotlib's density = True plot it. Log axis (in the histogram window) shows the counts on a logarithmic scale, for heavy-tailed data such as event amplitudes or intervals; empty bins have no bar on it. Copy as Table includes the density.
- Curve (in the histogram window): Normal draws a normal distribution with the binned values' mean and SD; Kernel density draws a Gaussian kernel density estimate with Silverman's bandwidth (0.9 · min(SD, IQR/1.34) · n^(−1/5), R's default bw.nrd0), computed from the values counted in 4,096 fine bins as R's density() bins them. Either is scaled to the Y axis (× n × bin width for counts), and its parameters are shown under the chart. Read them as a guide to the shape, not as a test of whether the data are normal. The AI Assistant's histogram can open with any Y axis, the log axis and either curve.
- The values are those the graph shows: junction-potential corrected on a voltage panel. The X axis carries the panel's own Y title (mV, pA and so on), and the Y axis shows Count or Frequency (%).
- Copy as Table copies one row per bin (center, edges, count, percentage) as plain tab-separated text, with as many decimals as the bin width needs.
- Cumulative Probability, in the same menu, plots the cumulative distribution (0 to 1) instead, of the same values: as the graph shows them (junction-potential corrected), without fit curves or AP markers.
For inter-event interval or dwell-time histograms, copy the event times from the Data Log into a Spreadsheet and use Data to Chart.
Other Graph Utilities
- Channel Gain… sets the gain of the amplifier connected to a channel's input when the file doesn't record it. Type the gain as the amplifier states it (0.5 mV/pA, 10 mV/mV), the unit to show and an optional offset. The channel's values and unit change as if it had been recorded that way, so analyses and exports use them. Undo reverts it, and Remove Gain gives the input back. For HEKA files, 'Use for every series of this file' remembers the gain on this Mac for that channel of that file; Forget This File's Gains clears it. It is also in Modify → Data Transform, under Scale / Offset.
- Copy Style / Paste Style (⌥⌘C / ⌥⌘V, the Graph Utilities menu, or right-click on the plot) copies all visual settings (colors, line widths, fonts, axes) from one graph to another, so your figures match.
- Combine Open Graphs overlays the visible sweeps of all open graph windows in one window, keeping their colors, sample rates and lengths. Each graph's groups are kept; groups that share a unit are pooled, one from each graph, so two voltage + current recordings give one voltage and one current group, while a paired recording's two voltage channels stay separate.
- Combine Selected Graphs… does the same for the windows you choose, in the order you set.
- Concatenate Open Graphs joins open graphs end to end in time, such as a recording split across files: group by group and episode by episode, in window order. The pieces joined into one sweep must have the same sample rate and unit; if not, nothing is joined and the message names the mismatch (resample first, or check the channel order). A graph with fewer episodes leaves a gap as long as its own sweeps.
- Delete Sweeps… lists all sweeps and groups; check the ones to remove (such as sweeps with artifacts) and click Delete Selected. The result opens in a new window.
- Swap X and Y Axes exchanges the X and Y data, for example to show an I(V) curve as V(I).
- Continuous to Episodic… cuts a long continuous sweep into equal episodes (length in ms, s or samples) in a new window. A channel recorded at a different rate is cut into episodes of the same duration, so episode N covers the same time on every channel. The last episode keeps whatever remains.
- Episodic to Continuous joins each group's sweeps into one continuous trace, for example for LFP or EEG saved as episodes. The sweeps of a group must share a sample rate.
- Decimate, Interpolate, Resample: see Modifying Graphs → Graph Tools.
- VI Plot, IV Plot, Firing Properties, Sag Analysis and Membrane Test are in the E-Phys Tools menu.
References
Riedel KS & Sidorenko A (1995). Minimum bias multiple taper spectral estimation. IEEE Transactions on Signal Processing, 43(1):188–195. https://doi.org/10.1109/78.365298 (the Multitaper tapers above).
Traynelis SF (1998). Software-based correction of single compartment series resistance errors. Journal of Neuroscience Methods, 86(1):25–34. https://doi.org/10.1016/S0165-0270(98)00140-X (voltage-clamp Rₛ correction above).
Keine C (2019). Offline series resistance correction, v1.1 (MATLAB). Zenodo. https://doi.org/10.5281/zenodo.2538615 (the reference implementation the voltage-clamp correction was checked against).
Measuring & Analysis
The Measure, Peaks and Curve Fitting tabs of the inspector measure the sweeps of the front graph and write their results to the Data Log. Press Return (↩) in any number field of an analysis panel (including the cursor A/B fields) to re-run the panel's main action (Measure, Run Peak Analysis, Fit, Detect APs and so on).
The range choice in Measure, Peaks, Curve Fitting, AP Detection, Synapse Detection and Graph Tools (Integrate and Differentiate) is linked to the cursors: choosing 'Between cursors A – B' shows the cursors and 'Full sweep' hides them, and turning the cursors on or off with ⌘K switches the choice to match. A panel opens with the choice that matches the cursors, so opening one never hides cursors you placed. Measure, Peaks and Curve Fitting use the visible sweeps of the selected group unless you change their Scope. AP Detection uses the visible voltage sweeps of every group, Synapse Detection the selected group's visible sweeps, and Graph Tools the visible sweeps of every group.
Measure Panel (⇧⌘M)
Measures each sweep over the full sweep or between cursors A and B. Check the metrics you want, choose the Scope and click Measure:
- Average amplitude: the mean sample value.
- Area: the integral of the waveform (amplitude × time) by the trapezoidal rule, from the sample nearest cursor A to the sample nearest cursor B when measuring between cursors. It equals the last value of Integrate over the same window.
- Maximum and Minimum, each with an optional Location on the X axis as shown (so it follows Set X = 0).
- Number of points, Variance (n − 1), Standard deviation and Std error of mean. A single point has no spread: its variance, SD and SEM read N/A.
- Gaps (missing samples, such as the edges Align at Peak leaves, or a missing Y value in X-Y data) are skipped: every statistic uses the real samples, and the area is not integrated across a gap.
Peaks Panel: Peak Detection (⇧⌘D)
The Peaks panel finds peaks in each sweep and measures each one. Set the options below and click Run Peak Analysis:
- Direction: Auto (the default: whichever direction swings further from the reference level in each sweep, meaning the baseline window's mean, or the resting level without one), Positive or Negative.
- Which peaks: Maximum (the default: the largest peak in each sweep, with no threshold; the middle of a flat top), First (the first peak beyond the threshold) or All (every peak beyond it).
- Threshold: Absolute (a level in the trace's unit) or Relative % (that percentage of the way from the reference level to the largest peak). With a baseline subtracted, an absolute threshold is a signed distance from the baseline: type it negative for downward peaks, or check 'Threshold is a distance in the peak's direction' to have it read toward the peaks whatever its sign. The Data Log warns when the threshold is on the wrong side of the reference to separate anything.
- Separate peaks by (First and All; default 50% of threshold): a peak counts only if the trace falls back on both sides, before reaching a larger value, by this share of the threshold's distance from the reference level (a prominence, as in SciPy's find_peaks). Noise around the threshold then doesn't split one event into several peaks, and two events whose dip stays beyond the threshold are still told apart. Min. spacing (default 0, off) keeps only the larger of two peaks closer than that. A peak on the first or last sample of the window (an event cut by its edge) is not reported, and a sweep with no peak gets a 'no peak' row, so the rows line up with the sweeps.
- 'Subtract baseline before threshold': set the window with 'Baseline from … to …' (default: the first 10% of the sweep). The window is shaded on the graph while the panel is open, and each sweep's mean over it is subtracted. The Data Log records the window and warns if a detected peak falls inside it. A sweep with no data in the window gives N/A amplitudes (and no peaks for an absolute threshold) rather than measuring from zero.
- Output measurements: Peak (Amplitude when a baseline is subtracted) and Location are on by default. You can add Rise time (10–90% by default), Width at (50%, the half-width), Decay time (100–50%), Onset at (5% of the rise, timed from cursor A when detecting between cursors, otherwise from the start of the sweep), Inter-event interval (IEI, with Which peaks set to All), Area (Charge on a current) and Max rise and decay slopes. Location follows Set X = 0.
- Rise, width, decay and onset levels are percentages of the peak's height above a reference level: the baseline if one is subtracted, otherwise the resting level, not zero. A spike from −70 mV therefore has its 50% level halfway up the spike, not halfway to 0 mV. The resting level is the median of the first or the last 5% of the window, whichever lies on the resting side of the peak. If the two ends differ by more than a quarter of the peak (the window starts or ends during a response), the Data Log suggests a baseline window. Without a baseline, the Peak column reports the raw peak value.
- Each level is timed where the trace crosses it, interpolated between samples (as Clampfit, Stimfit and eFEL do), so the kinetics aren't rounded to whole samples. A phase only a sample or two long still reads long, so sample fast events densely.
- Junction potential: on a voltage trace, peaks are measured on the corrected values when JP correction is on, like the Measure panel, and the Data Log says whether it was applied. Amplitudes from a baseline and all the kinetics are differences, so the correction doesn't change them.
- Area: the trace minus the reference level, integrated by the trapezoid rule from where the trace last crosses that level before the peak to where it first returns after it. On a current (voltage clamp) it is reported as charge in pC; on any other trace as an area in the trace's unit × s (× the X unit on X-Y data). It reads N/A when the trace doesn't return to the level before the neighboring peak or the window's edge. Max rise and decay slopes are the steepest dV/dt (or dI/dt) on each side of the peak, per ms, from central differences as NumPy's gradient computes them.
- Noise and drift (optional, off by default): on a noisy trace the most extreme sample sits on a noise peak, so the peak reads high and the kinetics read off (an EPSC at 20 times the noise SD: amplitude +8%, 10–90% rise +76%). 'Peak = mean of N points' takes the peak as the mean of N samples centered on it (Stimfit's convention). 'Smooth kinetics over N points' measures rise, width, decay, onset and slopes on a copy smoothed by an N-sample moving average; it lengthens a rise shorter than about 3 times its window. 'Local baseline for each peak' measures each peak from the mean of a short stretch just before it (Mean over … ending … before the peak), for a drifting baseline; detection still uses the sweep's baseline. The Data Log states which options were used, and with them off warns when peaks are under 30 times the baseline window's noise SD.
- X-Y data (a spectrum, an I-V curve, a dose-response) is measured along its X axis, as Measure and the fits are: the cursors, the baseline window and Location are X values, and rise, width, decay, onset and the interval between peaks are spans in the X unit (a PSD peak's width in Hz, say). Points are taken in order of increasing X. If a sweep's X runs back and forth (a ramp up and back, a phase plot), its two branches are merged, and the Data Log warns.
Curve Fitting
The Curve Fitting tab fits each sweep in Scope over the Fit range (Full sweep or Between cursors A – B) and draws each fit as a dashed curve. Its top part, Fit type, offers:
- Linear: a straight line (y = ax + b), with slope, intercept and R².
- Polynomial: degree 1–6 (2 by default), fitted in a numerically stable way so high degrees and short cursor windows work reliably.
- Exponential: Single, Double or Triple terms (A·e^(−t/τ) + C and so on). Starting values are estimated from the data, so fits converge across the usual range of time constants (0.5 ms AMPA to 200 ms NMDA/GABA-B).
- Power: y = A · x^B.
Below it, choose E-phys preset or Formula, a Weighting and a Fit range, and click Fit:
- E-phys preset: mono-, bi- and tri-exponential decay, mono-exponential rise, mono-exponential plus linear, alpha function, Boltzmann, Hill dose-response and dose-inhibition, Hill, Gaussian, double Gaussian, Lorentzian, and a line or parabola through zero. Each preset shows its equation.
- Alpha function: A·(t/τ)·e^(1−t/τ) + C, a synaptic event starting at t = 0: on a sweep, the start of the fit window, so place cursor A at the event's onset; on X-Y data, X = 0, so subtract the onset from X first if needed. A is the peak amplitude and τ the time to peak. Clampfit's A·t·e^(−t/τ) + C is the same curve with A multiplied by e/τ.
- Formula: any expression in lowercase x (X and t are read as parameters). Only pi (or π) and lowercase e (Euler's number) are constants; every other name, including tau and E, is a fitted parameter. The panel lists the fitted names as you type, and the Data Log records any constants with the fit. A formula that can't be fitted is refused with the reason: the first piece that can't be read, a formula without x, or a parameter named like a function ("a*exp" with its brackets left out).
- Formula operators and functions: + − * / ^ (power) and % (remainder), and the pasted signs − × · and ÷; write every multiplication (2*x, not 2x); exp, exp2, expm1, log or ln (both natural log), log10, log2, log1p, sqrt, cbrt, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh, erf, erfc, gamma, lgamma, abs, sign, floor, ceil, round and trunc; and with two values pow, atan2, hypot, min, max and mod (also fmod). Function names may be written in any case. ^ groups from the right (2^3^2 is 512) and binds tighter than a leading minus (−2^2 is −4); % and mod give the remainder with the sign of the divisor, as in R and Python (−7 % 3 is 2), and fmod keeps C's sign of the first value (fmod(−7, 3) is −1); angles are in radians; round takes halves away from zero (2.5 → 3).
- How a Formula is fitted: starting values come from the data (parameters the formula is linear in, such as a and c in a*exp(-x/b) + c, are solved exactly), then Levenberg-Marquardt refines the best candidates, each parameter scaled to its own size, so a time constant of 1 ms with x in seconds fits as readily as one near 1. A sweep whose fit doesn't reach a true minimum reads "did not converge" in the Data Log, with no values. Optional starting values (name = value, separated by commas) help a hard fit or choose between two fits. A fit needs at least as many points as parameters. A long fit can be stopped with Cancel.
- Weighting: Least squares (unweighted), the usual choice, or Relative weighting (1/Y²) for data whose scatter grows in proportion to Y. The weights come from the fitted curve's Y, re-estimated until they settle, as GraphPad Prism weights; R's nls with weights 1/y² divides by each point's own Y instead, which pulls the curve toward points that happen to fall low (Carroll & Ruppert 1988). Where the curve is at or near Y = 0 a point gets a very large weight, so use least squares when the curve comes close to or crosses zero; the Data Log warns.
A new fit is drawn as a dashed curve across the sweep. Keep (Keep fits) turns it into a regular sweep you can style and save, and Remove (Remove fits) discards it. Both can be undone with ⌘Z. A fit is drawn in the panel of the sweep it was fitted to, whatever the grouping, and stays there when kept.
Fits run in the background, so the app stays responsive: a fit that takes more than a moment shows a spinner, "Fitting sweep 2 of 8…" and a Cancel button beside Fit, and Cancel leaves the graph and the Data Log as they were. Both Fit buttons wait while a fit runs, and if the graph's data change meanwhile, nothing is drawn or logged and the panel asks you to fit again.
Reading a Fit
- After fitting, the panel shows the equation with the fitted values (such as y = 42.3 · e^(−t / 18.5) + 2.1), and the Data Log writes it above the parameter table. You can copy it from either place. Values of 10⁶ or more are shown with an exponent, to 4 significant digits.
- R² is 1 − (residual sum of squares) / (total sum of squares). With relative weighting both sums are weighted, and for a line or parabola through zero the total is taken about Y = 0, as R reports it for a model without an intercept. The Data Log notes both, since such an R² can't be compared with an ordinary one.
- Below the parameters, the Data Log adds a Goodness of fit table: N, df, the sum of squares (Weighted SS under relative weighting), Sy.x (the residual SD, √(SS/df)), Adj. R², and AIC, AICc and BIC as R's AIC() and BIC() compute them, counting the residual SD as a parameter. Lower is better, and only fits of different models to the same points, with the same weighting, can be compared (a mono- against a bi-exponential, say).
- On a sweep, consecutive samples are correlated, so AIC, AICc and BIC tend to favor extra components. Keep an extra exponential only if it also removes a trend from the residuals.
- Time constants are always positive, and a double or triple exponential lists its components fastest first. A Boltzmann slope or a Gaussian width is reported as its magnitude. On a time axis, exponential and polynomial fits take the start of the fit window as t = 0 (the Data Log says where that is). On X-Y data, an exponential fit works wherever X starts, and its amplitude is the value at x = 0, as the equation is written. If X starts many time constants away from 0, subtract a constant from X first.
- Units don't change the result: a dose in M or nM, or a current in A or pA, gives the same parameters, intervals and band in its own units.
- If the best fit leaves a parameter undetermined (a Boltzmann steeper than the spacing of the X values, two merged time constants, or a formula whose parameters can't be told apart, as b and c in a*x + b + c), the Data Log says "Parameters not identifiable" and gives no intervals or band: treat those values with caution. With exactly as many points as parameters, the fit passes through every point, R² is 1 and there are no intervals.
- Missing samples (gaps) in the fit window are skipped rather than stopping the fit.
Confidence Intervals and Bands (X-Y Data)
- Fits to X-Y data, such as a dose-response or an I-V curve, report each parameter's confidence interval beside its value, at the confidence level set in Settings. These are the asymptotic intervals GraphPad Prism and SciPy report, and they assume the points are independent. A straight line's intervals are exact (in closed form, as R's confint(lm)), even when X sits far from 0.
- Fits to a sweep (a decay, a rise) get no intervals or band: consecutive samples of a recording are correlated, so the formula would treat thousands of samples as independent measurements and give intervals far too narrow to mean anything. For the uncertainty of a value such as τ, fit each sweep, cell or experiment and summarize those values across them (n = cells), for example with a mean and its CI.
- Show confidence band shades a band around each fitted curve, in the curve's color: a confidence band (where the true curve lies, the default) or a prediction band (where a new single point would fall, so always wider), at a Level (95% by default). The setting is shared by both parts of the tab and is remembered.
- A line or polynomial gets the exact band (as R's predict.lm). A nonlinear model gets the delta-method band (as GraphPad Prism and R's investr package compute it), which is approximate and most trustworthy when the parameters are well determined.
- The band spans the drawn curve, is exported with it to PDF, PNG and SVG, and is saved with the file. Editing the curve in a way the band can't follow (a filter, say) hides the band; Y Scale/Offset keeps it in step.
For exponential fits, tau (τ) is in the recording's own X unit, usually seconds, even when the axis shows ms. The equation takes the start of the fit window as t = 0.
AP Detection (⇧⌘J), including the Phase Plot and the Intracellular and Extracellular modes, has its own page: see AP Detection in the sidebar.
All measurements are written to the Data Log. Select any column of numbers and press ⇧⌘G to graph it immediately.
Synapse Detection
The Synapse Detection panel (Analyze tab) has two modes, chosen with a picker at the top: Evoked, for responses at known stimulus times (paired-pulse and train protocols), and Spontaneous, for miniature or spontaneous events (mEPSCs, mIPSCs, EPSPs) anywhere in the trace. Both modes show their detection settings, then Measurements to Report, then a plot-over-time section (Results Over Time for Evoked, Time-Binned Summary Graphs for Spontaneous). Spontaneous mode also has Detection range (the whole sweep, or between cursors A and B), Multi-sweep mode for several sweeps (Continuous joins them end to end, Episodic analyzes each one separately), Overlap Handling and Capture Settings (saving event waveforms). Evoked detection runs on every sweep of the selected group. While spontaneous detection runs, a progress bar shows with a Cancel button, which stops it and adds nothing. The Data Log's tables name the file they came from.
Evoked Detection
Looks for a response at known stimulus times instead of scanning the whole trace. This mode is for evoked EPSCs/EPSPs/IPSCs, paired-pulse protocols, and trains.
Evoked Event Timing
- Uniform Train: a start time, pulse count and frequency (such as "start at 550 ms, 10 pulses, 10 Hz").
- Manual Timings: a list of pulse times (ms), separated by commas or spaces, for irregular protocols. Use a period for decimals, since a comma separates times. Entries that aren't plain numbers (such as "10ms") are ignored, and the Data Log lists them.
- Train and manual times are in ms as the X axis shows them, like every other time in the panel: for a file with a recorded start time, or after Set X = 0, read them off the axis. Batch Processing and the AI Assistant take pulse times the same way.
- From TTL / Stimulus Channel: pick the group that holds the stimulus trace; each threshold crossing is a pulse onset. Pulse times are found separately in each sweep, so sweep-to-sweep jitter is captured. Pulses at least Min. pulse separation apart are all kept, including ones exactly that far apart.
- TTL Polarity: Active-high (default) takes the trace rising above threshold as the onset; Active-low takes it falling below threshold, for a TTL that is high at rest and drops during the stimulus. If this is set wrong there is no error, but every pulse time is shifted later by the pulse width, because the trailing edge is detected.
- A uniform train or TTL detection can be combined with an extra manual pulse time (such as a train plus one late pulse).
The expected response direction and an onset threshold (relative to baseline) apply to every pulse. The direction starts out upward for a voltage channel and downward for a current channel; change it if needed. The search for a threshold crossing starts 1 ms after each pulse, so a stimulus artifact isn't mistaken for the response, and ends at the 'Search up to (ms after pulse)' time. With 'Never search past the next pulse' checked (the default), it also stops at the next pulse. 'Threshold in baseline SDs' (on by default, at 4) reads the onset threshold as a multiple of the resting noise SD, so it follows the recording's noise rather than its unit and works the same in pA, nA or mV. The SD comes from the baseline window before the first pulse: the window before a later pulse holds the previous response's decay, which would raise the threshold past the responses of a fast train. Uncheck it to give the threshold as a level in the channel's unit instead. A paired-pulse ratio's Pulse 1 check uses the level each pulse was actually searched with, in the channel's unit. Once a response is found, its peak is searched up to the next pulse, within 'Measure for (ms after onset)' (shared with Spontaneous mode's Capture length), which also bounds its half-width and decay fit.
Stimulation type sets how long after the pulse to search: Electrical (up to 4 ms, the default), ChR2 (4 ms), Chrimson (6 ms), or Custom. The response must cross the onset threshold within the window, which takes part of its rise after it starts, so each preset is 1 ms past the usual latency: electrically evoked responses usually start within 2–3 ms, ChR2 responses about 3 ms, and Chrimson ones 4–5 ms or more. A preset only fills in a starting value, and you can edit it afterward. When pulses scored as failures cross the onset threshold shortly after the search window ends, the Data Log says how many and when, so you can lengthen the window if responses are expected that late.
A pulse with no detectable response is recorded as a failure (0 amplitude), not skipped, so the failure rate is meaningful.
Evoked Baseline & Measurement
In a train, a later response starts on the decaying tail of the ones before it, so its size depends on what it is measured from. "Measure each response" offers both answers:
- From rest (before the first pulse), the default: amplitude, rise time, half-width and decay of every pulse are measured from one baseline taken before the first pulse. A later response then includes what remains of the earlier ones: the summed depolarization the cell actually sees, which decides whether it fires.
- From the previous response's decay: each response's decay is fitted (with the Decay model chosen under Measurements to Report) and extrapolated under the next response, which is then measured on its own. This is the response to that pulse alone, as paired-pulse and short-term-plasticity ratios usually intend. The decay needs a few milliseconds before the next pulse to be fitted; if it cannot be, the pulses after it are measured from the level just before each pulse instead.
Baseline before each pulse (ms) sets how long a stretch before each pulse is averaged. Onsets are always found against that level just before each pulse, and 'From rest' uses the same stretch before the first pulse. It's shared with Spontaneous mode's Capture baseline. Decay time constant is fit the same way as in Spontaneous mode (see Event Measurements, below).
Evoked Output
- Per-sweep tables: one for each measurement checked in Measurements to Report (Latency, Amplitude, Rise, Half-Width, Charge, Decay τ), with one row per sweep and one column per pulse. Latency is in ms from the pulse. A failure shows as 0 in the Amplitude table. With exactly two pulses, the Amplitude table adds each sweep's own PPR. Decay τ1 (ms, fast) and Decay τ2 (ms, slow) tables are added when at least one pulse fit as a double exponential (see Event Measurements below).
- Per-Pulse Summary: mean amplitude, its SD and coefficient of variation (CV = SD ÷ |mean|, the starting point for 1/CV² and variance–mean analyses), and failure rate for each pulse position across sweeps (failures count as 0), and mean charge when measured (failures count, at about 0, with the fixed window).
- Paired-Pulse Ratios: for each consecutive pulse pair, the ratio of the mean amplitudes across sweeps (mean₂ ÷ mean₁). Check 'Paired-pulse ratio: 95% confidence interval' (under Summary statistics, below Measure each response) to add Fieller's 95% interval, computed from the sweeps holding both pulses and allowing for the two pulses' covariance. It needs no random resampling and covered the true ratio 93–96% of the time in simulations with 10 to 30 sweeps, where a bootstrap covered 89–94% with 10 to 20. "unbounded" means the first pulse's mean is not clearly away from zero, so the ratio is undetermined.
- Train Summary (3+ pulses): each pulse's mean amplitude normalized to Pulse 1 (ratio of means).
- Steady-state summary (6+ pulses): the mean of the last third of the pulses (at least the last 3) relative to Pulse 1, showing where the train settles.
- Short-Term Plasticity (2+ pulses): each sweep's own Pₙ ÷ P₁, then averaged across sweeps. A sweep contributes only if its Pulse 1 response is a real response (in the expected direction and past the onset threshold), since dividing by a near-zero amplitude gives a huge, meaningless ratio. The "N sweeps" column shows how many sweeps contributed.
Report the Paired-Pulse Ratios (ratio of means). A mean of per-sweep ratios, as in Short-Term Plasticity, is biased upward whenever amplitudes vary from sweep to sweep: with no plasticity and an amplitude CV of 0.3 it reads about 1.1 (Kim & Alger 2001), and the table says so. The ratio of means read within 1% in the same simulations. Short-Term Plasticity is kept for comparison with work that used it.
Measurements to Report (Evoked)
Onset Times starts unchecked; check it to add onset times to the results and Results Over Time. In Evoked mode onset is measured in ms from the stimulus. In Spontaneous mode it is measured from the sweep's start, from cursor A when analyzing between the cursors, and from the first sweep's start when sweeps are joined end to end (Continuous); the checkbox says which. Instantaneous Frequency and Inter-Event Intervals are hidden in Evoked mode, since they describe spacing between spontaneous events. In Continuous mode the first event after a join between sweeps has neither, since the sweeps weren't recorded back to back.
Results Over Time
For time-course experiments (drug application, LTP/LTD) where each sweep is a time point rather than an independent trial. Check "Plot results over time", choose the Time axis, and detection opens a graph with one stacked panel per detected pulse for each metric checked in Measurements to Report (Amplitude with 3 pulses gives 3 panels, for example). The "Short-Term Plasticity (Pₙ / P₁, per-sweep)" checkbox adds those ratios too.
- Sweep interval (s), the default: each sweep's position in the sequence × the interval you type. A sweep where no pulse was found (TTL mode) leaves a gap rather than shifting later sweeps earlier.
- Recorded sweep times: each sweep at the start time the file records for it, with 0 at the group's earliest sweep. Choose it when the time between sweeps matters, for example a pause while a drug washes in; keep the sweep interval when it doesn't. It is available when the file records sweep start times (see Supported File Formats → Recording Times). A sweep without a recorded start time is left out, and the Data Log names it.
The X axis label and a Data Log line say which time axis was used.
Spontaneous Detection
Scans the whole trace for events using one of three methods, chosen under Detection Method: From Threshold, From Template or Deconvolution. Samples a file leaves unrecorded (blank, such as a short gap at the end of each sweep) are read as baseline, so in Continuous mode detection carries on into the sweeps after them.
Threshold Method
- Amplitude threshold: an event starts when the signal moves this far from baseline, and it is kept only if its measured amplitude reaches the threshold. Slow drift and the resting level are removed for detection only, so enter a size, not a level such as −70 mV. It is in the channel's unit, shown beside the field. Positive for upward events, negative for downward.
- Derivative threshold: an event starts when the slope (in the channel's unit per ms, such as pA/ms, computed over the Regression interval) crosses a set value. Less affected by slow baseline drift.
- Separating valley (% of peak, default 50): an event ends once the signal falls back to this fraction of its peak, so the next event can be counted even if the trace has not returned to baseline. Each new event must itself rise by at least the threshold from the lowest point since the previous one, so an event's own decaying tail, or noise on it hovering near the threshold, is not counted as further events. A second event riding on a tail takes the trough before it as its onset.
- Event direction (for measuring the peak, rise and decay) is the sign of the threshold you set: negative for downward events.
Overlap Handling
For every method: with 'Reject overlapping events' on, events closer together than Min. event separation (default 10 ms) form a cluster. The first event of each cluster is kept if 'Accept first event in an overlapping cluster' is checked, and otherwise the whole cluster is dropped. Set the separation to 0 to keep every event. Every event is measured before the overlap rule is applied, so a kept event's measurements stop at the next detected event even when that one is rejected (measured through it, the first of two 5 ms events 8 ms apart read a decay τ of 13 ms). With an amplitude threshold or a minimum amplitude, detections smaller than it are dropped first, so noise between two events can't join them into one cluster.
Rejection is off by default. Rejected events are left out of the event count, the frequency and the inter-event intervals, which then read low: in simulated 20 Hz recordings a 10 ms separation dropped 19% of events and raised the median interval from 34 to 47 ms. Keeping them costs nothing in their measurements, since an event on another's decay is measured from that decay (see Event Measurements). When rejection leaves events out, the Data Log says how many.
Template Method
Based on the optimally scaled template of Clements & Bekkers (1997; see References). A template waveform is slid along the data; at each point it is scaled and offset to fit best, and the point is scored by the signal-to-noise ratio of that fit (scale ÷ its standard error). An event is detected where the score passes the threshold (default 4, which gives virtually no false positives; Stimfit suggests 3, after Clements & Bekkers, which finds more small events). Because the template is normalized to a peak of 1 about its own baseline, the score is the fitted event's amplitude in noise SDs, whatever the template's units or holding level. Because the template is scaled, only its shape matters, not its amplitude; Event Direction (upward or downward) says which way events go and applies to every template, from a function or a graph. With several templates (for example a fast and a slow one), each point takes the score of whichever template fits best, so events of each shape are found.
Templates come from a function (synaptic: exp(−t/τdecay) − exp(−t/τrise), where Rise τ and Decay τ are time constants; the template peaks at τrise·τdecay/(τdecay − τrise)·ln(τdecay/τrise), 4.9 ms for the default 2 and 18 ms, which the Timing Hint follows) or from the sweeps of an open graph window (From a Graph). The Clements & Bekkers score stays low at the first of two events closer together than the template, so of such a pair usually only the second is found, and that one is then measured on the first one's tail; the Threshold and Deconvolution methods separate them. Keep the template short for this reason, its baseline plus one or two decay τ: on simulated 20 Hz EPSCs with a 5 ms decay τ, a template 25 ms long (5 ms of it baseline) found 70% of events and one 10 ms long 85%, with no more false ones. A template from a graph should start with the baseline length set under Template Waveform, since its level there is taken as the template's zero. A sweep no longer than the template can't be searched, and the Data Log says so.
Deconvolution Method
Based on Pernía-Andrade et al. (2012; see References). The trace is deconvolved by the event template in the frequency domain (its spectrum divided by the template's), which turns each event into a brief peak at its onset however much it overlaps the next. The result is band-pass filtered, 0.1 to 100 Hz by default as in the paper (High-pass and Low-pass; the paper doesn't name its filter type, so these are Gaussian filters applied in the frequency domain, with no phase shift and no ringing). Its noise SD is the SD of a Gaussian fitted to its all-points histogram, and every local maximum of the result above the threshold is an event, timed at its onset, as the paper defines them. The threshold is 4 noise SDs by default (the paper uses 4 to 4.5). Two events whose peaks merge above the threshold are both found as long as each keeps its own maximum (about 3 ms apart or more at 100 Hz). The template comes from the same settings as the Template method (a function or a graph; with several templates the first is used). It is followed to the end of its decay: a template that ends while still decaying is continued as the exponential its own tail follows, since one cut off early would give a false event one template-length after every real one. Detected events are then measured on the recorded trace exactly as with the other methods (peak amplitude, 20–80% rise as in the paper, half-width, decay, charge and Fitted waveform). Overlap Handling applies if turned on.
On simulated recordings (events with 0.5 and 5 ms time constants and amplitudes around 15 pA, at 2, 10 and 20 Hz, in 2 kHz-filtered noise of 1 to 3 pA, at 20 kHz) it found 93 to 99% of events with 0 to 3 false events per minute, against 49 to 97% (and none) for the Template method, which misses events that follow closely on another. Onset times were within 0.05 ms on average (SD 0.07 to 0.18 ms). On the paper's own recipe (time constants of 0.4 and 5 ms, each event's scaled by a random factor of mean 1 and SD 0.3, 10 Hz, signal-to-noise ratio 5) it found 97 to 99% of events in white noise and 96 to 98% in mixed white and 1/f noise, with about 1% false events (the paper reports 98 to 99% and 1 to 2%). In noise already filtered below the events' frequencies, the 100 Hz low-pass costs events (about 80% found), and raised to 2 kHz it found them all, which is why the paper low-pass filters “as required”; in white noise, though, a 2 kHz low-pass finds nothing. A 1 to 200 Hz band found up to 3% more events where the noise was low, but 3 to 9 false events per minute. Set the template's rise and decay τ close to your events'.
Minimum Amplitude
For the Derivative threshold, Template and Deconvolution methods, Minimum amplitude (default 0, off) drops every detection whose amplitude, measured from its baseline, is smaller than the value you set, sign ignored, as an amplitude threshold does; the rest are then measured again. Their own criteria are unit-free (a slope, or a signal-to-noise score), so small noise detections pass them. A few times the baseline noise SD works well: on simulated 15 pA EPSCs in 2.2 pA noise, 5 pA raised the share of detections that were real events from 50% to 95% for a −12 pA/ms derivative threshold and from 94% to 100% for deconvolution at 3.5 SD, missing none. The test uses the amplitude read from the samples, so it applies the same way with Peak Amplitude unchecked or Fitted waveform on.
Choosing a Method and Its Limits
- Amplitude threshold: simple and fast, but its threshold is in the recording's unit, so set it from the noise (about 3 to 4 noise SDs). Events smaller than it are missed, and a threshold near the noise lets noise peaks through as small events.
- Derivative threshold: less affected by slow drift, but the slope of fast noise is large, so on its own it detects many noise events; pair it with a Minimum amplitude.
- Template (Clements & Bekkers): the most selective when the template's kinetics match the events, and its threshold carries between recordings. It misses the first of two events closer together than the template, and events whose shape differs from every template.
- Deconvolution (Pernía-Andrade et al.): best at events close together and at high rates. It needs a template close to the events' kinetics (a slow template on fast events gives extra false detections), and its Low-pass sets a trade-off: lower merges events closer than about 0.3 ÷ low-pass seconds, higher lets more noise through.
- All methods: noise lifts a small event's sampled peak and shortens its half-width (see Fitted waveform), and its decay τ reads a few percent long, since the fit stops where noise first touches the baseline (+3% for 15 pA events in 2 pA noise, under 1% at 40 pA). Gaps in the recording are read as baseline, and there are no excluded regions: to leave out a stretch such as a stimulus or a seal test, analyze between cursors A and B instead.
Event Measurements
For each detected event: peak amplitude, 20–80% (or 10–90%) rise time, half-width, decay time constant, onset time, instantaneous frequency and inter-event interval. The amplitude is always measured, since the rise, half-width and decay are read relative to it; unchecking Peak Amplitude only leaves it out of the results. Rise and half-width levels are timed at interpolated crossings, found walking back from the peak (so a threshold crossing above the 20% level still gets a rise time) but never past the previous event's peak. The half-width, the decay fit and the peak search stop at the next detected event's onset (kept or not; see Overlap Handling), and in Continuous mode at the join with the next sweep, so a closely following event does not distort them. An event that starts on the previous event's decay is measured from where that decay would have been: each event's fitted decay is subtracted before the next is measured, as in Evoked mode's 'From the previous response's decay' setting. Captured waveforms can be baseline-subtracted, and aligned at their peaks for the Template and Deconvolution methods, before averaging (Threshold events are always captured from their onsets, where they cross the threshold, so that method has no Align checkbox), in every mode (single sweep, Continuous and Episodic). In Continuous mode each event is assigned to the sweep it falls in, even when sweeps differ in length.
Rise Times are timed between 20% and 80% of the amplitude by default; the picker next to the checkbox chooses 10–90% instead.
Charge (optional, off by default) is in pC (pA·ms is 1 fC) and is measured only on a current channel (pA, nA), as recorded in voltage clamp. The area under a voltage event is not a charge, so on a voltage channel the checkbox reads 'Charge (current channels only)' and is unavailable, and Batch Processing, Protocols and the summary leave it out too.
- Onset to return to baseline: the trace minus the event's baseline, integrated by the trapezoid rule from its onset to where it first returns to baseline after the peak (interpolated between samples), within the capture length and before the next detected event. It is N/A when the trace hasn't returned by then; the Data Log says how many.
- Evoked mode integrates over a fixed window after each pulse by default, as Clampfit and Easy Electrophysiology measure evoked charge: from 1 ms after the pulse (clear of the stimulus artifact, as the onset search) for the Window you set (default 50 ms, which holds the charge of a fast AMPA EPSC; lengthen it for slow NMDA or GABA-A responses), ending before the next pulse if that comes first. A failure then reads about 0 and counts in the mean, and the Data Log states the window and how many pulses the next pulse cut it short for. Choose 'Onset to return to baseline' to use that rule here too; a failure then has no charge.
- Accuracy: read from the samples, noise ends the integral where the decaying tail first touches the baseline, so charge reads low on small events (15 pA events in 2 kHz-filtered noise of 2 pA: about −14%). With Fitted waveform it is the fitted event's integral instead (within 1%). Both match NumPy's trapz.
Fitted waveform (optional, off by default): read from the samples, a small event's peak is lifted by the noise (by about one noise SD when the noise is band-limited), and level crossings move, in every program that measures single events this way. 15 pA events in 2 kHz-filtered noise of 2 pA read amplitude +15%, 20–80% rise +98% and half-width −37%. With Fitted waveform checked, amplitude, rise and half-width come instead from a least-squares fit of the event shape, exp(−t/τdecay) − exp(−t/τrise), with its onset, both time constants and its scale free and the same baseline: +1%, −5% and −2% on those events. The fitted scale is the template scale, with the template's kinetics fitted to each event. The decay τ, and which events are kept (the minimum amplitude still uses the sampled peak), are unchanged. It is slower, and an event whose fit fails or is implausible keeps its sampled values; the Data Log says how many. With it off, the Data Log notes when the median event is under 20 times the baseline noise SD.
Onset: a threshold is crossed partway up an event's rise, later for a small event than a large one, so for the Threshold method the onset is moved back to where the rise begins: the line through the 20% and 80% points of the rise, extrapolated to baseline. This makes onset times, and the intervals between events, independent of event size, and keeps the rise out of the baseline window. It is never moved later than the threshold crossing or back past the previous event's peak. The Template method's onset is already the fitted template's own. Evoked onsets, and so latencies, are extrapolated the same way, to the level just before the pulse and never before the pulse itself.
Decay time constant is fit nonlinearly (Levenberg-Marquardt) from where the event has fallen to 80% of its amplitude until the signal returns to baseline, the capture window ends or the next event begins (time still runs from the peak; from the peak itself when the next event comes too soon to reach 80%). Just after the peak the rise has not finished, and a fit starting there read 5.16 ms for a noise-free 5 ms decay (0.5 ms rise); from 80% it reads 5.01 ms. Choose the model under Decay Time Constants: Single exponential (default) suits most synaptic currents; choose Double exponential when the decay has a clear fast and a slow phase, and use the same model for every group you compare. The reported Decay τ (ms) is always one number per event: the single exponential's τ, or for a double exponential the amplitude-weighted average (A₁τ₁ + A₂τ₂)/(A₁ + A₂). With the double-exponential model, two further panels appear when at least one event fits two components: Decay τ1 (ms, fast) and Decay τ2 (ms, slow). An event too short to fit two components is fit as a single exponential and shows NaN in those panels. A fit that doesn't describe a decay (a τ over 5 times the stretch fitted, as an event on a plateau or a step gives) is left out: that event's Decay τ is NaN rather than a huge number.
Overall Summary and Cumulative Distributions
In Spontaneous mode, 'Overall summary (Data Log)' writes one summary for the recording: the number of events, the frequency (events divided by the time analyzed, every sweep's searched stretch added together), and the mean, SD (n − 1), median and CV (SD ÷ |mean|) of amplitude, charge, rise, half-width, decay τ and inter-event interval, each when checked in Measurements to Report. 'Cumulative distributions (amplitude, IEI)' opens two graphs, the cumulative distribution of event amplitude (absolute value) and of inter-event interval: each value against the fraction of events at or below it. Copy or export their data to compare recordings or conditions, for example with the two-sample Kolmogorov-Smirnov test in Statistics, the usual way to compare event populations. Both match NumPy.
Time-Binned Summary Graphs
"Plot time-binned summary graphs" groups every detected event by its time in the recording (Bin width default 30 s) and opens one panel per metric checked in Measurements to Report. Its Time axis is Sweeps joined end to end by default, all sweeps treated as one continuous timeline. When the file records when each sweep started you can choose Recorded sweep times instead: each event sits at its sweep's start plus its time within the sweep, and a bin's Mean Frequency is its events divided by the time sweeps actually covered in it, so the gaps between sweeps don't count as silence (a bin wholly in a gap stays empty). Sweeps without a recorded start time are left out, with a note in the Data Log, and the axis label says which time axis was used. A "Mean Frequency (Hz)" panel is always included: event count ÷ bin width, which is not the same as Instantaneous Frequency (1/inter-event interval, per event). The bins cover the whole analyzed recording, so a quiet stretch at the end shows as zero frequency; if the bin width doesn't divide the recording, the last bin is shorter and its frequency uses its own width. Optional error bars for each bin: SD, SEM, or the confidence interval of the mean (SEM × the t critical value, at the confidence level in Settings → Statistics); the graph title says which. This section is hidden in Episodic mode, which has no continuous timeline.
References
Clements JD & Bekkers JM (1997). Detection of spontaneous synaptic events with an optimally scaled template. Biophysical Journal, 73(1):220–229. https://doi.org/10.1016/S0006-3495(97)78062-7 (the Template Method above).
Pernía-Andrade AJ, Goswami SP, Stickler Y, Fröbe U, Schlögl A & Jonas P (2012). A deconvolution-based method with high sensitivity and temporal resolution for detection of spontaneous synaptic currents in vitro and in vivo. Biophysical Journal, 103(7):1429–1439. https://doi.org/10.1016/j.bpj.2012.08.039 (the Deconvolution Method above).
AP Detection
The AP Detection panel (Analyze tab, ⇧⌘J) has two modes, chosen with a picker at the top: Intracellular, for whole-cell or sharp-electrode voltage recordings (with a phase plot of dV/dt against V), and Extracellular, for spike detection on a continuous extracellular waveform. A raster (spike times only) opens in Extracellular, the one mode that applies to it.
Intracellular AP Detection & Phase Plot
Choose a threshold method with the Method picker. Measurements per AP: threshold voltage, latency, peak, amplitude, rise time, half-width, decay time, maximum rise and decay slopes, and AHP (depth and time). Rise and decay are measured between two levels you set, each a percentage of the AP's amplitude above its threshold: 10–90% rise and 90–10% decay by default, or 20–80% and 80–20%, for example. Because both use the same reference, the decay mirrors the rise and doesn't depend on AHP depth. The table's column headers show the percentages used. Rise, half-width and decay are timed where the trace crosses each level, interpolated between samples (as Clampfit, Stimfit and eFEL do), so they aren't rounded to whole samples.
Find: First AP (the default) measures only the first AP in each sweep; choose All APs to measure every one. Detection runs on the visible sweeps of every group whose unit is a voltage (V, mV or µV; the Data Log names any sweep skipped for its unit), over the full sweep or between cursors A and B, with junction-potential correction applied when it's on. Every analyzed sweep gets a row: First AP leaves it blank and All APs counts 0 when a sweep has no AP, sweeps are then always labeled, and the table says how many sweeps fired out of how many, so the rows line up with a current-step family. Detect APs writes the table to the Data Log and marks each threshold on the graph; choose Keep markers or Remove markers afterward. Detection runs in the background (the button reads Detecting… meanwhile), so a long recording doesn't freeze the window; if you edit the graph while it runs, the Data Log says so and no markers are added. The starting dV/dt threshold comes from Settings → Neurophysiology: 20 mV/ms, the Allen Institute IPFX's dV/dt cutoff, unless you change it there. With the Derivative method it puts the threshold within about 1.5 mV of IPFX's in simulated cells, where 50 mV/ms put it 2.5 to 5 mV higher up the upstroke.
- Derivative threshold (default): one fixed dV/dt value (mV/ms) for every AP. The rise must also be sustained: the average slope over the crossing step and the next two samples must be at least the Sustained-slope multiplier (default 2×) times the threshold. This stops small, fast oscillations on the upstroke (such as from over-compensated capacitance neutralization) from being taken as APs. The test only qualifies an upstroke: the threshold reported is where the unbroken run of samples at or above the set dV/dt begins, the first sample whose slope reaches it (as the Allen Institute's IPFX), so it doesn't move up the AP at high sample rates. Lower the multiplier if real APs are missed; raise it if brief noise is accepted as APs.
- Fractional derivative threshold: for each AP, @Graph finds its maximum slope (the steepest point of the whole upstroke) and walks back toward baseline to the first point where dV/dt falls to a set percentage of that maximum (Fraction of max slope, default 5%, the Allen Institute IPFX convention: on clean recordings at 100 kHz it lands within about 0.1 to 0.2 mV of IPFX's threshold, and noise moves it less than a smaller percentage, which the baseline's own noisy slope can reach early). This adapts to each spike's own upstroke speed. IPFX instead takes the percentage of the average maximum slope of all the sweep's spikes: the two agree within 0.2 mV for most spikes of a regular train, but the later spikes of a burst, which rise more slowly, get thresholds up to 7 mV apart. The maximum slope is the steepest step anywhere between threshold and peak, as in IPFX, so a noise blip at the spike's foot can't set the cutoff. The dV/dt field becomes a 'dV/dt floor' that an upstroke must clear to be considered at all; the Sustained-slope multiplier isn't used. In a fast train the walk back stops at the previous AP's trough.
- Second derivative and Phase-slope (Sekerli) find the same APs as Derivative, then place each threshold by the shape of its upstroke. Second derivative uses the peak of d²V/dt², where the rise accelerates fastest. Phase-slope uses the peak of (d²V/dt²)/(dV/dt), the slope of the phase plot, as proposed by Sekerli et al. (2004); this is the 'kink' where the spike takes off. Derivatives are fitted over 0.2 ms at every sampling rate. The search runs back from the fastest rise while the rise keeps accelerating and dV/dt stays above 5 mV/ms. On fast spikes the second-derivative peak lies well above the dV/dt threshold. Phase-slope suits cells with a sharp onset; on a slow, noisy onset its peak is poorly defined.
- Phase-plane curvature (Sekerli) finds the same APs as Derivative and places the threshold where the phase plot (dV/dt against V) bends upward most sharply: the peak of d²(dV/dt)/dV², Method II of Sekerli et al. (2004). It needs a third derivative, so it fits a quartic over 0.4 ms at every sampling rate. Noise moves it much less than the phase slope, and it usually lands near the dV/dt threshold. With a very sharp onset it takes the start of the search. It needs about 0.2 ms of trace before an upstroke.
- Recordings at 15 kHz and faster: the threshold is placed on the slope of a filtered copy of the trace (a zero-phase 4-pole Bessel low-pass at 10 kHz, as the Allen Institute's IPFX uses, or at 0.4 of the sampling rate when that is lower: 8 kHz at 20 kHz), so noise at high sample rates doesn't push it up the AP and the same cell gives the same threshold at any rate. Your data is never changed: the threshold's time is interpolated between samples, its voltage read from the unfiltered trace at that time, and everything else is measured on the unfiltered trace. The marker sits on the trace at the nearest sample (within half a sample of the reported time). Which events count as APs is still decided on the unfiltered trace. At 20 kHz this took the threshold's bias with 0.5 mV of noise from +1.6 mV to +0.1 mV, and the downstroke's from −31% to −13%. Recordings slower than 15 kHz are not filtered: the filter would keep too little of the upstroke.
- Below 15 kHz the threshold is a whole sample, as in IPFX and eFEL, so it can sit up to one sample interval early or late: in a simulated cell its SD was 1.4 mV at 10 kHz. Check 'Interpolate threshold between samples (below 15 kHz)' to place it where dV/dt (a central difference) crosses the criterion, interpolated between samples: the SD fell to 0.03 mV at 10 kHz, with the threshold about 0.5 mV more negative on average (0.1 mV at 20 kHz; with the Fractional method 1 to 2 mV at 10 kHz, where the maximum slope reads low). Off by default; Batch Processing and Protocol AP steps have the same checkbox.
Min. amplitude from threshold (default 40 mV) rejects any candidate whose peak doesn't rise at least this far above its threshold, filtering out subthreshold depolarizations and noise. It applies to every method. A rejected candidate doesn't hide a spike right after it: the search goes on from the next sample. IPFX counts any event at least 2 mV high whose peak is above −30 mV, so it also counts spikelets and the shrinking spikes of depolarization block (and, in a simulated cell in block with 0.5 mV of noise, about 50 noise events); @Graph counts neither.
A spike already rising when the window starts (a sweep that begins, or cursor A placed, partway up a spike) is skipped, as IPFX skips it: its threshold isn't in the data. A spike still rising at the window's last sample (the sweep's end, or cursor B) is counted, with its threshold and latency, but its peak and the measurements taken from it are blank, and the Data Log lists it.
The peak is the highest point before the trace returns below threshold (in a fast train whose troughs stay above threshold, before the trace, having fallen a quarter of the way back, rises again), so a noise notch near the top doesn't end the search early. Half-width and decay are measured no later than the trough after the peak: when the trace doesn't fall that far before the next spike (in a burst, say), they read blank rather than being timed on a later spike.
AHP is the threshold minus the trough, as the Allen Institute's IPFX defines it: the lowest point between the peak and the next AP's threshold. Noise on a slow falling phase can't end that search early: in simulated cells at 10 to 200 kHz, clean and noisy, every trough matches IPFX 2.1.2's. For a sweep's last AP the search runs to the end of the window, as IPFX's runs to the end of its analysis window, and the AHP is blank when the trace never comes back to within 1 mV of threshold before then (IPFX's clipped spike). Choose 'Between cursors A – B' with B at the end of the current step to end it there. When the file's protocol gives the current step's timing (an ABF epoch table), the search stops at the step's end, and the Data Log lists any AHP cut short there. Without it, the last AP's search also stops where the trace, having leveled out, starts falling steeply again, as it does when a current step ends; when that can't be seen, the step's fall to rest is read as the AHP (40 mV for a true 28 mV in a simulated cell whose step ended 10 ms after its last AP), so the Data Log lists AHPs that never recovered, or that are much deeper than the rest of their sweep, to check. AHP time is the time from the peak to that trough (IPFX's trough time). IPFX's fast trough, ADP and slow trough are not reported.
Max rise and decay slopes are IPFX's upstroke and downstroke: the steepest rise between threshold and peak and the steepest fall between peak and trough (mV/ms; the fall is negative), taken between neighboring samples as IPFX takes them and, from 15 kHz, after the same filter (10 kHz, or 0.4 of the sampling rate when lower), so from 25 kHz they match IPFX's. The filter, or slower sampling, reads a fast upstroke about 10% low (4 to 13% in simulated cells), and the fall is blank when the AHP is.
Compared with IPFX: the peak and the trough are the same samples IPFX picks. Half-width is measured at half the AP's height above threshold, interpolated between samples; IPFX measures at half the height from trough to peak, on whole samples, which reads 0.1 to 0.2 ms wider in simulated cells. Below 15 kHz IPFX places the threshold about one sample earlier (it credits each sample-to-sample slope to the earlier sample), 1 to 1.5 mV lower at 10 kHz. Latency here is the time from the sweep's start; Firing Properties gives the latency from the current step's onset, as IPFX does. In simulated regular-spiking, fast-spiking, adapting and bursting cells at 10 to 100 kHz, with up to 1 mV of noise, every spike was found and nothing else was counted.
Generate Phase Plot opens a graph of dV/dt (Y, 'Derivative') against membrane voltage (X, 'Membrane Potential') for each sweep, useful for characterizing AP shape and sweep-to-sweep variability. Each trace takes the color its sweep has in the source window. Smoothing (samples, odd number, 1 = none) reduces noise in the derivative. Sweeps: Visible / selected (the default) or All sweeps. dV/dt is a central difference between neighboring samples, so it under-reads the fastest part of the upstroke: for a fast spike (about 600 mV/ms) the maximum dV/dt reads about 40% low at 10 kHz, 17% at 20 kHz and 4% at 50 kHz, and less for slower spikes. Record at 50 kHz or faster when the maximum dV/dt matters.
Check 'Average across sweeps (binned)' to plot one average trajectory instead (the button then reads Generate Average Phase Plot). Points are grouped into voltage bins (Bin width, default 1 mV) and averaged across sweeps, with error bars in both V and dV/dt. Because each voltage is passed twice (on the fast upstroke and the slower decay), the rising and falling phases are averaged separately and plotted as two traces (orange = rising, blue = falling), keeping the loop shape. The phases are told apart by position, not by the sign of dV/dt: falling runs from each spike's peak to its trough, as AP Detection finds it (the lowest point before the next spike, or before the end), and rising is the rest, so noise on a flat stretch doesn't split into a positive and a negative branch. When the file's protocol gives the current step's timing, the last spike's falling branch stops at the step's end, and the fall to rest after it is left out of both branches.
The Error bars control (SEM by default) sets what the error bars show:
- SD: the spread of individual sweeps around the mean in that bin.
- SEM: the precision of the mean (SD / √n), which shrinks as more sweeps are included.
- 95% CI: SEM × the t critical value for n − 1 degrees of freedom. Wider than SEM, especially with few sweeps. It stays at 95% whatever the confidence level in Settings.
A bin that only one sweep reaches (often at the top of the spike) has no error bar, rather than a bar of zero.
For rheobase, firing rates, adaptation and the F–I curve of a current-step family, use E-Phys Tools → Firing Properties…, which finds spikes with the settings of your last AP Detection run.
All measurements are written to the Data Log. Select any column of numbers and press ⇧⌘G to graph it immediately.
Extracellular AP Detection
Requires a continuous extracellular waveform, such as a multi-electrode-array or single-electrode recording (see Supported File Formats). Set the mode picker at the top of the panel to Extracellular.
Settings: 'Pre-filter to spike band before detecting' (on, 300–3000 Hz) removes LFP and drift before thresholding. It is a Butterworth band-pass, 4th order overall, run forward and backward (zero-phase, so it doesn't delay the spikes), with both edges at −3 dB after the two passes. Polarity is negative-going by default. Threshold is Auto (a multiple of each sweep's noise SD, median(|x|)/0.6745 of the filtered trace, default 5×) or a Manual value in the first visible sweep's unit; a channel shown in another prefix of that unit (mV beside µV) is converted, so the level and the reported amplitudes mean the same on every channel. Blank (NaN) samples are left out of the noise estimate, and a sweep with no measurable noise is skipped rather than searched with another value. Dead time (default 1.5 ms, as in WaveClus) pauses detection after each spike so one spike isn't counted twice; as in the Spike Sorter, no interval shorter than it can appear in the raster.
- Detect Spikes → Raster: threshold-based spike detection on the visible sweeps (or between the cursors). With an automatic threshold, each sweep (usually each channel) gets its own threshold: the multiplier × that sweep's own noise level over the span searched, read from the whole span when it is 30 s or shorter and otherwise from thirty 1 s stretches spread evenly across it, so the end of a long recording counts as much as its start; the panel previews it for the first visible sweep, and the Data Log records the range used (to 4 significant digits) and the cursor window as the cursor fields show it. The multiplier must be greater than zero, and a manual threshold non-zero. The report and waveform buttons act on the last successful run of this recording, with the polarity and units it used. A progress bar shows while detection runs, with a Cancel button that stops it between sweeps. Each spike's time is its peak, located between samples, on the recording's own time axis: the time the graph shows for it when it opens, including a first sample that sits past 0 (one sample interval in an AxoGraph file, an NWB series' start time, an Igor wave's X offset). The raster and the recording therefore read the same time for a spike, and a spike found at a given sample lines up with that sample in Spike-Triggered LFP. The spike times open in a new raster window (one train per sweep), already showing its LFP / Spike Train Analysis pane.
- Amplitude/Width Report: each spike's amplitude (from its peak to the opposite peak that follows), trough-to-peak width and half-width (the time spent beyond half the peak, measured from zero), plotted as a scatter (amplitude vs. width), with each train's mean and SD of all three in the Data Log (a wide spread can mean a train holds more than one unit). Peaks are located between samples and half-width crossings interpolated, so widths aren't rounded to the sample interval (33 µs at 30 kHz, 100 µs at 10 kHz). Features are measured within ±1.5 ms of the spike, so a following peak up to 1.5 ms after the trough is found; for a spike closer than that to a sweep's start or end the span is cut short, and the Data Log counts those spikes (their width and rebound can read low). Half-width assumes a zero-centered trace, so keep the pre-filter on. A spike band reshapes the waveform (in any program that measures there): with 300–3000 Hz a wide unit's 1.10 ms trough-to-peak read 4% short and a narrow unit's half-width 48% long. Check 'Measure widths on a wide-band copy' to measure amplitudes and widths on the unfiltered trace high-passed at the frequency you set (default 100 Hz) instead: −1% and +1% on those units. Spike times still come from detection. The wide-band copy is noisier, so widths spread more and amplitudes read higher (peak-to-peak picks up more noise); the report's title says which trace was used.
- Show Spike Waveforms…: overlays a 3 ms snippet (±1.5 ms) around each detected spike, to check spike shape and consistency.
These tools need the continuous waveform. LFP / Spike Train Analysis works from spike times alone, so it also runs on spike-sorted files (such as .nev and .plx) that have no waveform.
References
Sekerli M, Del Negro CA, Lee RH & Butera RJ (2004). Estimating action potential thresholds from neuronal time-series: new metrics and evaluation of methodologies. IEEE Transactions on Biomedical Engineering, 51(9):1665–1672. The phase-slope threshold.
LFP / Spike Train Analysis
The LFP / Spike Train Analysis panel (Analyze tab) has tools for continuous field-potential data (Spectrogram, Cross-Correlation / Coherence, Band Power Over Time, Hilbert Envelope and Phase, Phase–Amplitude Coupling), for spikes against the LFP (Spike-Triggered LFP and Phase Locking) and for spike trains (PSTH, ISI / Burst Detection, Fano Factor). Spike trains come from a raster made by Detect Spikes → Raster in AP Detection (Extracellular) or by the Spike Sorter, or from a file that stores spike times, such as Blackrock/Ripple .nev, Plexon .plx, an NWB file's units or TDT snippets (see Supported File Formats).
- PSTH (Firing-Rate Histogram): firing rate over time from a set of spike trains. Output: Per train (one trace each) or Pooled average (the default, one population trace); click Compute PSTH.
- Bin width (PSTH; ms, default 10): sets how finely time is divided. Smaller bins show faster rate changes but are noisier, and larger bins give a smoother trace.
- Suggest (PSTH): fills in a bin width chosen from this data's own spike statistics (Shimazaki & Shinomoto 2007; see References) rather than a fixed default. It considers widths that divide the time window into whole bins, so the PSTH has no partial last bin. When no width shows more bin-to-bin variation in the counts than chance (Poisson) would give, the spikes are too few to resolve any change in rate: Suggest says the data are insufficient and leaves the width alone. When the best width is the coarsest it tries (a tenth of the window), it is filled in with a note that the best may be coarser still.
- Time window (PSTH): by default, the span the trains were recorded over when that is known (a raster from Detect Spikes → Raster or the Spike Sorter), so a silent stretch at the end still counts as zero firing. Turn on 'Custom time window' to set the start and end (s) yourself; Suggest then uses that window too. Spikes outside the window are left out. If the bin width doesn't divide the window, the last bin is shorter and its rate uses its own width.
- Spike-sorted files (PSTH): these store only spike times, so the span isn't known, and every spike-train tool follows one rule: each train is taken as recorded from its first to its last spike. The PSTH then runs from the earliest first spike to the latest last one, and each train counts only in the bins wholly between its own first and last spikes.
- Rates (PSTH): each rate is the spike count divided by the time actually recorded in that bin, summed over the trains when pooled. So when sweeps have different lengths, a late bin is averaged over only the sweeps that reach it, instead of counting the shorter ones as silent. A bin that no train recorded (for example past the end of every sweep in a custom window) has no rate and shows as a gap. A spike exactly on a bin edge, judged in whole samples, goes in the bin that starts there, as numpy.histogram does.
- Align to stimulus events (PSTH): a peri-stimulus time histogram (Gerstein & Kiang 1960). Each sweep's spikes are re-timed from its stimulus, every sweep (or, with 'First event in each sweep only' off, every event) is one trial, and each bin shows the mean firing rate across trials with a band of ± SEM (SD with n − 1, divided by √n); 'Also show ± SD' adds the SD.
- Events (Align to stimulus events) can come from a TTL / stimulus channel of the recording (open it; each onset is where the channel crosses the threshold, found the same way as evoked synaptic detection), from the file's stimulus command (ABF protocols: each time the command leaves its holding level, such as a step or each pulse of a train), or from times you type (seconds from each sweep's start, as the raster's time axis shows them, the same in every sweep). Channel and command events are timed on the recording's own time axis, as the raster's spikes are, and stimulus sweeps pair with the raster's trials in order.
- Window and bins (Align to stimulus events): Before and After (s; defaults 0.5 and 1) set the window. Bins are anchored at the event, so one bin edge sits at 0 and no bin mixes spikes from before and after it, and the window is widened to whole bins. A trial counts in a bin only if its sweep recorded the whole bin, so an event near the end of a sweep doesn't read as silence after it; the Data Log lists how many trials each bin used. For a spike-sorted file, each train counts as recorded from its first to its last spike, so an event past the end of the data is not a silent trial.
- Smoothing SD (Align to stimulus events; ms): when above 0, smooths each trial's binned rate with a Gaussian of that SD (cut off at 4 SD) before averaging (Nawrot et al. 1999), so the SEM describes the smoothed curve. Each trial is binned beyond the window by the kernel's reach first, so the first and last bins are smoothed with the recorded data next to them. At recording gaps and ends the kernel is rescaled over the bins that have data (normalized convolution) instead of treating missing time as zero.
- Curves (Align to stimulus events): All trains (one population curve), Per unit (one curve per sorted unit over its own trials, for a Spike Sorter raster whose trains are named '<unit>: <sweep>'), or Per train (the events within each train, such as many stimuli in one long recording).
- Results (Align to stimulus events): the result window shows each curve's mean and its SEM band as lines, and a second window shows the aligned raster (one row per trial, time from the event). The Data Log gets each curve's pre-event rate (spikes in the Before window ÷ its length) and post-event rate (the After window), both mean ± SEM across trials, the peak, and every bin's mean, SEM and trial count. Values match numpy and the Elephant toolkit's time_histogram.
- Stimulus times can also come from an event raster: a file's digital events (Blackrock), events and strobed words (Plexon), epocs (TDT), TTL lines and messages (Open Ephys, Neuralynx) or stimulation events (Intan RHS). Choose Stimulus times from → Event raster, then the raster (the one read from the spike raster's own file comes first) and the train. Every event is a trial. Min. interval leaves out an event that comes less than that long after the one before it, so a burst of TTL pulses gives one trial at its first pulse. 'Only events from … to …' uses one stretch of the experiment. The two rasters must share a clock: the same file, or files whose recordings started at the same moment. Otherwise @Graph says why it can't use them. A trial whose window the train didn't record at all (past its ends or in a gap) is left out, and the Data Log says how many.
- Baseline z-score and bins that differ from baseline (Align to stimulus events, off by default): set the baseline (seconds from the event; by default the whole Before window) and α. A new window shows each bin's z-score, (bin's mean rate − the baseline bins' mean) ÷ the baseline bins' SD, on the curve as plotted, with the marked bins as points. The PSTH window marks them on the mean too, and the Data Log adds each bin's z and adjusted p and lists the periods that differ, above or below baseline.
- The baseline test (Align to stimulus events): the z-score measures size only; the marking is the test. Each bin outside the baseline is compared with the baseline's mean rate, and its p-value comes from shuffling each trial's bins within that trial 1,000 times and taking the largest difference over all the bins tested (a max-statistic permutation test, Westfall–Young step-down; seeded from the data, so the same data give the same result). That holds the family-wise error rate at α: the chance of marking any bin when the stimulus has no effect. It uses unsmoothed rates and assumes a trial's bins are interchangeable without a stimulus (a steady rate across the window).
- How well the baseline test works: each trial keeps its own spikes, so bursts and trial-to-trial changes in rate don't cause false marks. On simulated trains with no response it marked a bin in 4.5 to 5.7% of 1,000 runs at α = 0.05 (Poisson at 5 and 20 Hz, rates varying across trials, bursty), where a Poisson count test with Holm's correction marked 46% of the bursty ones. A response of 40 Hz for 50 ms over 20 Hz firing was found in all but 1 of 300 runs with 30 trials, and in 72% with 10 trials.
- ISI / Burst Detection: an inter-spike-interval histogram plus a per-train burst summary. A burst is a run of spikes, at least as many as Min. spikes per burst (default 3), in which every interval is at or below Max intra-burst ISI (default 10 ms). Intervals are judged in whole samples, so one equal to the limit counts, wherever the train sits in time; an interval on a histogram bin edge likewise goes in the bin that starts there.
- Max Interval options (ISI / Burst Detection; all 0 by default, the plain rule above) turn it into NeuroExplorer's full Max Interval method. 'Max ISI within a burst' keeps a burst going, once started, on intervals up to a longer limit. Bursts closer than 'Merge bursts closer than' (last spike to next first spike) are then joined, with any spikes between them, and last, bursts shorter than 'Min. burst duration' or with too few spikes are dropped. On simulated bursty trains the bursts matched those of Eglen's sjemea mi.find.bursts, the implementation Cotterill et al. 2016 compared, exactly.
- Data Log table (ISI / Burst Detection): one row per train and a Pooled row, with spikes; span (the time the train was recorded over, or its first to its last spike for a spike-sorted file); bursts and burst rate (bursts ÷ span); spikes in bursts and their % of all spikes; mean spikes per burst; mean burst duration; mean intra-burst rate (each burst's (spikes − 1)/duration, averaged over bursts); mean interburst interval (from the last spike of one burst to the first of the next, as in Cotterill et al. 2016); and three irregularity indices.
- Irregularity indices (ISI / Burst Detection): ISI CV, ISI CV2 (Holt et al. 1996) and LV (local variation, Shinomoto et al. 2003). All three are ≈1 for random (Poisson) firing, <1 for more regular firing and >1 for burstier firing. CV2 and LV compare neighboring intervals, so slow changes in firing rate affect them much less than CV; LV was designed to separate regular, random and bursty firing patterns across cortical neurons. CV2 and LV match the Elephant toolkit.
- CV from few intervals (ISI / Burst Detection): the CV reads low from few intervals (about 0.87 instead of 1 for a Poisson train with 5), and the Data Log says so for a train with fewer than 20; CV2 and LV have no such bias. Check 'Bias-corrected ISI CV (jackknife)' to add a column with the jackknife-corrected CV, n·CV − (n − 1)·the mean CV leaving out one interval at a time. For Poisson and gamma trains with 5 intervals it read within 0.3–8% of the true CV, against 10–20% low for the plain CV, but with a wider spread.
- Pooled row (ISI / Burst Detection): sums spikes, bursts and spans (so its burst rate is all bursts over all recorded time), averages over every burst (not over the trains' averages), and takes CV2 and LV from every pair of neighboring intervals within a train. It has no CV, because intervals pooled from trains firing at different rates look irregular even when each train is regular.
- Method (ISI / Burst Detection): Max Interval (NeuroExplorer) or Poisson surprise (Legéndy & Salcman 1985, as Cotterill et al.'s burstanalysis code, with an indexing slip in that code's look-ahead step corrected). Poisson surprise starts a burst at three spikes whose two intervals are shorter than half the train's mean interval, adds later spikes while that makes it more surprising and drops early ones while that does. Surprise is −ln P, the chance a random train at the same mean rate fires that many spikes that quickly; bursts below Min. surprise (default 5, P < 0.7%) are left out. The Data Log lists every burst. Mark bursts on a copy of the raster opens the raster with a bar under each burst.
- Poisson chance reference (ISI / Burst Detection, on by default): adds two columns beside % spikes in bursts, the % of spikes in bursts and the burst rate this rule gives on average for a Poisson (random) train with the same number of spikes and mean interval. Random firing makes bursts too: at 20 Hz with the default 10 ms and 3 spikes, 8.5% of the spikes of a 100-spike Poisson train are in bursts (8.7% for a long one). It is exact, worked out from the chance that an interval is at or below the maximum, 1 − exp(−maximum ÷ mean interval), and the lengths of the runs of such intervals (no simulation); it matched a million simulated trains to within their sampling error. The rate is the train's own (1 ÷ mean interval), so with few spikes the reference reads a little high (8.9% for 10 spikes at 20 Hz, where Poisson trains average 7.1%). Read the observed % against it: near it is what chance gives at that rate. It covers the plain rule only, so with Max Interval options set its columns are left empty.
- Fano Factor: the variance of spike counts divided by their mean (variance with n − 1): 1 for a Poisson train, below 1 for more regular firing, above 1 for more variable or bursty firing. Values match numpy and scipy.
- Consecutive windows (Fano Factor): one value per train, from back-to-back windows of the Counting window (default 100 ms) over the span it was recorded. For a spike-sorted file that span is its first to its last spike, and those two spikes are left out because they are in the span by construction; counted, they would raise F.
- Across trials (Fano Factor): one value per unit (all trains as one unit for a raster without Spike Sorter names), from one window per trial at the same time: from Window start on each sweep's time axis, from each event you type, or, with 'Events from an event raster', from the events of an event-raster train (as above). A trial counts only if its sweep recorded the whole window. Trials of: Per train (each train its own unit), Per unit, or All trains.
- Data Log (Fano Factor): F with its confidence interval (at the confidence level in Settings) and the p-value of F = 1, from the index-of-dispersion test ((n − 1)·F against χ² with n − 1 degrees of freedom; Eden & Kramer 2010). The interval inverts the same χ² and is exact for Poisson counts. In simulations of Poisson, gamma and bursty trains with 10 to 100 counts it covered the true value in 92 to 97% of runs at 95% (85% for short windows of very bursty trains), where bootstrap intervals (percentile or BCa) covered 61 to 90% with 10 counts.
- Window length (Fano Factor): F tends to 1 for windows much shorter than the interval between spikes and, for long windows, to the squared CV of the intervals (0.5 for a gamma train of shape 2), while slow changes in rate raise it. Compare Fano factors at one window length, and use 'Also plot Fano factor against window length' (25 lengths on a log axis, with each CI and the Poisson line) to see how it changes.
- Pool all trains into one ISI histogram: off by default (one histogram per train); on, combines all trains into one population histogram.
- Log-scale ISI bins: off by default (about 100 equal-width bins). On, uses ten bins per decade (0.1 log10 units, the logISI histogram of Pasquale et al. 2010) on the same edges every time, so histograms from different runs compare bin for bin, on a log axis, so short intervals within bursts and long gaps between bursts, which can differ by several orders of magnitude, are both clearly visible. Bin heights are counts.
PSTH and ISI/Burst Detection use only spike times, so they work the same on detected spikes and on spike-sorted files. Amplitude/width and waveform-shape analysis need the waveform and are under AP Detection (Extracellular).
Recordings with gaps: when a recording was paused (Plexon, TDT) or an NWB unit lists several observation intervals, every spike-train analysis uses only the time observed. Rates are spikes ÷ observed time, a PSTH bin partly in a gap is divided by the part observed and one wholly in a gap is left blank, and no interval, burst or counting window spans a gap. The burst table then shows the time observed and spanned.
For a stimulus-aligned PSTH from a Spike Sorter raster, keep the recording window open: its TTL channel or stimulus command supplies the event times, and Per unit keeps each unit's trials together.
Spectrogram and Cross-Correlation / Coherence
The Spectrogram and Cross-Correlation / Coherence sections (Signal cross-correlation, Coherence, and Spike-train cross-correlogram) work on this window's data. The same tools are in the E-Phys Tools menu, working on the front graph window. See E-Phys Tools → Spectrogram / Cross-Correlation / Coherence for what each one computes.
Band Power, Envelope and Phase, and Coupling
Four sections for rhythms in field potentials. They work on this window's data (the spike–LFP section pairs it with a raster or an LFP graph), and the same controls are in E-Phys Tools → LFP Oscillations… for the front graph, with the same results. Bands have presets (delta 1–4 Hz, theta 4–8 Hz, rodent hippocampal theta 6–10 Hz, alpha, beta, low gamma, gamma 30–80 Hz, high gamma 80–150 Hz), and the edges stay editable. Every band-pass is the Filter panel's zero-phase Butterworth (4th order, both edges −3 dB after the forward and backward passes). Phase follows the cosine convention: 0° at each peak of the band-passed signal, ±180° at each trough.
- Band Power Over Time: a band's power as a time series in a new window, on the graph's own time axis (Set X = 0, the cursors and the X zoom carry over). Choose either definition. Spectrogram: the power spectral density of each short Hann window (mean removed, scaled as the Spectrogram and SciPy's spectrogram), integrated over the band with each frequency bin counting by the share of its width inside the band (summing whole bins made 4–8 Hz with 1 Hz bins 5 Hz wide), which is the band's variance in that window, placed at the window's center. Band-pass + Hilbert: half the squared amplitude envelope of the band-passed signal, at every sample, whose mean over time is the band's variance. Both estimate the same quantity (a steady sinusoid of amplitude A reads A²/2 by either); the Hilbert estimate follows changes sample by sample, the spectrogram's averages over each window. Window: Auto picks the shortest power of 2 whose bins are at most a quarter of the band's width apart (for 4–8 Hz at 1 kHz, 1,024 samples, 1 s). A window longer than the sweep is cut to fit, and the Data Log says so. A window with a missing sample has no value.
- Relative power divides by the power over a total range (default 1–100 Hz), found the same way, so a change in overall signal size doesn't read as a change in the band. Smoothing is a centered moving average (in seconds) that shrinks at the ends; for relative power the band and the total are each averaged first and then divided (a ratio of mean powers). The window is a whole, odd number of points (one per window step with the Spectrogram), so a short smoothing can round to none; the Data Log gives the window actually used. Relative power by Band-pass + Hilbert needs smoothing of at least one cycle of the band's low edge: unsmoothed it divides two instantaneous envelopes, which is not a share of the power and can exceed 1 by far (11% of samples on pink noise). dB (10·log10) comes last. With All sweeps, each sweep becomes a sweep of the result, grouped by channel; with the Spectrogram, sweeps at another sample rate are left out, and the message says so.
- Hilbert Envelope and Phase: new channels in a new window on the graph's time base: the band-passed signal, its amplitude envelope, its phase (degrees) and, if you like, its instantaneous frequency (the rate of change of the unwrapped phase ÷ 2π, by central differences). The analytic signal is SciPy's hilbert (by FFT), with each end first extended by odd reflection for 10 cycles of the band's low edge, the same extension the zero-phase filter uses, which keeps the ends from spreading error into the rest of the trace (7× less than no extension on test data). Blank samples stay blank, and each unbroken stretch is analyzed on its own. Very long recordings are transformed in overlapping blocks, which agree with a single transform to about 0.01% of the signal's RMS.
- Within a cycle or two of an end or a gap, the filter and the transform both have edge effects, so leave those stretches out of measurements. Phase and instantaneous frequency describe one rhythm only for a narrow band; for a band wider than an octave the Data Log says so. Instantaneous frequency is meaningful only where the envelope is well above zero: where it dips, the phase is poorly defined and the frequency can swing widely, even below 0.
- Phase–Amplitude Coupling: the modulation index (MI) of Tort et al. (2010; see References), for a phase band (default 4–8 Hz) and an amplitude band (default 30–80 Hz); click Compute Coupling. The phase band's phase is divided into 18 bins of 20°, the amplitude band's mean envelope is found in each, and MI measures how far that distribution is from flat: (log 18 − its entropy) ÷ log 18, from 0 (no coupling) toward 1. It matches tensorpac's implementation to rounding.
- Data and bands (Phase–Amplitude Coupling): data within two cycles of the phase band's low edge of an end or gap are left out. The amplitude band must lie above the phase band (an overlapping band picks up the phase rhythm's own harmonics, which read as coupling), as the comodulogram's empty cells already enforce. A flat phase signal, whose phase doesn't move through every bin, gets a message saying so.
- All sweeps (Phase–Amplitude Coupling): with All sweeps (pooled) of a channel, every sweep of that channel goes into one index. On a file with several channels the Sweep menu offers one such choice per channel, never all channels together: pooling another electrode, a current or stimulus channel, or sweeps in another unit would mix unrelated signals into one index (in a test, a clearly coupled LFP's coupling vanished when a second, uncoupled channel was pooled in). Band Power and Hilbert's All sweeps likewise run on one channel's sweeps.
- Results (Phase–Amplitude Coupling): the phase–amplitude plot opens in a new window (the normalized mean amplitude per phase bin over two cycles, with the flat 1/18 line for no coupling). The Data Log gets MI, the phase bin of largest amplitude (its center, so coupling at 0° reads ±10°), the distribution's circular mean phase (which doesn't step by bins) and the test below, and warns when the amplitude band is narrower than twice the phase band's top frequency.
- Measure (Phase–Amplitude Coupling): Tort MI or Canolty MVL. MVL is the length of the mean of A·e^(iφ), in the signal's unit; its angle is the preferred phase (0° = peak of the phase band). It is also reported as Canolty's z-score against the time-shift surrogates and as Özkurt & Schnitzler's direct PAC (0–1). Use the p-value for significance: surrogate MVLs are skewed, so z overstates it slightly. Both measures use the same filters, edge rule and surrogates, and the comodulogram can map either.
- Significance: each surrogate (200 by default) circularly shifts the amplitude envelope against the phase by a random lag between 10% and 90% of the data's length, which keeps each signal's own rhythm and breaks only their timing (a time-shift surrogate, as in Canolty et al. 2006; Aru et al. 2015 recommend surrogates that keep each signal's structure), and recomputes MI. The Data Log gives the surrogates' mean, SD and 95th percentile, z = (MI − mean) ÷ SD, and p = (1 + surrogates at or above MI) ÷ (1 + surrogates), so 200 surrogates can show p down to 0.005. The lags come from a fixed seed, so a run repeats exactly. On uncoupled test signals of 10 s or more, p fell below 0.05 in about 5% of runs, as it should; with each sweep's own lag, pooled sweeps are tested the same way. This p is right for a band pair you chose before looking at the data. For a pair picked from the comodulogram it is uncorrected (see below). A strictly periodic phase signal (a pure sine) can't be tested this way: shifting it lines it up with itself again, so the surrogates keep the coupling.
- Short records: the test needs enough cycles of the phase rhythm. When the data kept (all pooled sweeps together, after the edges are left out) hold fewer than 30 cycles of the phase band's low edge (7.5 s for 4–8 Hz, plus 0.5 s at each end), the Data Log and the panel warn. On uncoupled noise, p ≤ 0.05 came up in 6.6–10% of runs with 2 to 16 cycles and p ≤ 0.01 in 2.5–7% with 2 to 12, so read p as approximate there; 20 cycles and up stayed near 5%. Pooling sweeps helps, since each sweep gets its own shift. A single record too short to hold one different shift per surrogate also gets a warning.
- Comodulogram: MI for every pair of phase frequency (default 2–14 Hz, bands 2 Hz wide) and amplitude frequency (default 20–200 Hz), as a heatmap. Amplitude bands are widened to at least twice the top edge of the highest phase band (15 Hz with the defaults, so 30 Hz): coupling puts the fast rhythm's power in sidebands at ± the phase frequency, which a narrower band cuts off (Aru et al. 2015). A cell whose amplitude band reaches down to its phase band is left empty.
- Whole-map test (Whole-map test surrogates, 200 by default; 0 skips it): picking the brightest of hundreds of cells and testing it alone finds 'coupling' in pure noise most of the time (about 3 runs in 4 with the default 481 cells), so the map is tested as a whole. Each surrogate shifts the amplitude by one random time, the same in every cell, recomputes the whole map and gives its largest MI anywhere on the map. A cell is significant when its MI exceeds that maximum in all but 5% of the surrogates (the max-statistic test, as in Maris & Oostenveld 2007 and tensorpac's 'maxstat'), so the chance of even one false cell anywhere on the map is 5%.
- Whole-map results: the significant cells open as a second heatmap (other cells blank), and the Data Log lists them with MI and the whole-map p, plus the brightest cell's uncorrected p (that cell tested alone) and whole-map p. Use the whole-map p for any pair you pick from the map.
- Whole-map performance: on uncoupled pink noise (20 s, the default grid, 200 surrogates) some cell came up significant in 6% of 200 runs (2 of 40 runs at 60 s), against 74% for the brightest cell tested alone. Coupling to a 6 Hz rhythm at modulation depth 0.6 was found at its cell in every run; at depth 0.3 in every 60 s run, but in only 17% of 20 s runs (that one pair, chosen in advance and tested alone, came out in 92%). Testing the whole map costs power, so test a pair you chose beforehand on its own.
- Why the whole-map test uses MI: the maximum is taken over MI itself, not over each cell's z-score. One cell's time-shift surrogates slightly understate how far its MI can stray by chance (the same effect as the short-record warning, larger for slow phase bands), and the largest of hundreds of z-scores lands in exactly that tail (on 20 s of noise, a z-based maximum flagged a cell in about 30% of runs). The cost is that cells whose MI is naturally small, such as fast amplitude bands, need stronger coupling to pass.
- Whole-map computing time grows with surrogates × cells × data length: on a 2-core test machine, 20 s at 1 kHz with the default grid and 200 surrogates took about 2.5 s, and 60 s about 5 s.
- Spike-Triggered LFP and Phase Locking: pairs a spike-train raster (from Detect Spikes → Raster, the Spike Sorter or a spike-sorted file) with a continuous LFP graph. Start from either one and pick the other from the open windows. Spike times are lined up with the LFP on the recording clock when both carry one, as Cross-Correlation lines up two graphs, and otherwise from their sweeps' starts, each on its own time axis (the result says so). A train and an LFP sweep recorded at different times are refused, with a button to compare them from each sweep's start anyway; that result is labeled 'not simultaneous: trial-relative comparison (from each sweep's start)'. Either way a raster detected from this recording lines up with it exactly, to the sample. 'Each train with the LFP sweep of the same number' pools trials.
- The spike-triggered average takes the LFP (band-passed first with 'Band-pass the LFP before averaging', default 1–100 Hz) from −window to +window (Window ±, default 250 ms) around each spike's nearest sample and opens the mean with mean ± SEM (the standard error across spikes) in a new window. A spike whose window runs past an end or into a gap is left out, and the Data Log gives the count.
- Phase locking: each spike's phase in the phase band, interpolated on the unit circle between the samples either side of it (as elephant's spike_triggered_phase), leaving out spikes within two cycles of the band's low edge of an end or gap. It is summarized by the pairwise phase consistency, PPC (Vinck et al. 2010): the average cosine of the phase difference over all pairs of spikes, about 0 without locking and, unlike the resultant length R, not inflated when there are few spikes. For von Mises-locked spikes PPC estimates R². The Data Log also gives R, the mean phase and the Rayleigh test of uniformity (Zar's approximation from 10 spikes, as in CircStat, Berens 2009; it can't go below a floor at fewer, 0.135 for 2 spikes, so below 10 spikes p is exact for 2 and from 200,000 simulated sets of phases, with a fixed seed, for 3 to 9), and a histogram of spike phases (18 bins, with the flat level for no locking) opens in a new window. With 'Each train with the LFP sweep of the same number' on, the Data Log also gives PPC across trials (PPC₁, Vinck et al. 2012), the average over pairs of spikes from different trials only: spikes of one burst share a phase because they come together, which raises PPC but not PPC₁, so prefer PPC₁ for a bursty unit. It matched a brute-force average over all such pairs.
Read coupling with care. Sharp or non-sinusoidal waves (sawtooth-shaped theta, spikes, artifacts) give a significant MI without any interaction between two rhythms, and so can a too-narrow amplitude band (Aru et al. 2015). Look at the raw traces and the phase–amplitude plot before drawing conclusions. Likewise, spikes of one burst land close together in phase and can raise PPC; compare units or trials rather than reading one number alone, or use PPC across trials. A strictly periodic test signal (a pure sinusoid whose amplitude another pure sinusoid modulates) keeps its coupling under any time shift, so the surrogate test can't reject it however strong the coupling (p near 0.5 on such a signal); recordings, and test signals with some phase jitter, don't have this problem, and the MI itself is still right (it matched tensorpac's Tort MI on the same phase and amplitude).
References
Amarasingham A, Harrison MT, Hatsopoulos NG & Geman S (2012). Conditional modeling and the jitter method of spike resampling. Journal of Neurophysiology, 107(2):517–531. https://doi.org/10.1152/jn.00633.2011. The spike CCG's jitter bands, and pattern jitter for bursting neurons.
Aru J, Aru J, Priesemann V, Wibral M, Lana L, Pipa G, Singer W & Vicente R (2015). Untangling cross-frequency coupling in neuroscience. Current Opinion in Neurobiology, 31:51–61. https://doi.org/10.1016/j.conb.2014.08.002. Pitfalls of phase–amplitude coupling, surrogates, and amplitude bandwidth.
Bendat JS & Piersol AG (2010). Random Data: Analysis and Measurement Procedures, 4th ed. Wiley. https://doi.org/10.1002/9781118032428. Coherence phase and the time lag it implies.
Berens P (2009). CircStat: a MATLAB toolbox for circular statistics. Journal of Statistical Software, 31(10):1–21. https://doi.org/10.18637/jss.v031.i10. The Rayleigh test as computed here.
Brody CD (1999). Correlations without synchrony. Neural Computation, 11(7):1537–1551. https://doi.org/10.1162/089976699300016133. Why a shared stimulus or slow co-modulation makes a CCG peak, and what the shift predictor and jitter remove.
Buccino AP, Hurwitz CL, Garcia S, Magland J, Siegle JH, Hurwitz R & Hennig MH (2020). SpikeInterface, a unified framework for spike sorting. eLife, 9:e61834. https://doi.org/10.7554/eLife.61834. The Spike Sorter's amplitude cutoff and presence ratio are computed as its quality metrics compute them.
Canolty RT, Edwards E, Dalal SS, Soltani M, Nagarajan SS, Kirsch HE, Berger MS, Barbaro NM & Knight RT (2006). High gamma power is phase-locked to theta oscillations in human neocortex. Science, 313(5793):1626–1628. https://doi.org/10.1126/science.1128115. Time-shift surrogates for coupling.
Cotterill E, Charlesworth P, Thomas CW, Paulsen O & Eglen SJ (2016). A comparison of computational methods for detecting bursts in neuronal spike trains and their application to human stem cell-derived neuronal networks. Journal of Neurophysiology, 116(2):306–321. https://doi.org/10.1152/jn.00093.2016. The burst summary's interburst interval.
Eden UT & Kramer MA (2010). Drawing inferences from Fano factor calculations. Journal of Neuroscience Methods, 190(1):149–152. https://doi.org/10.1016/j.jneumeth.2010.04.012. The Fano factor's confidence interval and test against 1.
Ekanadham C, Tranchina D & Simoncelli EP (2014). A unified framework and method for automatic neural spike identification. Journal of Neuroscience Methods, 222:47–55. https://doi.org/10.1016/j.jneumeth.2013.10.001. The Spike Sorter's handling of overlapping spikes as sums of templates.
Fujisawa S, Amarasingham A, Harrison MT & Buzsáki G (2008). Behavior-dependent short-term assembly dynamics in the medial prefrontal cortex. Nature Neuroscience, 11(7):823–833. https://doi.org/10.1038/nn.2134. Pointwise and global jitter bands for a CCG.
Gerstein GL & Kiang NY-S (1960). An approach to the quantitative analysis of electrophysiological data from single neurons. Biophysical Journal, 1(1):15–28. https://doi.org/10.1016/S0006-3495(60)86872-5. The peri-stimulus time histogram.
Harrison MT & Geman S (2009). A rate and history-preserving resampling algorithm for neural spike trains. Neural Computation, 21(5):1244–1258. https://doi.org/10.1162/neco.2008.03-08-730. Pattern jitter, which keeps a train's bursts in the spike CCG's jitter bands.
Hartigan JA & Hartigan PM (1985). The dip test of unimodality. Annals of Statistics, 13(1):70–84. https://doi.org/10.1214/aos/1176346577. The Spike Sorter's split of clusters that hold two units and merge of clusters that are one unit cut in two.
Hill DN, Mehta SB & Kleinfeld D (2011). Quality metrics to accompany spike sorting of extracellular signals. Journal of Neuroscience, 31(24):8699–8705. https://doi.org/10.1523/JNEUROSCI.0971-11.2011. The Spike Sorter's contamination estimate and amplitude cutoff.
Holt GR, Softky WR, Koch C & Douglas RJ (1996). Comparison of discharge variability in vitro and in vivo in cat visual cortex neurons. Journal of Neurophysiology, 75(5):1806–1814. https://doi.org/10.1152/jn.1996.75.5.1806
Legéndy CR & Salcman M (1985). Bursts and recurrences of bursts in the spike trains of spontaneously active striate cortex neurons. Journal of Neurophysiology, 53(4):926–939. Poisson-surprise burst detection.
Llobet V, Wyngaard A & Barbour B (2022). Automatic post-processing and merging of multiple spike-sorting analyses with Lussac. bioRxiv 2022.02.08.479192. The corrected refractory-violation contamination estimate, f = 1 − √(1 − 2c), that counts violations between two contaminating spikes.
Magland JF & Barnett AH (2015). Unimodal clustering using isotonic regression: ISO-SPLIT. arXiv:1508.04841. https://arxiv.org/abs/1508.04841. The Spike Sorter's split of clusters that hold two units and merge of clusters that are one unit cut in two.
Maris E & Oostenveld R (2007). Nonparametric statistical testing of EEG- and MEG-data. Journal of Neuroscience Methods, 164(1):177–190. https://doi.org/10.1016/j.jneumeth.2007.03.024. The max-statistic surrogate test behind the comodulogram's whole-map test.
Nawrot M, Aertsen A & Rotter S (1999). Single-trial estimation of neuronal firing rates: from single-neuron spike trains to population activity. Journal of Neuroscience Methods, 94(1):81–92. https://doi.org/10.1016/S0165-0270(99)00127-2. Gaussian kernel smoothing of firing rates.
Özkurt TE & Schnitzler A (2011). A critical note on the definition of phase–amplitude cross-frequency coupling. Journal of Neuroscience Methods, 201(2):438–443. Direct PAC.
Pachitariu M, Steinmetz NA, Kadir SN, Carandini M & Harris KD (2016). Fast and accurate spike sorting of high-channel count probes with KiloSort. Advances in Neural Information Processing Systems, 29:4448–4456. Template matching and overlapping spikes.
Pasquale V, Martinoia S & Chiappalone M (2010). A self-adapting approach for the detection of bursts and network bursts in neuronal cultures. Journal of Computational Neuroscience, 29(1–2):213–229. https://doi.org/10.1007/s10827-009-0175-1. The log-scale ISI histogram's ten bins per decade.
Perkel DH, Gerstein GL & Moore GP (1967). Neuronal spike trains and stochastic point processes. II. Simultaneous spike trains. Biophysical Journal, 7(4):419–440. https://doi.org/10.1016/S0006-3495(67)86597-4. The shift predictor.
Pillow JW, Shlens J, Chichilnisky EJ & Simoncelli EP (2013). A model-based spike sorting algorithm for removing correlation artifacts in multi-neuron recordings. PLoS ONE, 8(5):e62123. https://doi.org/10.1371/journal.pone.0062123. Overlapping spikes as sums of templates.
Pouzat C, Mazor O & Laurent G (2002). Using noise signature to optimize spike-sorting and to assess neuronal classification quality. Journal of Neuroscience Methods, 122(1):43–57. https://doi.org/10.1016/S0165-0270(02)00276-5. The Spike Sorter's noise whitening.
Prerau MJ, Brown RE, Bianchi MT, Ellenbogen JM & Purdon PL (2017). Sleep neurophysiological dynamics through the lens of multitaper spectral analysis. Physiology, 32(1):60–92. Multitaper spectrogram settings.
Quiroga RQ, Nadasdy Z & Ben-Shaul Y (2004). Unsupervised spike detection and sorting with wavelets and superparamagnetic clustering. Neural Computation, 16(8):1661–1687. https://doi.org/10.1162/089976604774201631. The noise level median(|x|)/0.6745 used for automatic thresholds.
Schmitzer-Torbert N, Jackson J, Henze D, Harris K & Redish AD (2005). Quantitative measures of cluster quality for use in extracellular recordings. Neuroscience, 131(1):1–11. https://doi.org/10.1016/j.neuroscience.2004.09.066. Isolation distance and L-ratio.
Shimazaki H & Shinomoto S (2007). A method for selecting the bin size of a time histogram. Neural Computation, 19(6):1503–1527. https://doi.org/10.1162/neco.2007.19.6.1503 (the PSTH bin width Suggest button above).
Shinomoto S, Shima K & Tanji J (2003). Differences in spiking patterns among cortical neurons. Neural Computation, 15(12):2823–2842. https://doi.org/10.1162/089976603322518759. The burst summary's LV.
Smith MA & Kohn A (2008). Spatial and temporal scales of neuronal correlation in primary visual cortex. Journal of Neuroscience, 28(48):12591–12603. https://doi.org/10.1523/JNEUROSCI.2929-08.2008. The jitter-corrected spike CCG.
Suner S, Fellows MR, Vargas-Irwin C, Nakata GK & Donoghue JP (2005). Reliability of signals from a chronically implanted, silicon-based electrode array in non-human primate primary motor cortex. IEEE Transactions on Neural Systems and Rehabilitation Engineering, 13(4):524–541. https://doi.org/10.1109/TNSRE.2005.857687. The Spike Sorter's SNR (p-p ÷ 2σ).
Thomson DJ (1982). Spectrum estimation and harmonic analysis. Proceedings of the IEEE, 70(9):1055–1096. The multitaper method.
Tort ABL, Komorowski R, Eichenbaum H & Kopell N (2010). Measuring phase-amplitude coupling between neuronal oscillations of different frequencies. Journal of Neurophysiology, 104(2):1195–1210. https://doi.org/10.1152/jn.00106.2010. The modulation index and the phase–amplitude plot.
Vinck M, Battaglia FP, Womelsdorf T & Pennartz C (2012). Improved measures of phase-coupling between spikes and the local field potential. Journal of Computational Neuroscience, 33(1):53–75. https://doi.org/10.1007/s10827-011-0374-4. PPC across trials (PPC₁).
Vinck M, van Wingerden M, Womelsdorf T, Fries P & Pennartz CMA (2010). The pairwise phase consistency: a bias-free measure of rhythmic neuronal synchronization. NeuroImage, 51(1):112–122. https://doi.org/10.1016/j.neuroimage.2010.01.073. Spike–LFP phase locking.
Westfall PH & Young SS (1993). Resampling-Based Multiple Testing: Examples and Methods for p-Value Adjustment. Wiley. The step-down max-statistic test that marks PSTH bins that differ from baseline.
Zar JH (1999). Biostatistical Analysis, 4th ed. Prentice Hall. Chapter 27: the Rayleigh test and its p-value.
E-Phys Tools
The E-Phys Tools menu (between Graph Utilities and Lab Tools) holds specialized analyses that run on the front graph window straight from the menu, without opening the inspector. Each needs a particular kind of recording, described below. AP Detection, Synapse Detection and LFP / Spike Train Analysis are inspector tabs with their own pages in this guide. Spectrogram, Cross-Correlation / Coherence and LFP Oscillations are available both here (acting on the front graph) and as sections of the LFP / Spike Train Analysis tab; both routes give the same results. The tools that open their own window (Spectrogram, Cross-Correlation / Coherence, LFP Oscillations, Spike Sorter, Slow AHP Analysis) keep one window per graph: choosing the command again brings that graph's window forward, even when another graph has the same name.
Every command except Cross-Correlation / Coherence and LFP Oscillations needs sampled recordings and says so for a spike-train raster (for a raster, LFP Oscillations shows only its spike–LFP section). Times in the Data Log (step start and end, sag peak time) are as the X axis shows them, after any Set X = 0 shift. A command still running ignores a second request (the Mac beeps). You can keep working on the graph while one runs: it measures the data as they were when you chose it. When a family has a short (aborted) sweep, the sweeps shorter than most are left out when finding the step, so the step is still found in full. If you edit the graph meanwhile, VI / IV Plot, Firing Properties, Sag Analysis, Membrane Test, Spectrogram, Slow AHP Analysis and the LFP Oscillations tools say so in the Data Log, so you can run them again on the edited data.
VI Plot (Voltage–Current relationship)
Requires: a current-clamp Graph with a voltage-response channel and a current-command channel, recorded during a series of current steps (one step size per sweep).
- Use E-Phys Tools → VI Plot. For each sweep, @Graph measures the injected current and the steady-state voltage response (mean over the last 20% of the step, ending 0.5 ms before the step's end; the baseline likewise ends 0.5 ms before the step).
- The result plots voltage (Y) against injected current (X), usually linear below threshold. The slope of the linear part, from the steady-state responses, is the input resistance (MΩ). IPFX fits the peak deflection of its hyperpolarizing sweeps instead, so the two can differ where Iₕ sags.
- VI Plot and IV Plot stop with a message when the family looks recorded in the other clamp mode, judged from how quickly the voltage reaches its new level at each step: at once for a voltage command, gradually for a charging membrane. The check needs at least 2 sweeps.
- Input resistance is fitted over the linear range around 0 pA, found from the data because it depends on the cell (±50 pA may suit a pyramidal cell but not a high-resistance cerebellar granule cell). Starting from the step nearest 0 (or 0 itself, when no 0 pA step was run) with one step either side, the range grows a step at a time, on both sides together while it stays linear, then on whichever side still is. Growing from the center keeps the range balanced around 0 where the data allow. The Data Log reports the range and how many sweeps it held, and the plotted line spans it.
- Linear here means the slope changes by no more than 10% from one end of the range to the other (the slope of a quadratic fitted to it, checked on the whole range and on each side of 0). With 7 or more steps @Graph estimates the noise, and only curvature larger than the noise can end the range. With fewer, noise alone can end it early (often after 3 steps), and the Data Log then says what range allowing for noise would give (see the options below).
- Special cases for the input resistance fit: if the steps either side of 0 already bend by more than 10%, @Graph keeps them (they give the slope at 0) and says so in the Data Log. It fits one side only when that side is much straighter, as when every depolarizing step rectifies (giving −50 to 0 pA, say). When no step is near 0, (0, 0) is added as a point (the response is baseline-subtracted, so it is 0 there): the Data Log says so ('plus the origin'), the sweep count leaves it out, and R² includes it. With only 2 steps in the fit, the Data Log warns that there are too few to tell whether the range is linear.
- A single sweep an odd event moved (a spontaneous depolarization, a large EPSP) is dropped from the fit rather than allowed to end the range early. Each sweep is compared with a curve through its six nearest neighbors, which follows rectification but not one stray point; a sweep more than 4 robust standard deviations off is dropped, one at a time, at most 20% of the sweeps and only with 7 or more. Dropped sweeps stay in the plot and are marked † in the Data Log. A single odd sweep can hide from this rule by pulling its neighbors' curves toward it, so the Data Log also names any sweep a robust fit of the whole curve would drop (see the options below).
- Options (Settings → Neurophysiology, all off by default; they apply to the menu, Batch Processing, Protocols and the AI Assistant): 'Fit the line through the origin' fits the range's steps by a line through (0, 0), and R² is then measured about 0, as R's lm(y ~ 0 + x) reports it. 'Allow for noise with 5 or 6 steps' estimates the noise from the scatter about a quadratic through all the steps, so noise alone no longer ends the range while real curvature still does (the IV Plot always allows for noise, from the holding current). 'Flag outlier sweeps with a robust fit' drops sweeps far off a robust (Huber) quadratic through all the steps, from 6 steps: more than 4 robust SDs off (5 with 6 steps). In simulated families it caught a 2 mV error at +20 pA in 72 to 97% of runs with 7 to 11 steps, where the default rule caught 2 to 60%.
- Sweeps that fire action potentials (a rise of more than 20 mV within 1 ms, the usual 20 V/s criterion) are still plotted, but their steady-state mean includes the spikes, so they are left out of input resistance and τ. The Data Log marks them with *.
- Membrane τ: fitted for each sweep that didn't fire, as V(t) = V∞ + A·e^(−t/τ) by nonlinear least squares from where the response first reaches 10% of its peak deflection to that peak (the method of the Allen Institute's IPFX). Starting at 10% skips the bridge artifact at the step; ending at the peak keeps out the sag after it; and V∞ is fitted rather than taken from the end of the step. Per-sweep values go to the Data Log with the VI table; a sweep whose response is too small (under 5× the baseline noise) or too brief to fit is skipped (shown as a dash). The reported membrane τ is the mean over the hyperpolarizing sweeps, as depolarizing steps recruit active conductances that shorten it; all fitted sweeps are averaged only when no hyperpolarizing sweep was fitted.
- Baseline Vm: the resting potential before the step, averaged over all sweeps. The summary table (Batch Processing, Protocols) says beside it whether junction-potential correction was taken off it.
- The output graph has both axes crossing at zero, no junction-potential correction, and axis labels 'Current step' (X) and 'Steady-state voltage response' (Y), in the recording's units.
IV Plot (Current–Voltage relationship)
Requires: a voltage-clamp Graph with a current-response channel and a voltage-command channel, recorded during a series of voltage steps (one step size per sweep).
- Use E-Phys Tools → IV Plot. For each sweep, @Graph measures the command voltage and the steady-state current (mean over the last 20% of the step, ending 0.5 ms before the step's end, so the capacitive transient at the edge stays out; the baseline likewise ends 0.5 ms before the step).
- The result plots current (Y) against the voltage step (X, the change from the holding potential). Baseline current and holding potential (junction-potential corrected when correction is on) go to the Data Log.
- Input resistance comes from the linear range around the holding potential, found by the VI Plot's rule with the axes swapped: from the 0 mV step and one step either side, the range grows a step at a time while the slope (here a conductance) changes by no more than 10% beyond the noise. The holding potential is the center because it is commanded, so it is known exactly, and the baseline-subtracted current is 0 there by construction; the cell's zero-current potential has to be read off the curve, and the Data Log says when it lies outside the range.
- The noise allowed for comes from the holding current: every sweep returns to the same holding command, so the scatter of its baseline current from sweep to sweep measures the noise whatever shape the curve has. The VI Plot's estimate (the scatter about a cubic through all the steps) would take the strong bend of voltage-gated currents for noise and let the range run into them. So an IV family always allows for noise, and 'Allow for noise with 5 or 6 steps' does not apply to it.
- The current is the measured variable and the voltage is commanded, so the current is regressed on the voltage and input resistance = 1 / slope.
- The Data Log gives the range in command potentials and as steps from the holding potential, how many steps it held, and the steps left out on each side and why: for example 'nonlinear, the conductance rises (outward rectification)' above the range, or inward rectification (Kir) below it. A sweep beyond the range is reported there, not marked † as an outlier. When even the steps nearest the holding potential bend by more than 10%, it warns that the value includes voltage-gated current: record smaller steps near the holding potential.
- On the simulated IV family (a 250 MΩ leak plus a delayed-rectifier K⁺ current) the range is −100 to −70 mV and input resistance 247 MΩ, as the noise-free currents give over those steps.
- Fitting through the origin, robust outlier flagging and the clamp-mode check work as for the VI Plot. For a range of your own, run Linear Fit on the IV plot over it: the slope is a conductance, and 1 / slope is the input resistance.
- The output graph has both axes crossing at zero, no junction-potential correction, and axis labels 'Voltage step' (X) and 'Steady-state current' (Y), in the recording's units.
- Rₛ-corrected voltage axis: in the Rₛ panel's Voltage clamp mode, turn on 'Correct the IV Plot's voltage axis for Rₛ'. The panel finds the uncompensated Rₛ as it does for the trace correction (a test pulse, the last Membrane Test, telegraphs or values you enter) and the graph keeps it. IV Plot then plots and fits each point at Vₘ = Vcmd − I·Rₛ (as a step from the holding Vₘ, which the holding current moves too) instead of at the command; the Data Log adds a Vcmd column. This needs no Erev and is exact for steady-state currents, voltage-gated ones included: the current is plotted at the potential the membrane actually reached. Input resistance then excludes Rₛ. It is not applied while a voltage-clamp trace correction stands, which already scales each current to its command. The AI Assistant's VI/IV tools use it too.
- Erev: with the axis corrected, the Data Log reports where the total current (holding current included) crosses zero, the zero of a line fitted to the two points either side of the first crossing, with its confidence interval by Fieller's method (at the confidence level in Settings). At zero current there is no Rₛ error, so for a single-compartment cell this is the reversal potential, and the Rₛ panel can use it ('Erev from the last IV Plot'). On a simulated I–V of a 100 MΩ leak reversing at −20 mV, recorded through 10 or 20 MΩ, the corrected plot gave −20.00 mV (CI ±0.03) and input resistance 100.0 MΩ, where the uncorrected one read 110 or 120 MΩ. On a simulated K⁺ family the corrected steady-state currents matched the true I–V within 0.4%; but only over the potentials the membrane reached (−80 to +2 mV for commands to +40 mV at 15 MΩ), since no correction can supply data at potentials never reached.
Firing Properties (rheobase and F–I curve)
Requires: a current-clamp Graph with a voltage channel, recorded during a family of current steps (one step per sweep). Use E-Phys Tools → Firing Properties…
- Spikes are found by AP Detection with the settings of its last run (or the ones the panel starts with): every AP in each sweep, counted for a step when its threshold falls within the step, its start and end included.
- Step currents come from the file's stimulus protocol when it has one (each step's change from the level before it), else from a recorded current channel (measured as in the VI Plot), else from values you enter: the first step and the increment per sweep, or every sweep's current, with the step's start and end as the X axis shows them. Currents are reported in pA.
- Per sweep: the spike count; the mean firing rate (spikes in the step / step duration); the instantaneous frequency of the first and of the last ISI (1 / ISI); the first-spike latency (from the step's onset to the first threshold); the ISI CV (sample SD / mean, from 3 spikes); and the adaptation index as the Allen Institute's IPFX defines it (adapt): the mean of (ISIᵢ₊₁ − ISIᵢ) / (ISIᵢ₊₁ + ISIᵢ), near 0 for regular firing and positive when firing slows. IPFX's isi_cv uses the population SD: multiply by √((n − 1)/n), for n ISIs, to compare.
- Rheobase: the smallest positive step that fired at least one AP. It is only as precise as the steps, so the Data Log also gives the step below it that didn't fire (rheobase lies between the two), or says that the smallest positive step tested already fired (rheobase is then that step or less). Steps within 1% of the largest of 0 count as 0, and a sweep that fires at 0 pA or below is noted (spontaneous firing).
- F–I curve: mean rate against step current, plotted in a new window. With 'Fit the F–I slope' on (the default), a least-squares line through the steps at or above rheobase that fired gives the F–I slope in Hz/pA, as IPFX's fi_fit_slope. A rate that falls at the largest steps (depolarization block) is noted, since a line then fits only below it. Steps above rheobase that fire no AP (depolarization block, or a cell running down) are plotted at 0 Hz, left out of the F–I slope, and named in the Data Log.
- Maximum firing rate: the highest mean rate over the step, with its current.
- The table goes to the Data Log. Batch Processing, Protocols and the AI Assistant run it too, and Batch can save each F–I curve as a .@graph file. Checked against IPFX on simulated cells: the same rheobase, adaptation index within 0.001, and the same spike counts (so rates and F–I slope) except where a threshold falls right at the step's start or end.
Sag Analysis
Requires: current-clamp voltage sweeps recorded during hyperpolarizing (negative) current steps, showing a sag: an initial hyperpolarization that partly recovers before the step ends, typical of HCN (Iₕ) channels.
- Use E-Phys Tools → Sag Analysis.
- For each sweep, @Graph finds the sag peak (the most negative point of a 4 ms running mean, so noise doesn't deepen it, searching until the trace clearly starts to recover, at most 400 ms into the step) and the steady-state voltage (mean over the last 20% of the step), both relative to the pre-step baseline.
- Step timing comes from the current channel. Without one it comes from the file's protocol when it has one, or else from the voltage sweeps themselves: each edge is where the sweeps first leave the level they held before it by more than three times that level's own 1 ms noise (usually within 1 to 2 ms of the real edge).
- Sag ratio (%) = (peak − steady state) / peak × 100, reported for the sweep whose peak falls closest to 20 mV below its baseline. The sag slope over the 50 ms after the peak is also reported. IPFX instead uses the sweep whose peak potential is closest to −100 mV, and takes the steady state over the last 30 ms of the step.
- Only a sweep whose peak and steady state are both at least 1 mV below its baseline counts. A graph with none (depolarizing steps only, or a step edge found in the wrong place) is refused with a message rather than given a ratio over noise, and so is a graph that records only current.
- Results are written to the Data Log. To plot a column, select it there and press ⇧⌘G.
Slow AHP Analysis
Requires: a current-clamp Graph with a spike train. @Graph detects the train and measures the afterhyperpolarization after its last spike: peak amplitude relative to baseline, the slow AHP at a fixed latency after the step, recovery time from an exponential fit, and the area from the peak to recovery. E-Phys Tools → Slow AHP Analysis… opens a window where you set the options and run it. All times are ms from the sweep's start.
- Spike Detection: spikes are peaks above Threshold (mV) (default 0 mV; not found by slope, so capacitive artifacts aren't counted) and at least Min. separation between spikes apart (default 5 ms, so above 200 Hz every second spike is missed; lower it for faster firing). A spike whose peak stays below the threshold isn't counted, so set the threshold below the smallest late spike in an adapting train. Train Grouping: spikes closer than Max. inter-spike gap (default 500 ms) form one train, and trains with fewer than Min. spikes per train (default 3) are ignored.
- Baseline, Before each train (the default): the median of up to 200 ms (Length) ending 2 ms before the train's current step starts, from the file's protocol. Without a protocol, it ends where the trace starts rising toward the first spike (the first point, walking back, where it rises less than 0.05 mV/ms). Or choose Time window (Fixed values, or Live from cursors), one per sweep, or Manual value. A median, so a spontaneous spike in the window doesn't shift it. The Data Log gives each train's window and warns when it holds a spike, overlaps a train (its step, spikes or AHP), was cut short, or drifts by more than 0.5 mV.
- The AHP peak is the lowest point of the trace smoothed over ±10 ms, within the Peak search duration (default 100 ms). The search starts at the later of the last spike plus a gap (Start, default 5 ms after the last spike's peak) and the end of the current step: from the protocol or, without one, where the trace falls at least 5 mV off a plateau, so an adapting cell's depolarized plateau isn't read as an AHP. The amplitude is baseline minus the trace averaged over the Peak averaging window (default 20 ms, one cycle of 50 Hz mains hum, so hum doesn't bias it; 0 uses the single sample at the peak).
- When the peak is within 10 ms of the search window's end, or the trace keeps falling past it, the Data Log warns that the true peak may lie beyond: a slow AHP often peaks several hundred ms after the train, so lengthen the window or use the fixed-latency value. A trace above baseline at the peak is flagged too.
- Slow AHP at a fixed latency: baseline minus the mean voltage from 0.5 to 1 s after the current step ends (after the last spike when no step end is known), the usual measure of the slow AHP. The span can be changed. The peak above, found within 100 ms of the step's end, is what many studies call the medium AHP (mAHP), and this later value the slow AHP (sAHP). Both are measured from the baseline before the train, not from the spike threshold as AP Detection's AHP is. Beside it, the integral over a fixed span (from the step's end to 1 s after it by default): the area between baseline and trace, which, unlike the peak-to-recovery integral, doesn't depend on where recovery is placed, so it compares directly between cells.
- Each train's windows (recovery, fit, integral and fixed latency) end before the next train's onset or the next spike of any kind, whichever comes first, so the next step's upstroke or a stray spike isn't fitted.
- Recovery is fitted with a single or double exponential on the trace averaged into 1 ms bins (a 60 s sweep fits in well under a second). A single exponential starts 400 ms after the peak, skipping the fast early part; choosing the double sets the delay to 0, since it needs that part to determine its fast τ. A time constant shorter than two bins or longer than three times the fitted span is reported as "not determined", and fewer than 10 points give no fit.
- Recovery time is when the fit reaches a set fraction (default 95%) of the way back to baseline, within the recovery window. If the fit is already past that point where it starts, the time is read from the trace smoothed over ±10 ms before it. If it never gets there, the result says "not reached" and how far it recovered.
- It measures the selected group's visible sweeps, skipping fit curves and AP markers, and every row gives its sweep. Voltages are converted to mV whatever the recording's unit (V, mV or µV); sweeps whose unit isn't a voltage are skipped, and so are voltage sweeps with 16 or fewer distinct levels, which are a command waveform rather than a recording. The Data Log lists both. Missing samples are skipped by every average. With more than one train, the Data Log also gives the mean, SD and n of each measurement across trains (recovery time and integral over the trains that recovered).
A "not reached" result with a high recovered percentage usually means the recovery window is too short for that trace, not that the cell failed to recover. By default the search runs to the end of the sweep or the next train; if 'Limit recovery search to a maximum duration' is on, raise the limit or turn it off. Otherwise record longer sweeps, or space the trains further apart.
Spectrogram
Requires: any Graph. E-Phys Tools → Spectrogram… opens a settings window for the front graph; the Spectrogram section of the LFP / Spike Train Analysis tab has the same controls for that tab's graph.
- Like PSD / FFT, but the spectra of successive windows are kept separate instead of averaged, giving a frequency × time heatmap. Handy for power that changes over time, such as theta and gamma power during behavior or LFP power around a stimulus.
- Choose the Sweep, the Window size (samples) (default 256, rounded down to a power of 2, minimum 64; shorter windows give finer time resolution but coarser frequency resolution), the Overlap (default 50%), 'Restrict max frequency shown' with its Max frequency (Hz), and 'Log scale (dB)' (on by default), then click Compute Spectrogram. The status line gives the window used, in ms, and its frequency resolution. A window holding a missing (blank) sample is left out of its column's average, and a column with no complete window shows as a gap.
- The result opens in a new heatmap window: frequency on one axis, time on the other, power as color. Power is a one-sided density (units²/Hz, or dB re 1 units²/Hz; the chart title gives the unit), scaled as PSD / FFT is, so the two agree. It opens unnormalized on a sequential purple–teal–yellow scale; the heatmap inspector's z-score options are there if you want each frequency's change over time instead.
- Frequency runs up the vertical axis, lowest at the bottom. Times are as the graph's X axis shows them, after Set X = 0 or the file's own start time.
- Each window's mean is removed before its FFT (Hann window). Very long windows (8192 samples or more) give more frequency bins than a heatmap can draw; adjacent bins are then averaged into one row (0 Hz keeps a row of its own), so the whole range up to the maximum frequency still shows. Likewise a long recording gives more windows than it can draw; neighboring windows are then averaged into one column, so every sample still counts and a short burst still shows. For a recording with channels at different sample rates, only each sweep's own samples are used. Values match scipy.signal.spectrogram with window 'hann', detrend 'constant' and density scaling (to single precision; the FFT is single precision).
- Method: Short-time FFT uses one Hann window per segment. Multitaper multiplies each window of T seconds by several Slepian tapers and averages the results (Thomson 1982; as Chronux and Prerau et al. 2017), giving a smoother map. NW sets the frequency resolution, 2W = 2·NW/T, shown under the settings. The automatic taper count, 2NW − 1, is the most that stay well concentrated. Detrend removes each window's mean (default), a fitted line, or nothing. Padding gives finer bins, not finer resolution.
The spectrogram is computed in the background, so you can keep working. A progress bar shows how far it has got; click Cancel to stop it, and no window opens. Closing the window also stops it. With a long multitaper window (several seconds of samples), computing the tapers takes a noticeable share of the time, and the bar includes it.
Cross-Correlation / Coherence
Requires: two signals to compare, for example to ask whether two units fire together or two LFP channels are phase-locked. E-Phys Tools → Cross-Correlation / Coherence… compares the front graph (Signal A) with another open graph or another sweep of the same graph (Signal B). The Cross-Correlation / Coherence section of the LFP / Spike Train Analysis tab has the same controls, with that tab's graph as Signal A, and gives identical results. Choose the analysis, Sweep (or Train) A, where Signal B comes from ('this graph', or any open graph window, listed as windows open and close), and Sweep B, then click Run; results open in a new graph window with the axis in the right unit (s for lags, Hz for coherence).
- Spike-train cross-correlogram: spike-timing correlation between two spike-train sources (such as rasters from Extracellular AP Detection, or spike-sorted units), showing synchrony, lead or lag. Both signals must be spike trains. Each bar counts B spikes at that lag from an A spike (positive lag: B after A). Choosing the same train as A and B gives an autocorrelogram; each spike's pairing with itself is then left out of the zero-lag bin.
- Axes (spike-train cross-correlogram): Bin width (default 5 ms) and Max lag (default 200 ms) set the lag axis. Bins are centered on whole multiples of the bin width; each runs from half a bin below its center up to, but not including, half a bin above, as numpy.histogram's bins do, and a lag exactly on an edge is judged in whole samples. Y scale: Counts (the default), or Rate (Hz), which is B's firing rate around an A spike (counts ÷ number of A spikes ÷ bin width) and so compares across bin widths and train sizes.
- Chance level (spike-train cross-correlogram): a second trace shows what each bin would hold if the trains were independent, from each train's mean rate over its recorded span (for a spike-sorted file, which doesn't store it, from that train's first to its last spike, the rule every spike-train tool follows). It is edge-corrected using both trains' spans: an A spike near the end of a sweep, or outside B's span, has less of B to pair with at long lags, so the line falls toward the ends of the lag axis (by about |lag| ÷ sweep length). On short sweeps the correlogram of two unrelated trains has the same tent shape, so compare the peak with the line, not with the outer bins. A peak well above it suggests a real timing relationship; the line is a guide, not a significance test.
- Spike CCG over trials, shift predictor and jitter bands: two units that both respond to a stimulus make a broad CCG peak even with no connection between them (Brody 1999). 'All trials of both units' sums trial k of Train A's unit with trial k of Train B's unit over every trial; units are found from Spike Sorter names ('<unit>: <sweep>'), and a raster without them counts each train as a trial. The note under the switch shows which trials were paired, and the chance line is kept (summed over trials).
- Shift predictor (Perkel et al. 1967): the same correlogram between different trials, which share the stimulus but no moment-to-moment coupling. All shifts, averaged (the default) sums A's trial j with B's trial k for every j ≠ k and divides by (trials − 1), the least noisy form and equal to the PSTH predictor; Next trial pairs trial k with k + 1 (the last with the first). The result adds the predictor and the corrected CCG (raw − predictor), which is near 0 where only the stimulus links the two.
- Jitter bands (Amarasingham et al. 2012) test for fine-timescale synchrony. Every spike of B is moved to a random time within its own window (Window, default 20 ms, typically 10 to 25 ms, tiling each trial from its start) while A stays as recorded, which keeps B's firing-rate changes slower than the window and destroys only its fine timing relative to A. The CCG is recomputed, binned the same way, for each surrogate (1000 by default). The random draws are seeded from the data, so the same trains always give the same bands. An autocorrelogram jitters its one train.
- Pattern jitter (Harrison & Geman 2009): spikes of B no more than R apart ('Preserve spike patterns shorter than R', 10 ms by default) keep their exact intervals and move together, and every longer interval stays longer than R, so B's bursts and pauses survive and only their timing relative to A is tested. Every surrogate that follows these rules is equally likely, and they are drawn exactly by the paper's algorithm (on a time grid of 1/1000 of the window, at least 10 µs, made coarser for very long trains so the tables stay under about 10 million entries).
- Choosing R: set it to cover B's burst intervals (the ISI / Burst Detection max interval is a good guide); a larger R holds more of B in place, which leaves less room to detect weak synchrony. R = 0 is plain interval jitter, which breaks B's own bursts up: two bursty trains then cross the global band far more often than 5% (17 to 37% in simulations with bursts of 4 to 6 spikes), so use 0 only when B doesn't fire in bursts.
- Reading the jitter bands: the pointwise band is each lag's 2.5th to 97.5th percentile, and about 1 lag in 20 crosses it by chance. The global band (Fujisawa et al. 2008) is set from each surrogate's highest and lowest bin over all lags shown, so an unrelated pair crosses it anywhere only about 5% of the time: a bin beyond it is significant. In simulations of 300 independent pairs each with R = 10 ms, 4 to 8% crossed it (where an exact test reads about 6%, with the 200 surrogates used there), whether neither, one or both trains fired in bursts (6.0% over 1,200 pairs of bursty trains).
- Jitter-corrected CCG: the mean of the surrogates is shown too, and its name says which jitter was used. Last comes the jitter-corrected CCG (raw − jitter mean, Smith & Kohn 2008), which takes out co-modulation slower than the window and is near 0 where the two aren't synchronized more finely than that.
- Checks on the CCG: values match numpy. Plain jitter surrogates match the Elephant toolkit's jitter_spikes, and their mean matched the analytically expected jittered CCG within its Monte Carlo error. Pattern jitter surrogates match an independent implementation of Harrison and Geman's algorithm. References are under LFP / Spike Train Analysis.
- Signal cross-correlation: correlation between two continuous signals over a range of lags (positive lag: B follows A), up to Max lag (default 200 ms). Both signals have their mean removed. 'Normalize (±1 scale)' (on by default) divides by the square root of the product of the two mean-removed signals' sums of squares over the whole record (MATLAB's xcov 'coeff', which is xcorr 'coeff' after removing the means), so identical signals read 1 at zero lag; because the overlap shrinks at longer lags while the divisor doesn't, values taper toward the ends of the lag range. Both signals must share a sample rate. The maximum lag is rounded to the nearest whole sample. The lag range stops at the record's length (and at 500,000 samples); the result's name says when it was shortened. A missing sample inside a trace counts as its mean, adding nothing at any lag.
- Lining up the two signals: one rule for every analysis here, spike trains included. When both sweeps carry a recording clock (a recording date and sweep start times, as two graphs of one file, two files of one session, or two sweeps of one graph do), they are lined up on that clock and only the time both cover is used, and the result's name (and the Data Log) says so. Channels of one sweep were recorded together and are compared as they are. Two sweeps recorded at different times (sweep 1 against sweep 3, say) don't overlap on the clock, so the comparison is refused with an explanation and a button, Compare from each sweep's start (not simultaneous). It lines them up from each sweep's start, as trials, and the result's name, legend and Data Log entry say 'not simultaneous: trial-relative comparison (from each sweep's start)'. When one or both have no recording clock, they are compared from their starts and the result's name says so. Missing samples at either end (a blank tail some files carry) are left out of both. For spike trains, B's spike times and recorded span are moved onto A's clock and cut to the time both cover, which the chance level and the jitter bands then use. Over trials, each pair (trial k of A with trial k of B) is lined up on its own sweeps' clocks, and the shift predictor pairs trials in that trial-relative time.
- Coherence: magnitude-squared coherence, frequency by frequency, between two continuous signals, averaged over 50%-overlapping Hann-windowed segments (Welch's method, matching SciPy). A segment with a missing sample in either signal is left out, as in PSD / FFT, and too few samples for 2 segments gives an error rather than a misleading result.
- Segment size (coherence; samples, 0 = auto, the default) is rounded down to a power of 2 (at least 64) for the FFT, so 1000 uses 512. Auto uses the largest power of 2 up to a quarter of the record (at most 8192 samples), which averages at least 7 segments for records of 256 samples or more (fewer below that, down to 3 at 128 samples). The result's name gives the size used, its frequency resolution and the segment count. Coherence is biased upwards with few segments: two unrelated signals read about 1 ÷ (number of segments), so 0.5 from 2 segments means nothing.
- Significance level (coherence): a second trace is the 95% level for two independent signals, at each frequency: 1 − 0.05^(1/(K − 1)), with K the effective number of segments (the count reduced for their 50% overlap). About 1 frequency in 20 crosses it by chance, so look for a band of adjacent frequencies above it rather than a single bin. The line leaves out 0 Hz, the first frequency above it and the Nyquist frequency, where chance coherence runs higher (independent noise crossed it 15%, 8% and 10% of the time there, as SciPy's coherence gives: removing each segment's mean also reaches the first bin).
- Phase and time lag (coherence): two more panels show the cross-spectrum's phase, as B's phase lag behind A in degrees (the angle of SciPy's csd(b, a)), and, at the frequencies whose coherence is above the significance line, the time lag that phase implies: phase ÷ (360° × frequency), in seconds (Bendat & Piersol 2010). Both are positive when B lags A, as a positive cross-correlation lag is. A phase is known only up to whole cycles, so the lag is the one within half a period of zero: for a lag longer than that (above about 100 Hz for a 5 ms lag) the value wraps, and a steady slope of phase against frequency across a coherent band is the more reliable estimate.
LFP Oscillations
Requires: any Graph (a raster shows only the spike–LFP section). E-Phys Tools → LFP Oscillations… opens a window with Band Power Over Time, Hilbert Envelope and Phase, Phase–Amplitude Coupling and Spike-Triggered LFP and Phase Locking for the front graph: the same controls as those sections of the LFP / Spike Train Analysis tab, described on its page, with the same results.
Spike Sorter
Requires: a Graph with at least one continuous extracellular channel. E-Phys Tools → Spike Sorter… opens a window that detects and clusters spikes on one channel (or a group of channels you choose, such as a tetrode) of the front graph, lets you review and edit the clusters, and commits them as named spike-train units.
- Scope: a semi-automated sorter in the spirit of Plexon Offline Sorter, not a replacement for probe-based sorters such as Kilosort. @Graph knows nothing about electrode layout, so you choose which channels belong together.
- Detection: choose the Primary channel, 'Pre-filter to spike band' (on, 300–3000 Hz by default), Polarity (negative by default), and Threshold: Auto (× noise SD, a slider from 3 to 8, default 5) or a Manual value. Snippet window (default 2 ms) is the length of the waveform cut out, centered on each spike; a spike closer than half of it to a sweep's start or end is left out, since its waveform doesn't fit, and the status line counts those. Then click Detect & Sort; each run replaces the current result. A Cancel button beside it stops a run, leaving the current result as it was. After each spike, detection pauses for the Dead time (default 0.5 ms), so one spike isn't counted twice. Keep it shorter than the Refractory period (default 1.5 ms), which is used only for the quality measures: a lockout as long as the refractory period would make every refractory violation undetectable. The automatic threshold is the multiplier × the median noise level (median(|x|)/0.6745) over up to 20 sweeps spread through the recording, each read from up to 30 s (thirty 1 s stretches spread across a longer sweep, so an hour-long recording isn't judged by its first half-minute), and one threshold is used for every sweep, so a unit is detected by the same criterion throughout; the status line reports the value used. Each detected spike is re-centered on its true peak, and its time is refined between samples, so small timing jitter doesn't blur the clusters.
- Channel Group: optionally add more channels. Clustering then uses each spike's waveforms on all of them together, which helps when a unit looks different on nearby sites. The channels must share the primary's sample rate and length (otherwise the sorter says so and doesn't run), and every channel is read in the primary channel's unit (a channel shown in mV beside one in µV is converted), so a manual threshold, amplitudes, the best channel and template matching mean the same on all of them.
- Blank data (Channel Group): a channel with no signal (a disabled or zeroed contact) adds no features, and the status line names it. A spike whose waveform window touches blank (missing) samples, such as the gap between joined recordings, is left out and counted in the status line. Background windows over a blank are skipped, and if no usable background is left the status line says the features are unwhitened.
- Detect on (Channel Group) chooses where spikes are found. All channels in the group (the default) thresholds every channel at its own noise level (the same multiplier, or the same manual value), so a unit largest on any channel is found, not only one large on the primary channel. Primary channel only detects on the primary channel alone, as with a single channel.
- Spikes on several channels (Channel Group) count once: of crossings closer than the dead time (at least 0.3 ms), whatever their channels, the one largest relative to its channel's noise is kept (as SpikeInterface's 'locally exclusive' detection). The spike is timed on that channel, between samples, and its waveforms are cut on every channel at that time. The dead time therefore applies per spike, not per channel, which is what the contamination estimate assumes.
- Best channel (Channel Group): each cluster's best channel is the one where its average waveform is largest. Its SNR is measured there, the cluster list names it, and the Waveforms tab labels each channel with the clusters it is best for.
- Clustering runs the steps below in order. Always check the automatic result. Split, overlap check and merge run only with 'Auto cluster count' on (the default); set the cluster count yourself (K) to keep the clusters as k-means leaves them.
- Outliers (Clustering): 'Auto-exclude amplitude outliers' (on by default) keeps spikes with extreme amplitudes (usually movement or electrical artifacts) out of the clustering and puts them in their own 'Artifacts' cluster, which is left out of Commit by default, like a Noise cluster. A large real unit is not excluded: outliers whose amplitudes agree closely with each other (at least 20 spikes) are clustered like any other spikes.
- Features (Clustering): waveforms are reduced to 3 principal components, or with a channel group to 3 per channel (each channel's own, as in KlustaKwik, MClust, Kilosort and SpikeInterface; one set of components across all channels spends them on the largest channels and can miss two units that share a best channel). The components are taken after noise whitening: the background noise is measured between spikes and divided out (Pouzat et al. 2002), so the noise no longer dominates the components and one unit forms a round cloud rather than an elongated one.
- k-means (Clustering): spikes are grouped by the best of 5 k-means++ starts, so one unlucky start can't merge two units, with the number of clusters chosen automatically or set by you.
- Split (Clustering): any cluster that holds two units is cut in two by k-means, and the cut is kept when its spikes, projected on the line between the two halves, form two peaks (Hartigan's dip test at the 5% level); each half is tested again. This is the other half of ISO-SPLIT's split-and-merge (Magland and Barnett 2015), and it catches k-means putting two distinct units in one cluster while spending clusters on a few outlying spikes. A single unit forms one peak on that line, so it stays whole.
- Overlap check (Clustering): a small cluster (under a tenth of the largest) is checked for being other units' spikes landing on or next to each other, which with 3 components per channel can form a cluster of their own. Checking before the merge keeps it from joining such a cluster to a unit. Each of its spikes is fitted with the other clusters' average waveforms (templates), as template matching and Resolve Spike Collisions fit them (Pillow et al. 2013; Ekanadham et al. 2014; Kilosort): one unit at the spike's time, refitted together with any spikes of the units right next to it, or else that unit plus a second spike hidden at another lag.
- Overlap results (Clustering): if at least half a cluster's spikes fit that way, clearly better than the cluster's own average waveform fits them, each spike goes to the unit fitted at its time, any hidden spike is added to its unit, and the cluster is removed. Spikes that nothing explains go to an 'Unresolved overlaps' cluster labeled Noise, left out of Commit by default. A small cluster with a consistent shape of its own, such as a rarely firing unit, is kept, since its own average fits it best. The status line reports what was moved.
- Merge (Clustering): two clusters are merged when they look like one unit cut in two: their spikes, projected on the line between the two cluster centers, form a single peak (Hartigan's dip test at the 5% level, with the p-values of R's diptest). A small cluster, under a tenth of the pair's spikes, would barely change that test, so it is tested against only as many of the larger cluster's spikes as it has, those nearest to it: a tail cut off one unit continues into them and is merged back, while a separate small unit leaves a gap and stays apart. Clusters of under 10 spikes are left as they are. This keeps a unit whose size drifts, shrinks within bursts or varies unevenly as one cluster.
- Review: a waveform overlay per channel, a PC scatter plot, an ISI histogram and a Drift tab, with a quality summary for each cluster in the list. The waveform, PC scatter and Drift views are scaled to the spikes not labeled Noise, so a few huge artifacts can't shrink the real units into a corner; Noise spikes beyond that range are clipped.
- PC scatter plot (Review): with a channel group, pick the channel and component for each axis, or leave them on Auto: PC1 against PC2 of the selected cluster's best channel. Box moves use the axes shown.
- ISI histogram (Review): 0.5 ms bins, with refractory violations highlighted. Intervals are measured within each sweep, never across a sweep boundary.
- Drift tab (Review): spike amplitude against recording time (sweeps laid end to end; with 'Drift-tolerant' on, dashed lines mark its blocks). The extremum of each spike is searched for over 0.75 ms after its threshold crossing (as in WaveClus).
- Cluster list (Review): spike count, firing rate (spikes per second over the whole recording searched), ISI-violation percentage (intervals shorter than the refractory period), an estimated contamination with the number of violations it rests on, SNR, isolation distance (higher is better separated), L-ratio (lower is better separated), amplitude cutoff and presence ratio.
- Contamination (Review): the share of the cluster's spikes that come from other neurons, from the violations, the dead time and the recording length (Hill et al. 2011, with Llobet et al. 2022's correction for violations between two contaminating spikes, without which it reads high). With only a few violations it is very uncertain. It assumes the other neurons' spikes come at random times, independent of the unit's own, and it can't go above 100%: more violations than that model allows show as ≥100%.
- SNR (Review): p-p ÷ 2σ, the peak-to-peak size of the cluster's average waveform over twice the noise level, on its best channel with a channel group. SpikeInterface and Kilosort divide the largest deflection by the noise level instead, which reads about 1.4 times higher.
- Amplitude cutoff (Review): the estimated fraction of the unit's spikes that were too small to cross the threshold, from how sharply the low end of its amplitude histogram is cut off (Hill et al. 2011; 0 to 0.5, lower is better; the Allen Institute keeps units under 0.1). It needs at least 500 spikes and assumes the amplitudes spread evenly around their middle, which drift breaks. Each spike's amplitude is the least-squares scale of the cluster's average waveform fitted to it, as SpikeInterface's amplitude scalings, but without its joint fit of colliding spikes.
- Presence ratio (Review): the fraction of 60 s stretches of the recording in which the unit fired at least once (a sweep shorter than that is a stretch of its own), so a unit lost partway through reads low (the Allen Institute keeps units above 0.9). It needs a recording of at least 60 s.
- Isolation distance and L-ratio (Review) are measured against every other spike of the sort, the Artifacts cluster included. The often-quoted marks (isolation distance above 20, L-ratio below 0.05; Schmitzer-Torbert et al. 2005) were set with 8 features per spike, while these use 3 principal components (3 per channel with a channel group, so the chi-square degrees of freedom are 3 × the number of channels, as in SpikeInterface). The values run on a different scale, so compare clusters with each other rather than with those marks.
- Against SpikeInterface (Review): the presence ratio is computed exactly as its quality metrics compute it, and the amplitude cutoff too, except that @Graph's smoothed histogram counts stay real numbers: SpikeInterface truncates them to whole numbers, which makes its estimate noisier (an SD of 0.079 against 0.046 at 600 spikes). The firing rate, violation count and L-ratio match SpikeInterface's too, given the same features, and so does isolation distance wherever it is defined (SpikeInterface reports a value even when there are fewer spikes outside the cluster than in it).
- Editing: rename, relabel (good, multi-unit (MUA) or noise), merge or split clusters, mark one as noise (it stays listed and is left out at Commit), and move points between clusters by drawing a box in the PC scatter. Every edit can be undone, one step at a time, with the 'Undo: …' button under the cluster list: merge, split, delete, rename, relabel, box moves, and the spikes added by template matching or collision resolution (the last 20 steps). 'Show templates' on the Waveforms tab draws each cluster's average template over its waveforms.
- Template matching: 'Refine via Template Matching' builds an average waveform for each cluster and scans the recording for further spikes of that shape, recovering spikes just below the threshold. Each match is aligned between samples before it is scored, and it must be a true peak of the template match, not the edge of a known spike's dead time. Where two templates match the same event, only the better match is kept, so no spike is counted twice or given to the wrong unit. Template matching and collision resolution each have a Cancel button while they run; a canceled pass adds nothing.
- Match strength (template matching; slider, default 0.70): how large an event must be relative to the template. The template is scaled to fit the event by least squares, and an event counts when that scale is at least the Match strength (0.70: at least 70% as large as the template).
- Shape check (template matching; on by default): rejects a match that lines up with a template but has the wrong shape, such as a spike of another unit or a slow deflection. What is left after subtracting the scaled template may be at most 'Tolerance' (default 1.5×) times as large as for a typical spike of the cluster itself, which adapts to the noise level and the number of channels. Raise the tolerance if real spikes are being missed, and lower it if matches look wrong. Clusters with fewer than 5 spikes aren't checked.
- Drift-tolerant (template matching): turn it on first if the Drift tab shows a unit's waveform changing slowly over the session; the template then changes gradually along the recording. The recording is cut into the chosen number of Blocks (default 4), equal stretches of recorded time, each with its own template (a stretch with fewer than 5 of the unit's spikes is left out). The template at any point is interpolated between the two nearest, so it follows drift within one long continuous sweep as well as across sweeps.
- Collision resolution: 'Resolve Spike Collisions' finds spikes hidden by an overlapping spike. It uses the Match strength set above. It first subtracts the template of every spike already in a non-Noise cluster, scaled to fit, and then looks within half a snippet of each one for another spike matching any template. A recovered spike must be at least 0.4 ms from any other spike and at least the Dead time from another spike of the same unit. It only searches next to spikes already found, and it cannot separate two spikes less than 0.4 ms apart.
- 'Save Sort State…' saves the whole session (settings, including template-matching ones, clusters and every spike) to a .atgsort file, by default next to the recording; 'Load Sort State…' reopens one. Useful for pausing a long review or handing it to a colleague. Waveforms are stored exactly (as 32-bit binary values). A file saved by a newer version of @Graph asks you to update. A file whose clusters, spikes or waveforms don't fit together is refused with the reason. A sort state saved from a different recording is refused if its channels or sweeps don't exist here, and otherwise loads only after you confirm.
- Template matching and collision resolution always use the channel group and band-pass filter of the last Detect & Sort run (or loaded sort state), not the current controls, so they search the recording the same way the clusters' waveforms were extracted. Change the controls and run Detect & Sort again to use new ones.
- 'Commit Sorted Units' turns each kept cluster into a named spike train in a new Graph window, ready for Cross-Correlation, PSTH and other spike-train analyses. Its spike times are on the recording's own time axis, as Detect Spikes' are. There is one train per cluster per sweep, including sweeps where the unit never fired, so a trial without spikes counts as zero in a PSTH instead of being left out.
- The AI Assistant can also run the sorter (detect, cluster and optionally refine) when you ask it to sort a channel. It opens the result in a new window as an unreviewed first pass; review and commit it in the Spike Sorter.
Automatic clustering and template matching are starting points. Review the waveforms, PC scatter and ISI histogram before committing. Template matching can be slow on long recordings, and Match strength is a trade-off: too loose picks up noise, too strict misses real spikes. Check the ISI-violation percentage and SNR after each pass.
Membrane Test: Rₛ, Rₘ, and Cₘ
Requires: a voltage-clamp Graph with a brief voltage step (typically 5–10 mV) and its current response. If the Graph has a voltage command channel, the step size (ΔV) is measured from it; otherwise you are asked to enter it. A graph of voltage alone (current clamp) is refused, with a pointer to the Rₛ Correction panel. Use E-Phys Tools → Membrane Test…
- How it works: @Graph finds the step and the current transient, then fits a single exponential to its decay toward the new steady-state current by least squares, which gives the time constant τ. The recording filter rounds off the transient's instant jump but keeps its area, so the peak current is worked out from the charge the transient carries (peak = steady-state current + charge / τ), as pCLAMP's Membrane Test does. Series resistance (Rₛ) comes from that peak current, membrane resistance (Rₘ) from the steady-state current change, and membrane capacitance from τ: Cₘ = τ × (1/Rₛ + 1/Rₘ), the same formula as pCLAMP's. If the transient is cut short (by the step's end, say), the peak comes from the fit extrapolated back to where the transient's rise reaches half its height instead.
- Because the charge doesn't depend on the filter, in simulated cells Rₛ, Rₘ and Cₘ come out within 1% for filters of 5 kHz or wider. When τ approaches the filter's rise time (τ = 0.1 ms behind a 2 kHz filter, for example), the filter shapes the transient as much as the cell does: Rₛ can then read up to 40% high and Cₘ about 10% high. When these values matter for a fast transient, record with a wider filter.
- The R² beside each τ in the Data Log is measured on the current itself, so it says how well the exponential follows the recorded decay.
- With a voltage channel, each current sweep takes the step and ΔV from its own voltage sweep (paired in order). Without one, the step is detected from the current trace.
- Rₛ, Rₘ and Cₘ come from one fit to the averaged transient of all the sweeps, as in pCLAMP's Membrane Test: averaging first leaves the fit much less noise than averaging the per-sweep values afterward. Each sweep is also fitted on its own and listed in the Data Log, to follow the cell's stability. With a single sweep, or if the averaged transient can't be fitted, the per-sweep values (or their mean) are reported.
Cₘ is the least certain of the three. Capacitive transients often have a fast component followed by a slower one (such as from imperfect space clamp in cells with extensive dendrites), which a single exponential can't separate. Use Cₘ as a relative measure, for example to track a cell's stability during an experiment, rather than a precise absolute value, especially in large or complex cells.
Extracellular AP Detection is a mode of the AP Detection tab, and LFP / Spike Train Analysis (PSTH, ISI/Burst Detection, Spike CCG) is its own inspector tab. Each has its own page in this guide.
Batch Processing
Batch Processing → Batch Process Files… runs one operation on each file you choose in a folder, and combines the results into one report. The operations are grouped as in Protocols (Modify, Signal, Measure, E-Phys), plus File Handling's Convert Format. To run a sequence of steps on an open window instead, use a Protocol (below).
Choosing Files
- Choose Folder… lists the files in that folder (not in its subfolders; hidden files are left out). Uncheck a file to leave it out; Select All and Deselect All change them all.
- Batch reads every format @Graph opens as a graph: recordings, saved .@graph graphs, and text tables (.csv, .txt, .tsv, .text, .rtf, read with the Graph Data dialog's default settings). A file it can't read is reported as failed, and the run goes on.
- A file that holds several parts (streams at different rates, HEKA series, SutterPatch routines, and so on, each opening in its own graph window) is processed part by part: the report has a section for each, headed with the file's and the part's names, outputs are named with the part (cell1 (R2 VI)_scaled.abf), and the summary says how many parts each such file had.
- Show Channels reads each file's channel names and units (each part's, for a file of several), in the units its graph shows, for the Channel fields below and for checking VI/IV roles. Choosing another folder stops it reading the old one.
- VI/IV Plot needs each file's role: mark it Voltage, Current or Skip. Files pair up in list order (first Voltage with first Current, and so on). A file that records both itself (Vm and Im channels) is marked Both and is paired within the file, as the E-Phys menu pairs such a graph.
Operations
- Modify: Scale / Offset, Sample Rate (Decimate, Interpolate or Resample, as the Graph Tools do them; Interpolate linear or band-limited), Integrate, Differentiate.
- Signal: Average Sweeps (one average per channel, or per group for a saved graph; optionally with its SD, SEM or confidence interval as a band or as + and − sweeps, and only a .@graph file keeps a band), Normalize Sweeps, Align Peaks (every sample kept unless you trim the lead-in, and X = 0 at the peaks).
- Measure: Linear Fit, Curve Fit, Exponential / Formula Fit, Peak Measurement, Cursor Measurement, Synapse Detection (Spontaneous or Evoked).
- E-Phys: AP Detection, VI / IV Plot, Firing Properties, Membrane Test, Sag Analysis, LFP Power Spectral Density. Firing Properties searches every sweep for spikes, including those of a group hidden in a saved graph, as the E-Phys menu does. The LFP Power Spectral Density step runs in the background; Stop ends it, and the step reports nothing.
- File Handling: Convert Format saves each file again in another format, unchanged.
Each operation shows its main settings; anything not shown is as its panel starts (settings changed in a panel aren't used). Times are in ms as each file's graph shows them (a saved graph's Set X = 0 shift applies; a file of X-Y data, whose X isn't time, is refused), and a unit can be typed with a number ("2 s", "20 kHz"). Run stays disabled, with the reason beside it, until every setting reads.
- Batch uses the values as each file's graph shows them, in the same units (a recording stored in nA shows, and is measured, in pA when that suits its values), so thresholds and values typed in the channel's unit mean what they do in the panels. Junction potential: As each graph opens (the default) measures each file with the correction its own graph opens with (Settings' default for a recording, a saved graph's own setting), so the numbers match each graph's panel. You can also choose Not corrected, or Corrected by a value for every file. VI/IV Plot's summary says beside the resting level whether it was corrected.
- For IV Plot, Correct the voltage axis for Rₛ is As each saved graph sets it by default: a saved graph whose Rₛ panel corrects its IV Plot uses its own Rₛ, as its IV Plot does. Measured in each file finds Rₛ from each file's test pulse, as the Rₛ panel's Measure automatically does. One value for every file uses the Rₛ you enter, and Not corrected leaves the axis as recorded. A file whose Rₛ can't be measured is reported as failed.
- AP Detection's slope threshold starts at the dV/dt threshold set in Settings → Neurophysiology, as the AP Detection panel's does. It also has the panel's sustained-slope multiplier, rise and decay percentages and measurement checkboxes.
- Channel fields take a channel's name as Show Channels lists it (the unit after it can be left off; an unnamed channel is "Channel 2", say). Left blank, Synapse Detection uses the first channel and the baseline pre-step corrects every channel. A file without the named channel fails with its list of channels.
- Synapse Detection finds events going up or down (Events go); by default a current goes down (an inward EPSC) and anything else up. You set the amplitude threshold (Spontaneous, in the channel's unit) or onset threshold (Evoked: in baseline SDs, 4 by default, or with 'In baseline SDs' unchecked in the channel's unit). Everything else is as the Synapse Detection panel starts: in Spontaneous mode a channel's sweeps are joined into one recording, as the panel's Continuous mode does (sweep by sweep when their sample rates differ). Mean Frequency is the events divided by the time searched, as in the panel's time-binned summary. Evoked detection takes the pulse times (in ms as the graph's X axis shows them), the Stimulation type (which sets how long after each pulse to search) and whether each response is measured from rest or from the previous response's decay. With Charge checked, evoked charge is integrated over a fixed window after each pulse (Window, default 50 ms) unless you choose onset to return, as in the panel.
- Spontaneous detection can use the panel's Template or Deconvolution method instead of a threshold: set the template's τrise and τdecay (ms; the direction comes from Events go) and the threshold in noise SDs, and for Deconvolution its low-pass and high-pass (Hz). Both modes offer the panel's Rise (20–80% or 10–90%), Charge and Fitted waveform; Spontaneous also adds the Overall summary (mean, SD, median and CV of each measurement), the minimum amplitude (Template and Deconvolution) and Reject overlapping events. Charge is measured only on a current channel: on any other the report leaves it out and says why.
- Peak Measurement has the Peaks panel's Area (a current's area is reported as its charge in pC, any other channel's as an area in its unit × s) and Max rise and decay slopes, and its Noise and drift options: Peak = mean of N points, Smooth kinetics over N points, and Local baseline for each peak (its length and the gap before the peak, in ms). For First and All, it also has Separate peaks by (default 50% of the threshold), Min. spacing (ms; default 0, off) and, for an absolute threshold, 'Threshold is a distance in the peak's direction'. Its rise, width, decay and onset percentages and the Inter-event interval are there too.
Saving Results
Modify and Signal operations, LFP Power Spectral Density and Convert Format save one file per input, as .@graph (recommended), Axon Binary (.abf), AxoGraph (.axgx), MATLAB (.mat), NWB (.nwb) or HDF5 (.h5). VI/IV Plot and Firing Properties can also save each plot or F–I curve as a .@graph. Files go into the input folder unless you click Choose Output Folder….
With Axon Binary chosen, Samples picks the sample format: Match each file (the default: 16-bit for a file whose samples are still a 16-bit ABF file's own, which it keeps exactly, and 32-bit for every other), 32-bit (exact; saved as ABF 2, which pyABF opens) or 16-bit (smaller: half the size, each channel rounded to 1/65,534 of its range).
With NWB chosen, NWB Metadata… opens the export's metadata sheet once for the whole batch (see Exporting). The subject ID can be the same for every file or come from each file's name: the whole name, or the part before its first space, underscore or hyphen (A150416A 001.axgd gives A150416A). Each file keeps its channels' automatic roles and any electrode details of the NWB file it came from. Without metadata, a file read from NWB keeps its own.
- Each output is named after its input and the operation (cell1_scaled.abf, cell1_VIplot.@graph); Convert Format keeps the input's name. Decimate with an error type saves the error as a second file (cell1_decimated_SEM.abf).
- An existing file is never replaced, whether an input, an earlier run's output, or a file written earlier in the same run: the new file's name gets a number instead (cell1_scaled 2.abf).
- A saved .@graph opens as its panel's result would: one group per channel, a PSD with its frequency axis, an integral or derivative with its unit.
Baseline Correction Pre-Step
For the fits, Peak and Cursor Measurement and AP Detection, check 'Baseline-correct each sweep first' to correct each sweep before measuring (Mean subtraction over a region, Linear detrend or Polynomial fit), on one channel or all. This happens in memory only; the files are not changed. Sweeps that end before the region are left uncorrected and reported. A region with Start = End uses the one sample nearest that time, as in the Baseline Correction panel, and the report names it.
Running and Results
Run processes the files in order, showing which one it is on. Batch Processing works through the files one at a time and keeps @Graph responsive while it runs, so you can keep working in other windows. Long curve fits and synaptic event detection run in the background. Stop finishes the file under way and lists the rest as not processed. The report starts with the settings used, appears in the window, is added to the Data Log, and can be saved with Save Report…. Save Table as CSV… saves its tables as one CSV file, a row per file and sweep with the file's name first, and empty cells where nothing was measured; Show Saved Files shows the new files in the Finder. Each file's section lists any warnings (a recording read only in part, a paired file whose unit doesn't match its role) and, if it failed, why.
The window remembers its settings between sessions: the operation, every option (numbers as you typed them), the save format and the folders. A folder that has moved, or is on a disk that isn't connected, is named so you can choose it again. Which files are checked and their VI/IV roles start fresh each time. Reset to Defaults puts every option back as the window first starts (the chosen folder and files stay). Settings are read when you click Run, so changing Settings during a run doesn't affect it.
For VI/IV Plot, check every file's Voltage/Current role before running. Pairing goes strictly by list order, so one wrong role pairs the wrong files.
Protocols
A Protocol (Batch Processing → Protocols…) is a named sequence of steps you build once and run on any open graph window, for example Baseline Correction → Filter → Detect Events for every new cell. Batch Process Files… runs one operation on files in a folder; a Protocol runs a list of steps on a window already open.
Building and Running a Protocol
- Add Step offers four groups of steps (listed below). Drag steps to reorder them, or right-click a step for Edit…, Duplicate, Move Up, Move Down and Delete. ⌘Z in the Protocols window undoes changes to the list, including Load and New. The protocol you're building is kept when you close the window.
- Pick the target window under Run, then click Run Protocol (⌘R). Each step's results appear as it finishes, in the Results panel and in the Data Log, where every table names its window. A failing step stops the run. Stop (⌘.) ends the run after the current step; a fit stops after the sweep it is fitting.
- Changes a run makes to the picked window's data are undone with ⌘Z in that window, a few at a time when fits, Detect Events or E-Phys steps come between them.
- Save Protocol…, Load Protocol… and New (Clear Steps), in the ⋯ menu beside the protocol name, store a Protocol as a .atgproto file for reuse or start a new one. A file missing a setting still opens, with that setting as a new step starts. A file that isn't a protocol, or holds a step this version doesn't have, is refused with a message naming the step.
- Protocols run on sampled recordings; a spike-train raster is refused.
Steps
- Modify: Baseline Correction, Filter, Smoothing and Scale / Offset change the window's sweeps, like the on-screen tools. Sample Rate (Decimate/Interpolate/Resample), Integrate and Differentiate open a new window with the result, as their tools do.
- Signal: Average Sweeps (with the same Variability choice as the Average panel: none, SD, SEM or confidence interval, as a band or as + and − sweeps), Normalize Sweeps, Align Peaks. Each opens a new window with the result. As with Sample Rate, Integrate and Differentiate, an average or normalized result keeps the window's X shift, cursors and X zoom.
- Measure: Linear Fit, Curve Fit, Exponential / Formula Fit, Peak Measurement, Cursor Measurement, Detect Events (Synapse Detection). These report text without changing the window.
- E-Phys: AP Detection, VI / IV Plot, Firing Properties, Membrane Test, Sag Analysis, LFP Power Spectral Density. VI/IV Plot, Firing Properties (its F–I curve) and PSD also open a window with the plot; the others report text. A VI/IV Plot step corrects the IV axis for Rₛ when its window does. Firing Properties searches every sweep for spikes, whatever the window shows, as the E-Phys menu does. LFP Power Spectral Density runs in the background; Stop ends it during a file, and nothing is saved for that file.
- Baseline Correction, Filter, Smoothing and Scale / Offset steps have a channel (all channels, or one: then only its sweeps change) and an Apply to scope (all sweeps, visible sweeps, selected sweep, selected group or all groups); most other steps have the same scope options as their on-screen tool. They check what their panel checks (a filter frequency below every sweep's Nyquist frequency, a baseline region's end not before its start; End = Start uses the one sample nearest that time) and stop with a message otherwise. Baseline Correction turns junction-potential correction off and the Y axis back to automatic, as the panel does.
- Filter steps start at order 4, as the Filter panel does; AP Detection steps start at the dV/dt threshold set in Settings → Neurophysiology. Channels without a name are numbered from 1 in reports (Channel 1), as in Batch Processing.
- Detect Events does spontaneous synapse detection (Threshold, Template or Deconvolution, Continuous or Episodic, optionally within a window of each sweep) on one channel and reports the event count, the mean amplitude, rise time, half-width, decay τ and inter-event interval, and the frequency (events divided by the time searched). Its threshold is in the channel's unit as the window shows it; Template and Deconvolution take theirs in noise SDs, and Deconvolution its low-pass and high-pass too. Templates are always set by their rise and decay times, so a saved protocol works on any recording. It has the panel's Rise (20–80% or 10–90%), Charge (current channels only, in pC), Fitted waveform and Overall summary options; its other settings are as the Synapse Detection panel starts.
- Peak Measurement steps have the Peaks panel's Area (a charge in pC on a current, otherwise an area in the unit × s), Max rise and decay slopes, Noise and drift options (Peak = mean of N points, Smooth kinetics, Local baseline for each peak) and, for First and All, its separation settings (Separate peaks by, Min. spacing, 'Threshold is a distance in the peak's direction'). A local baseline is a time, so on a VI / IV plot or a spectrum the step stops with a message.
- Cursor Measurement measures between the step's saved times; the window's cursors aren't moved.
- Firing Properties opens the F–I curve in a new window, as the E-Phys menu command does (uncheck 'Open the F–I curve in a new window' for the table only). Later steps keep running on the step's own window.
Times and New Windows
- A step set to Between cursors A – B needs both cursors placed in its window; otherwise the run stops with a message.
- Times a step stores (a baseline region, a cursor-measurement or search window) are in ms as the X axis of the window the step runs on shows them, after any Set X = 0 shift. A new window from Sample Rate, Integrate, Differentiate, Average or Normalize shows its source's times, so the same times work on either; after Align Peaks, 0 is the peak. Fits, Peak Measurement and AP Detection set to Between cursors A – B use that window's cursors when the protocol runs; Integrate and Differentiate can store their own times instead (Use these times instead of cursors A and B). Measurements use the window's junction-potential correction, as the panels do.
- A step that opens a new window (Sample Rate, Integrate, Differentiate, Average Sweeps, Normalize Sweeps, Align Peaks, VI / IV Plot, LFP Power Spectral Density) has a Later steps run on choice, beside it in the list (Then: this window or Then: new window) and in its editor. This window, the default, keeps later steps on the picked window. The new window makes the steps after it work on the result instead, for example Decimate → Filter → Detect Events on the decimated data; the list marks those steps "→ new window of step N". Decimate with error bars goes on in the decimated window.
- A new window the run goes on in opens when the run ends, already showing what the later steps did. Those changes have no Undo there (close the window to discard them), and the picked window keeps its own data.
- A VI / IV plot or a power spectrum isn't a recording: on one, only Linear Fit, Curve Fit, Exponential / Formula Fit and Peak Measurement can run, over the whole plot (it has no cursors). The list marks any other step after it in orange, and the run stops there with a message.
Statistics
Statistics run in two places that share the same engine, zones and wording: the Statistics window, described here, and a chart's Statistics tab, which draws the results as effect size brackets (see Charts → Effect Size Brackets).
The Statistics window opens from Text Tools → Statistics… (⌘T in any text window), from the Data Statistics button in a Spreadsheet window, or from a chart's inspector via Open Full Statistics Window. Its Analysis box offers Compare (groups or conditions, including one-sample, two-way, split-plot and whole-distribution designs), Categorical (Fisher's exact 2×2 and r×c, McNemar's 2×2, Cochran's Q, chi-square goodness-of-fit and independence, one-sample binomial), Correlation, and Regression (simple linear, multiple regression, ANCOVA and a 4-parameter dose-response fit). Each reports its own effect sizes and confidence intervals. Results are shown in fixed-width columns that match the Data Log output.
Effect Size First: How @Graph Approaches Statistics
@Graph follows the estimation ("new statistics") approach of Cumming & Calin-Jageman (2024): the estimate and its confidence interval are the main result, and the p-value is supporting context. You choose what to compare (see Compare, below), and that one choice fixes the estimate and its effect size. The test follows from them, so the p-value and the CI always answer the same question: a CI that excludes zero goes with a significant p. That is why the button that runs a comparison is called Determine Effect, and why results show p-values and effect sizes side by side with no significance stars. You decide what threshold suits your field.
There is deliberately no free choice of test. The test is the one that goes with the estimate, so its p-value and the effect size's CI answer the same question; to run a different test, choose a different Compare option.
Getting Data into Statistics
- From the Data Log or any text editor: type or paste a tab- or comma-delimited table (one group per column, optional header row). Select the block and choose Text Tools → Statistics… or press ⌘T.
- From a Spreadsheet: click the Data Statistics button in the toolbar. Select cells first to analyze only those.
- Either way, @Graph works out whether the groups are in rows or columns, and asks when it isn't sure.
- From a Chart: click Open Full Statistics Window in the Statistics tab of the inspector. This opens the full Statistics window (every analysis, including Regression) linked to the chart, with its data, its Paired/Repeated setting and its comparison settings already in place (see Linked to a Chart, below). A repeated-measures chart opens it on the Mixed model design, with the chart's group and Values from the same columns, Trend, Covariance and Spreads. Each chart has one Statistics window: clicking again brings it forward.
A Graph window can't send its data to Statistics directly. To test measurements made in a Graph, select their table in the Data Log, where they are written automatically, and press ⌘T.
Running an Analysis
The Statistics window opens on the Descriptive table and the suggested settings, but runs no test. Adjust Paired/Repeated, the analysis, the design or the columns as needed, then click Determine Effect (or press Return) to show the result in the window's output panel. Click Send to Data Log to keep a permanent record there, or Export Report… (⌘S) to save it as a text or PDF file. File → Print (⌘P) prints it. Nothing is logged otherwise.
Once a result is showing, changing any setting or input (columns, design, Compare choice, effect size, post-hoc, tail, Spreads, typed counts) re-runs it, so the result always matches the panel. The report sent to the Data Log, printed or exported is headed with the settings and columns that produced it. μ₀ may be typed with a decimal point or comma; text that isn't a number stops the run with a message instead of being read as 0.
The Zones
The left panel starts with Analysis, a four-way choice: Compare (groups or conditions), Categorical, Correlation and Regression. The DATA zone of every analysis has Descriptive table and Normality tests, which show those two summaries of the checked columns at once, each with an ⓘ; looking at one does not change the analysis that Determine Effect runs. The window opens on the Descriptive table, and returns to it when the data change.
For Compare, the panel is laid out in zones, in the same order and with the same wording as a chart's Statistics tab:
- Paired / Repeated measures data (shown for Groups or conditions): each row is one subject measured in every column. It decides whether the paired or the independent-groups form of each comparison runs, and what the data checks look at.
- DATA: the Groups checklist and the Descriptive table and Normality tests buttons. The Groups checklist is collapsed, with every group checked; uncheck a group to leave it out. In a window linked to a one-series chart it is the chart's own checklist, so a group unchecked here disappears from the chart too, and the reverse.
- DATA CHARACTERISTICS: labeled checks of normality, variance, outliers and shape, and the Compare choice they suggest (see Data Checks Are Advisory, below).
- EFFECT SIZE: Compare (Means, Ratio, Trimmed means, H-L shift or Ranks), a line stating the estimate it reports, Spreads for independent means (May differ or Assumed equal, with Levene's result beside it for information) or the Question for paired means (Magnitude or Consistency), and the effect-size measure with a line saying what it divides by.
- TEST: the Design picker (below); then, for 3 or more groups, the comparisons: All pairwise, or vs. Control with a Control picker. The comparisons start at All pairwise and the control at the first group. A column named like a control (baseline, control, vehicle, sham, placebo, wt, pre, 0h, t0 and similar) is only suggested ("'WT' looks like a control"), with a Use button that makes it the control; a name never changes the comparisons by itself. They sit in TEST because they decide which post-hocs fit and how many comparisons the p-values and simultaneous CIs are adjusted for. Then a "Will run: …" line naming the test that follows from the EFFECT SIZE choices; Multiple comparisons, the post-hoc picker, for Means with 3 or more groups; and Tails, for Means only. The ⓘ beside "About this test" describes the test that will run.
- DISPLAY: Show the comparison on other scales (on by default; see Sensitivity, below).
Compare: What Is Compared Decides the Effect Size
For continuous data, Compare picks what the groups are compared on: means, trimmed means, Hodges-Lehmann shifts or ranks. Each choice fixes the estimate and its effect size, and the test follows from them, so the p-value and the CI always answer the same question. The same four choices appear in the Statistics window and on a chart's Statistics tab, and the ⓘ beside Compare explains each.
The Four Compare Choices
- Means: the difference in means, with a standardized effect size from the Hedges' g family. Two independent groups: Welch's t-test, or Student's t with Spreads set to Assumed equal (Welch's t loses very little power when variances are equal; Delacre, Lakens & Leys 2017), reporting the mean difference with its 95% CI (on the test's own SE and df) and Hedges' g* (g with Spreads Assumed equal, or Glass's Δ). Two paired conditions: the paired t-test, with gav or gz (see Effect Sizes); rows missing a value in either column are left out, and the result says how many. Three or more independent groups: Welch's one-way ANOVA (the classical F with equal variances assumed), then the chosen post-hoc. Three or more repeated conditions: repeated-measures ANOVA with the Greenhouse-Geisser correction, then paired t-tests. The usual choice when the data are roughly symmetric without far-out values. Only Means offers one-tailed tests.
- Ratio: the ratio of geometric means, from Welch's or the paired t-test on the natural logs of the values, back-transformed. A ratio of 1 means no difference. For positive values where a change is proportional, such as concentrations, expression levels and titers. It is offered only when every value is above zero, and is not for values already on a log scale. An estimation plot shows it on its own log axis, marked in ratios, with 1 as no difference; its groups' centers are geometric means. With 3 or more groups, Welch's ANOVA on the logs comes first for independent groups, and the pairs are Holm-adjusted.
- Trimmed means: the difference in 20% trimmed means (the highest and lowest 20% of each group set aside), with AKP robust d (Algina, Keselman & Penfield 2005) and its bootstrap CI. Tested by Yuen's trimmed t (Yuen 1974), which like Welch's t does not assume equal variances; for paired data, Yuen's paired test on the Winsorized covariance between conditions. Three or more independent groups: Wilcox's trimmed-means ANOVA as the omnibus test, then Holm-adjusted Yuen tests. Three or more repeated conditions: no established omnibus test matches this estimate, so only the Holm-adjusted pairwise tests are reported; they control the family-wise error rate on their own. For data with outliers or long tails, which pull means and SDs around.
- H-L shift: the Hodges-Lehmann estimate, in the data's own units, a shift only when the groups have the same shape, or the paired differences are symmetric, and not in general a difference in medians. Independent groups: the Hodges-Lehmann shift, the median of all differences between a value in one group and a value in the other, tested by Mann-Whitney U. Paired: the median of the Walsh averages of the paired differences, tested by the Wilcoxon signed-rank test (zero differences are dropped, as in R and SciPy). p is exact up to 49 values per group (or 49 non-zero differences), ties included. The CI inverts the same test, as R does: exact when there are no ties and fewer than 50 values per group (or differences); with ties in small samples (up to 20 values in all, or 30 pairs) it inverts the same exact conditional test as the p-value, so the two always agree; otherwise it comes from the tie-corrected normal approximation. Three or more groups: Kruskal-Wallis (independent) or Friedman (paired) as the omnibus test, then Holm-adjusted pairwise tests. At very small n the rank-based CI cannot reach the requested level; the table and the chart's caption then state the level it actually reaches. For skewed data, where the mean is not a typical value. With independent groups whose spreads differ (Levene), a note warns that Mann-Whitney then rejects too often for a difference in medians and that the shift is not a pure location difference, and points to Ranks or Trimmed means.
- Ranks: dominance δ, how much more often one group's values exceed the other's, from −1 to 1, with no assumption about the data's shape or units. Independent groups: Cliff's δ = P(A > B) − P(A < B), tested by the Brunner-Munzel test, which allows unequal spreads (Brunner & Munzel 2000; Karch 2021). With 10 or fewer values in a group its p and CI come from the studentized permutation distribution (Neubert & Brunner 2007; Pauly, Asendorf & Konietschke 2016): exact when there are at most 20,000 possible splits, otherwise 10,000 random re-splits. When every value in one group exceeds every value in the other (δ = ±1) no finite-sample CI exists and "—" is shown. Paired: the share of subjects higher in the first condition minus the share higher in the second (subjects with equal values left out), tested by the exact sign test with its exact Clopper-Pearson CI, so the CI excludes zero exactly when p is significant. Three or more groups: Kruskal-Wallis or Friedman, then Holm-adjusted pairwise tests. For ordinal scores and any data whose units don't carry meaning.
| Compare | Estimate (effect size) | 2 groups: independent / paired | 3+ groups: independent / paired |
|---|---|---|---|
| Means | mean difference (g* or g, d* or d, Glass's Δ; paired: gav, dav, gz, dz) | Welch's t (Student's t) / paired t | Welch's ANOVA (classical F) + post-hoc / repeated-measures ANOVA (Greenhouse-Geisser) + paired t-tests |
| Ratio | ratio of geometric means | Welch's t on logs / paired t on logs | Welch's ANOVA on logs + Holm / Holm-adjusted pairs only |
| Trimmed means | 20% trimmed-mean difference (AKP robust d) | Yuen's trimmed t / Yuen's paired t | trimmed-means ANOVA + Holm / Holm-adjusted pairs only |
| H-L shift | Hodges-Lehmann shift / Hodges-Lehmann median of the differences | Mann-Whitney U / Wilcoxon signed-rank | Kruskal-Wallis + Holm / Friedman + Holm |
| Ranks | dominance δ | Brunner-Munzel / exact sign test | Kruskal-Wallis + Holm / Friedman + Holm |
Effect Sizes
Each Compare choice has its own effect size, chosen in the EFFECT SIZE zone:
- Means, independent groups: a Spreads selector. May differ (the default) gives Hedges' g* or Cohen's d* (Delacre et al. 2021), standardized by the average of the two groups' variances, so the effect size makes the same assumption as Welch's t, Welch's ANOVA, Games-Howell and Dunnett's T3; the Welch's t table shows the pooled-SD g beside g* for comparison. With groups of the same size d* equals d, and g* differs from g only through the small-sample correction. With a control (two groups, or vs. Control) it also offers Glass's Δ. Assumed equal gives Hedges' g or Cohen's d, over the pooled SD, with Student's t, the classical ANOVA and its pooled-variance post-hocs.
- Means, paired: a Question selector. Magnitude (the default) offers gav and dav, "how big was the typical change?"; Consistency offers gz and dz, "how consistently did subjects change?". The Power Analysis calculator (Lab Tools) offers the same Question for paired designs.
- Ratio: the ratio of geometric means itself. Trimmed means: AKP robust d. H-L shift: the Hodges-Lehmann estimate itself, in the data's units. Ranks: dominance δ itself. Each has only this one effect size.
Which effect size, when
| Design | Compare | Setting | Effect size (alternative) | Test it goes with |
|---|---|---|---|---|
| 2 independent groups | Means | Spreads: May differ (the default) | Hedges' g* (Cohen's d*) | Welch's t |
| 2 independent groups, one a control | Means | Spreads: May differ; effect size: Glass's Δ | Glass's Δ, over the control's SD | Welch's t |
| 2 independent groups | Means | Spreads: Assumed equal | Hedges' g (Cohen's d) | Student's t |
| 3+ independent groups, each pair | Means | Spreads: May differ (the default) | Hedges' g* (Cohen's d*) | Welch's ANOVA, then Games-Howell or Dunnett's T3 |
| 3+ independent groups, each vs. a control | Means | Spreads: May differ; effect size: Glass's Δ | Glass's Δ, over the control's SD | Welch's ANOVA, then Dunnett's T3 or Games-Howell |
| 3+ independent groups, each pair | Means | Spreads: Assumed equal | Hedges' g (Cohen's d) | classical ANOVA, then Tukey, Dunnett or adjusted t-tests |
| 2 paired conditions (or each pair of 3+) | Means | Question: Magnitude (the default) | Hedges' gav (Cohen's dav) | paired t (repeated-measures ANOVA, then paired t-tests) |
| 2 paired conditions (or each pair of 3+) | Means | Question: Consistency | Hedges' gz (Cohen's dz) | paired t (repeated-measures ANOVA, then paired t-tests) |
| 1 column vs. a value (μ₀) | Means | Any | Hedges' g (Cohen's d), over the column's own SD | one-sample t |
| any design | Ratio | Any | ratio of geometric means | t on logs (Welch's, paired or one-sample; Welch's ANOVA on logs) |
| any design | Trimmed means | Any | AKP robust d | Yuen's t (paired Yuen's t, one-sample trimmed t, trimmed-means ANOVA) |
| any design | H-L shift | Any | Hodges-Lehmann estimate (HL), in the data's units | Mann-Whitney U (Wilcoxon signed-rank when paired or vs. μ₀; Kruskal-Wallis, Friedman) |
| any design | Ranks | Any | dominance δ | Brunner-Munzel (exact sign test when paired or vs. μ₀) |
The effect size and the test make one assumption together, set by Spreads, so an effect size never assumes something its test doesn't. Levene's test is shown under Spreads and in DATA CHARACTERISTICS for information; it never switches them. A Levene p above 0.05 doesn't show that the spreads are equal, and choosing the test from a variance pretest distorts its error rates (Zimmerman 2004), while Welch's t loses very little power when the spreads are equal (Delacre, Lakens & Leys 2017). So an ordinary two-group comparison reports g* beside Welch's t even when the spreads look alike. With groups of the same size d* and d are the same number, and g* and g differ only through the small-sample correction (g*'s correction uses Delacre's degrees of freedom); with unequal sizes and spreads they differ more. The Welch's t table shows both. To report g, set Spreads to Assumed equal, and the test becomes Student's t. Choose that only when the spreads are known to match, from the design or earlier data.
Normality and skew have no switch of their own; Compare is their counterpart. Normality mostly changes how accurate a Means CI is at small n, not what is worth estimating. Skew and far-out values do change that, so DATA CHARACTERISTICS suggests Ranks, Ratio or Trimmed means when they are present, and Use applies the suggestion. Compare stays on Means until you choose: the suggestion is never applied automatically, for the same reason as Levene's test (Rochon, Gondan & Kieser 2012). It is only a suggestion, based on the data's shape, and may not suit every analysis: choose the comparison from your study design.
The two paired questions can give different answers from the same data: did nearly every subject move the same way, even by a little, or how big was the typical change? A consistent but modest change can give a large dz beside a small dav, or vice versa. Neither is more correct; the Question says which one the number answers, and the effect-size menu and figure caption name it.
Before trusting a standardized effect size (d, g, dav, gav), ask whether the SD describes the spread well. For roughly symmetric data without extreme points it does. If the data are skewed, or one or two extreme points set the SD, these effect sizes can swing on those points; Trimmed means (AKP robust d) or H-L shift (Hodges-Lehmann) then answer the magnitude question without being dominated by them. Result tables report p-values and effect sizes only; @Graph never adds significance stars.
Standardized mean differences (Means)
- Cohen's d (independent groups, equal variances assumed): mean difference / pooled SD. Small = 0.2, medium = 0.5, large = 0.8. Uncorrected for small-sample bias; selectable at any n, but not the default.
- Hedges' g (independent groups, equal variances assumed): bias-corrected d, and the default. The correction is largest for small samples and fades smoothly toward Cohen's d as n grows (negligible above about n = 20), so it is never worse. Choose Cohen's d only to match a journal or field convention.
- Hedges' g* and Cohen's d*, read "g star" and "d star" (independent groups, spreads may differ; Delacre et al. 2021): the mean difference over the average of the two groups' variances, √((s₁² + s₂²)/2), instead of a pooled SD. The pooled SD weights each group's variance by its size, so when the spreads differ, d depends on which group happened to be larger; d* weights the two groups equally and describes the populations alone. Used whenever Spreads is May differ, the default. g* corrects d* for small-sample bias on Delacre's degrees of freedom.
- Glass's Δ (independent groups with a control, spreads may differ; Glass 1976): the mean difference over the control group's SD alone, with the small-sample correction on the control's n − 1 degrees of freedom (Hedges 1981). For a treatment expected to change the spread as well as the mean: the difference is then in units of the untreated variability. Offered with Spreads May differ, for two groups (the Control picker beside it chooses which) or each group vs. a control. Its CI is a noncentral t on the control's degrees of freedom with the sample variance ratio plugged in, as R's effectsize computes it (exact given that ratio; Hedges & Olkin 1985).
- Cohen's dz (paired): mean difference / SD of the differences. Uncorrected; selectable, but not the default. It is not the textbook "drm" (which divides by a single measurement's SD), and the two agree only when the pre/post correlation is 0.5. Because the SD of the differences shrinks as within-subject correlation rises, a small but consistent change can give a larger dz than a bigger, less consistent one. That is why it answers the consistency question rather than the magnitude one.
- Hedges' gz (paired): bias-corrected dz, and the default when the Question is Consistency. As with Hedges' g, the correction matters most at small n.
- Cohen's dav (paired): mean difference / the average of the two conditions' SDs, (SD₁+SD₂)/2 (Lakens 2013). It ignores the correlation between conditions, so it isn't inflated or deflated by consistency, and it is directly comparable to an independent-groups Cohen's d. Unlike dz (which equals the paired t-test's t/√n), it has no direct link to the test's p-value. Uncorrected; selectable, but not the default.
- Hedges' gav (paired): bias-corrected dav, the default for paired means (Lakens 2013; R's effectsize package), with the correction taken at correlation-adjusted degrees of freedom (Fitts 2025). Its 95% CI, like dav's, is a bootstrap (BCa, bias-corrected and accelerated, by default), following Fitts (2025): no validated closed-form interval exists for this denominator in a paired design.
Trimmed means, H-L shift and ranks
- AKP robust d (Trimmed means; Algina, Keselman & Penfield 2005): the 20% trimmed-mean difference divided by a 20% Winsorized SD, times 0.642 so it matches Cohen's d under normality (the usual small/medium/large guide applies). For paired data the denominator is the two conditions' pooled Winsorized SD, √((s²_w1 + s²_w2)/2), so it is a magnitude like gav, not the SD of the differences. Its 95% CI is always a bootstrap (10,000 resamples, BCa by default, following the Bootstrap CI method setting); the trimmed-mean difference itself gets Yuen's CI.
- Hodges-Lehmann estimate: the median of all between-group differences (independent) or of the Walsh averages of the paired differences (paired), in the data's own units. It is the rank-based counterpart of the mean difference and needs no assumption about the SD. Its CI is the standard distribution-free interval (Hollander, Wolfe & Chicken 2014; the same interval R reports), which inverts the test. Its ends are the limits of the shifts the test does not reject, and an end can itself be rejected: a CI that ends exactly at 0 beside a significant p has 0 just outside, and the table says so. For independent groups it is a location shift only when the two groups have the same shape; otherwise read it as the typical difference. Use it when the actual size ("the typical difference was 4.2 mV") matters.
- Dominance δ (Ranks): P(A > B) − P(A < B) for independent groups (Cliff's δ; Cliff 1993; equal to 2P − 1 for Brunner-Munzel's P), or, for paired data, the share of subjects higher in the first condition minus the share higher in the second. 0 means neither group tends to be higher; ±1 means every value in one exceeds every value in the other. Its CI comes from the same test as p (Brunner-Munzel, or the sign test's exact Clopper-Pearson interval).
Overall and other effect sizes
The other designs and analyses report these effect sizes (alternatives in parentheses). Overall effect sizes (η², Kendall's W and the like) describe the whole test; the others describe each comparison.
| Analysis | Design | Effect size |
|---|---|---|
| One-sample t, trimmed t, Wilcoxon or sign test (by Compare) | 1 column vs. μ₀ | g (d); AKP robust d; Hodges-Lehmann difference from μ₀; δ = P(X > μ₀) − P(X < μ₀) |
| Welch's or classical one-way ANOVA | 3+ independent groups, Means | η², ω², Cohen's f |
| Repeated-measures ANOVA | 3+ repeated conditions, Means | partial and generalized η², Cohen's f |
| Two-way ANOVA | two crossed factors | partial η² and Cohen's f for each effect; each post-hoc pair: d |
| Split-plot (mixed) ANOVA | one between-, one within-subjects factor | partial and generalized η², Cohen's f |
| Linear mixed model | groups × repeated conditions, missing values allowed | model-based means and differences; marginal and conditional R² |
| Kolmogorov-Smirnov | 2 independent groups, whole distributions | D (0 to 1) |
| Fisher's exact | 2×2, independent | ln(odds ratio) (odds ratio, relative risk) |
| McNemar's | 2×2, paired | Δp, the difference in proportions (paired odds ratio, ln(odds ratio), Cohen's g) |
| Cochran's Q; χ² independence; χ² goodness-of-fit | binary or categorical | Kendall's W; Cramér's V and its bias-corrected form (Bergsma 2013); Cohen's w |
| One-sample binomial | 1 binary column vs. p₀ | observed proportion − p₀ (Clopper-Pearson exact CI) |
| Correlation | one X, one Y | Pearson r (Spearman ρ, Kendall's τ-b) |
| Multiple Regression | one Y, 2+ predictors | R² and Cohen's f |
| ANCOVA | groups adjusted for covariates | partial η² and Cohen's f; each adjusted pair: d |
- η² / partial η², ω² and Cohen's f (one-way, RM, two-way and split-plot ANOVA; ANCOVA's factor): each CI comes from the noncentral F distribution (Steiger 2004; Smithson 2001), as in R's MBESS package (see “Why these intervals use λ/(λ + N)” below), at 1 − 2α: 90% when the confidence level is 95%. At that level the CI excludes zero exactly when the F test is significant at α (Steiger 2004).
- ω² (one-way ANOVA): the less biased estimate of the population share of variance (η² describes the sample and runs high at small n). It shares η²'s noncentral-F CI, since both estimate the same population quantity.
- Generalized η² (RM and split-plot ANOVA; Olejnik & Algina 2003; Bakeman 2005): keeps between-subject variability in the denominator, so it can be compared with η² from a between-subjects study of the same effect. Partial η² from a within-subjects design is larger and cannot be compared that way. Shown without a CI (there is no exact one).
- Odds ratios (Fisher's Exact, McNemar's): conditional maximum-likelihood estimates with exact intervals (see Categorical Tests, below); 0 and ∞ are legitimate values when a cell is empty, and are printed as such.
- Kendall's W (Cochran's Q), Cramér's V (Chi-square independence) and Cohen's w (goodness-of-fit; 0.1/0.3/0.5 small/medium/large): 95% CI by bootstrap (10,000 resamples keeping each test's paired or independent structure, seeded from the data so unchanged data give the identical interval), using the Bootstrap CI method setting.
- Pearson r (Correlation): 95% CI via the Fisher z-transform. Spearman ρ and Kendall's τ-b each get a bootstrap 95% CI (resampling the (x,y) pairs together), using the Bootstrap CI method setting.
- D (Kolmogorov-Smirnov): the largest gap between the two cumulative distributions, from 0 (identical) to 1 (no overlap).
Direction and "Always show effect sizes as positive"
Effect sizes are signed: negative when the first-named group or condition is lower. On a profile with a control group (one you chose, or one named like a control, such as Control, Vehicle or WT), a bracket with the control reads as the other group minus the control (Treatment A − Control), so each treatment's effect has its own sign; brackets between two other groups keep the first minus the second. With Settings → Statistics → Always show effect sizes as positive turned on, a result-table row whose estimate is negative is restated the other way round: the group names are swapped and the estimate, its CI, the test statistic and the effect size are all given for the reversed order (a one-tailed test is restated for the same hypothesis), never just the sign of the effect size flipped. In a one-tailed post-hoc table of all pairs, where the row order is the hypothesis (first-named group > second), rows keep their tested order, and the table says so. A chart bracket joins two groups without a direction, so its effect size and CI are shown for the order that makes them positive. An Estimation Plot draws each difference as later minus earlier group, so its labels stay signed as plotted whatever this setting says. η², ω², Cramér's V and Kendall's W are never changed.
Confidence Intervals
Settings → Statistics → Default confidence level (90%, 95% or 99%; 95% unless changed) applies to every CI. The variance-explained effect sizes (η², partial η², ω², Cohen's f and R²) get a 1 − 2α interval instead, 90% at the current level, the level at which the interval excludes zero exactly when the F test is significant (Steiger 2004). With 3 or more groups, pairwise CIs are simultaneous (see Multiple Comparisons, below). Its α (1 − the level) is also the threshold of the verdicts the tables state: Mauchly's test, the interaction verdicts of the two-way and split-plot ANOVA, and Levene's test. Changing this setting, Always show effect sizes as positive or the bootstrap settings re-runs a result already shown in the Statistics window.
Why these intervals use λ/(λ + N): every CI for η², partial η², ω² and Cohen's f is an interval for the population share of variance the effect explains, the same quantity a power analysis plans with (Cohen 1988; G*Power). It is found as Steiger (2004) describes: the noncentral-F interval for the noncentrality λ, converted by λ/(λ + N). N is the number of observations the effect is estimated from: all values for a between-subjects effect, subjects × conditions for a within-subjects effect, and the subjects for a split-plot's between-subjects effect.
With Welch's ANOVA, η², ω², their CI and Cohen's f still come from the classical ANOVA table, because converting Welch's F overstates the share of variance. So with very unequal spreads the CI need not agree with Welch's p-value.
- R's MBESS package computes the same interval (Kelley 2007), so any of them can be reproduced there.
- R's effectsize package and JASP convert by λ/(λ + df_error) instead, which carries the bounds through the formula for the sample η². Their intervals come out higher and wider, most in repeated-measures designs, so the two are not interchangeable.
- The sample η² overestimates the population share at small n, so it can sit near or above the upper end of its interval.
- Multiple regression's R² is the exception: its predictors are usually measured on the sampled subjects rather than set by design, so its CI treats them as random and inverts Fisher's (1928) exact distribution of R² under multivariate normality. R's MBESS (ci.R2, by default) approximates that same interval (Lee 1971) and agrees to about three decimals. With predictor values fixed by design (doses, timepoints) the noncentral-F interval applies instead; it is narrower at the top.
Confidence intervals for d and g (and the paired dz and gz, and Welch's d*/g*, which invert Welch's t on Delacre's df, as the R package deffectsize does; Glass's Δ's CI is described with Glass's Δ, above) come from inverting the noncentral t distribution (Steiger & Fouladi 1997; Cumming & Finch 2001), as in R's effectsize and MBESS packages: exact when the data are normal, and usually asymmetric around the estimate, so they are always shown as a range, never ± a margin. For g the bounds carry the same small-sample correction as the estimate. The Hodges-Lehmann CI inverts the Mann-Whitney or signed-rank test, and δ's CI comes from the Brunner-Munzel test or the exact sign test, so each normally agrees with its own p-value (with tied values the Hodges-Lehmann CI is approximate). Odds ratios get exact intervals (see Categorical Tests, below).
Which bootstrap?
Settings → Statistics → Bootstrap CI method offers BCa (bias-corrected and accelerated), the recommended default, or Percentile. It applies to every interval that is bootstrapped because no formula fits: AKP robust d; dav and gav; the Estimation Plot's intervals for means and dominance δ; Kendall's W (Cochran's Q), Cramér's V and Cohen's w; and Spearman ρ and Kendall's τ-b. Test-based intervals (t, noncentral t and F, Yuen, rank inversion, Clopper-Pearson) are never bootstrapped. A plain percentile interval is too narrow at small n; BCa corrects for bias and skew using the same 10,000 resamples (Efron & Tibshirani 1993, ch. 14). Choose Percentile only to reproduce a number computed with it. The Estimation Plot's medians and trimmed means always use the smoothed bootstrap's percentile interval. Every bootstrap is seeded from the data, so re-running an unchanged analysis gives the identical interval. The setting is global and applies the next time an analysis runs. Each bootstrap CI row names the method used, such as "(BCa bootstrap)", and a chart bracket draws a bootstrap CI in curly braces. Warn on small-sample bootstrap CIs (Settings → Statistics; below n = 5 by default) adds a note to a result table whose bootstrap CI rests on fewer values per group or pair than that.
Test: The Test Goes with the Estimate
The TEST zone sets how the comparison is tested: the design, which comparisons are made with 3 or more groups, the post-hoc and the tails. The test itself follows from the Compare choice and is named on the "Will run" line.
Design
The Design picker, at the top of the TEST zone, says which family of tests the comparison uses; what a design needs from the data (μ₀, the A×B layout, the group column) is set in DATA:
- Groups or conditions (the default): 2 or more columns, one per group, or one per condition with Paired / Repeated on. The Compare choice decides the analysis (see Compare, above).
- One sample vs. a value: one column against a hypothesized value μ₀, typed in the panel. Means runs the one-sample t-test with Hedges' g (or Cohen's d); Trimmed means the one-sample trimmed t with AKP robust d (Algina, Keselman & Penfield) and its bootstrap CI; H-L shift the Wilcoxon signed-rank test with the Hodges-Lehmann pseudo-median minus μ₀; Ranks the exact sign test with δ = P(X > μ₀) − P(X < μ₀) and its exact (Clopper-Pearson) CI.
- Two-way (factorial): two crossed between-subjects factors, compared on means (see Two-Way ANOVA, below), with its own post-hoc picker. Set the number of levels of each factor; the columns must be ordered A1B1, A1B2, …, A2B1, … (B changes fastest). If the data are marked paired, a warning says that a two-way ANOVA treats every value as a different subject and points to Split-plot instead.
- Split-plot (mixed): one between-subjects factor, a column of group codes (0, 1, 2, …) picked separately, and the other checked columns as the repeated conditions (see ANOVA Tables, below). The picker starts from the first column that looks like group codes. Rows missing any value are left out, and a note gives the count. The data checks and the Descriptive and Normality tables look at each group × condition cell, and the Variance line tests the groups' spreads at each condition (Levene), the homogeneity the ANOVA assumes; sphericity is tested with the result.
- Mixed model (repeated measures): the split-plot layout (a group column, codes or labels, and one column per condition, one row per subject) fitted as a linear mixed model. Subjects with missing conditions are kept. TEST then offers Trend (None (any shape), the default, or a Linear, Quadratic or Cubic trend) and Covariance (Unstructured (MMRM), the default; Random intercept; Random intercept + slope; or Random intercept + AR(1)); see Linear Mixed Model, below.
- Whole distributions (KS): the two-sample Kolmogorov-Smirnov test on exactly 2 columns. It compares the whole distributions, not their means or medians. D, the largest gap between the two groups' cumulative distributions (0 to 1), is both the statistic and the effect size. The p-value is exact (as in the exact mode of SciPy and R) unless the two group sizes multiply to more than 10 million. A significant D says the distributions differ, not how; use Groups or conditions for a difference in location with its CI.
The Compare choice applies to Groups or conditions and to One sample. Two-way, Split-plot and KS have one analysis each, and their EFFECT SIZE zone says what they report.
Multiple Comparisons (3 or More Groups)
Choose All pairwise or vs. Control at the top of the TEST zone (after Design in the Statistics window). vs. Control compares each group only with the control: a smaller family, and so more power.
Trimmed means, H-L shift and Ranks: the pairwise tests are Holm-adjusted, and each CI is the Bonferroni simultaneous interval at level 1 − α/m (m comparisons), the interval that goes with Holm, so a CI that excludes zero always has a significant Holm p. Paired designs use each pair's own complete subjects, as R's pairwise tests do, so a pair's n can exceed the omnibus test's.
Means: pick the method under Multiple comparisons in the TEST zone. Only the methods that fit the design and the variance assumption are listed, the recommended one first and marked "(recommended)"; the ⓘ beside the picker describes the selected method.
- Independent groups, Spreads: May differ (the default): Games-Howell (recommended) or Dunnett's T3 for all pairs; Dunnett's T3 (recommended) or Games-Howell for vs. Control. With small groups (fewer than about 50 each) prefer T3 for all pairs too: Games-Howell can then reject slightly too often, while T3 holds the error rate. The omnibus test beside them is Welch's ANOVA.
- Independent groups, Spreads: Assumed equal: Tukey HSD for all pairs, or Dunnett for vs. Control (each the recommended one for its comparisons), or Holm-Bonferroni, Šidák or Bonferroni on the pooled variance. The omnibus test beside it is the classical F.
- Repeated measures: Holm-Bonferroni (recommended), Šidák or Bonferroni, applied to paired t-tests, because Tukey, Games-Howell and Dunnett assume independent groups. Each comparison uses the subjects observed in both of its conditions; the omnibus test uses the subjects observed in all of them.
- Tukey HSD: every pair, handling unequal group sizes (Tukey-Kramer) with the exact studentized-range distribution. Games-Howell: Tukey's unequal-variance counterpart, where each pair uses its own variances and degrees of freedom.
- Dunnett's T3 (Dunnett 1980): each pair's Welch t-test at its own degrees of freedom, referred to the studentized maximum modulus distribution for the whole family (all pairs, or each group against the control), as in SPSS, GraphPad Prism and R's PMCMRplus. It does not assume equal variances, and it is never less powerful than the Šidák-corrected Welch t-tests (Tamhane's T2).
- Dunnett (vs control): every group against one control, using the exact joint distribution of those comparisons. Its unequal-variance counterpart is Dunnett's T3 against the control.
- Šidák / Bonferroni / Holm-Bonferroni: general-purpose corrections. Holm-Bonferroni is always at least as powerful as Bonferroni with the same protection.
Each Means post-hoc row gives the mean difference with a CI adjusted like its p-value: simultaneous for Tukey HSD, Games-Howell, Dunnett, Dunnett's T3, Šidák and Bonferroni. Holm has no exactly matching interval, so it gets the Bonferroni simultaneous CI that goes with it: if the CI excludes zero the Holm p is significant, though a Holm p just under the threshold can sit beside a CI that still includes zero. The effect sizes' CIs are simultaneous across the family (Bonferroni, 1 − α/m), as the chart's brackets show them.
One- and Two-Tailed Tests
Only Means has a Tails picker: for the independent, paired and one-sample t-tests, and for the post-hocs with a one-sided form (Dunnett, Dunnett's T3, Holm-Bonferroni, Šidák and Bonferroni). Tukey HSD and Games-Howell have no one-tailed form, and the Trimmed means, H-L shift and Ranks tests are two-sided. Two-tailed is the default; a one-tailed choice (first > second, or first < second; against a control it reads as each group vs. the control) tests only that direction and shows a warning. Wherever the picker is hidden the test runs two-tailed, whatever was chosen before. With a one-tailed t-test the effect size's CI is one-sided too (the bound in the tested direction, as R's effectsize reports), so it excludes zero exactly when the one-tailed p is significant; in post-hoc tables the mean-difference CIs become one-sided and the effect-size CIs stay two-sided.
ANOVA Tables
- One-way ANOVA (Means, 3+ independent groups): Welch's F, or the classical F with Spreads Assumed equal, with its p, η² (the sample's share of variance), ω² (the less biased population estimate; it can be slightly negative when F < 1, as SPSS also reports) and Cohen's f, the CIs of ω² and f at 90% (see Effect Sizes), then the post-hoc table.
- Repeated Measures (RM) ANOVA (Means, 3+ repeated conditions): F, partial η² and Cohen's f with 90% CIs, and generalized η², which unlike partial η² can be compared with results from other designs (Olejnik & Algina 2003; Bakeman 2005). Includes Mauchly's sphericity test with Greenhouse-Geisser and Huynh-Feldt corrections (see below); the Greenhouse-Geisser p is the reported result. Each post-hoc row gives the mean difference with a CI adjusted like its p-value.
- Split-plot ANOVA (Mixed) (Design: Split-plot; one between-subjects factor × 2+ repeated conditions): for example, drug vs. placebo, each measured at several conditions. Reports F, p, partial η² and Cohen's f (with 90% CIs, noncentral F) for the between-subjects effect, the within-subjects effect and their interaction, plus generalized η² for each, with the same sphericity handling as RM ANOVA. Sphericity is tested on the covariance pooled within the between-subjects groups, as SPSS and R's car package do, with Lecoutre's Huynh-Feldt correction. The group column is never used as a within-subjects condition, even if it is checked. See Two-Way ANOVA below for how this differs from two independent factors.
Linear Mixed Model
Design: Mixed model (repeated measures). For subjects in 2 or more groups, each measured at several conditions: neurons of different subtypes recorded at 10 conditions, say. The question "do the groups' profiles differ in shape" is the Group × Condition interaction.
- Data: as for split-plot, a group column of codes or labels (picked in DATA) and the conditions as the other checked columns, one row per subject. A subject missing some conditions is kept, and every value it has counts (split-plot leaves the whole row out). Times come from the column names when each holds a distinct number ("0", "5 min", "Day 14"), else 1, 2, 3… A condition where every subject has the same value, such as the baseline each profile was normalized to (all 1, or 100%), is left out with a note: it holds no information about the groups, and a point with no variance would distort the covariance estimates and add comparisons that are 0 by construction.
- Trend: the columns can be any ordered measure, such as concentrations or stimulus intensities, not only conditions. None (any shape), one mean per group and level, with no assumption about the shape; or a linear, quadratic or cubic trend (orthogonal polynomials over the condition values), with fewer parameters and so more power when the profiles are smooth curves. With a trend, the interaction compares the groups' curve coefficients beyond the level.
- Covariance: Unstructured (MMRM), the default (the MMRM of clinical trials: each condition has its own variance and each pair of conditions its own correlation, so the tests hold whatever the true pattern of correlation). It needs at least as many subjects as conditions plus one per group, at most 30 conditions, and every pair of conditions measured together in at least 2 subjects. When it can't be estimated, the structure with the lowest AIC among the other three is used, and a note in the result says why; random intercept (each subject has its own level; on complete data this reproduces split-plot ANOVA without the sphericity correction); random intercept + slope (each subject also has its own linear trend across conditions); random intercept + AR(1) (residuals correlated across conditions, ρ^(lag) for times lag spacings apart, so neighboring times correlate more than distant ones). The simpler structures assume a pattern; when it doesn't fit, their tests can be too liberal. The result shows AIC for all four (lower is better).
- Spreads: Assumed equal (the default: one covariance for every group) or May differ, the repeated-measures counterpart of Welch's test. May differ gives each group its own residual SD with the random-intercept structures (nlme's varIdent by group; the subject-level variances shared), or its own unstructured covariance with Unstructured (mmrm's us(time | group / subject)), which needs at least one more subject than conditions in every group, else the lowest-AIC other structure is used with each group's own residual SD. Choose it from the design: a treatment expected to change the variability, or groups of very different sizes. The result lists each group's SDs and gives the AIC with the other choice. Checked against nlme and mmrm.
- Fit on a log scale (off by default): fits the model to the natural logs of the values, for data where effects multiply and spreads grow with the mean. Means read as geometric means and differences as ratios, with 1 as no difference, in the Statistics window, on brackets, and on a log axis in the Estimation Plot. Tests are of the logged values, and the covariance estimates stay on the log scale. Standardized effect sizes aren't offered, since a ratio already has no units. Every value must be above zero. It is your choice, made from what you know about the measurement, since no check of the shape can settle it when values are missing past a limit.
- Fit values past a limit (off by default): a cell such as <0.5 or >29 says only that its value lies past that limit. Checked, each such value counts as lying somewhere past its limit rather than as missing: a censored mixed model, the mixed-model form of Tobit regression, fitted by maximum likelihood. Empty cells stay missing unless you say they are below or above a limit, and then every empty cell is treated alike, with the limit given as one number or a column; there is no default limit, because a wrong one changes the answer without looking wrong. The result says how many values were past a limit. Means are model-based and can lie beyond anything measured, and the chart then draws those means and their CIs in place of the plain averages, which leave out the values past a limit. No standard small-sample correction exists for this model, so p-values read p ≈ and are approximate: tests are the likelihood ratio on F and CIs are Wald intervals on t, with subjects − groups denominator df, a rule chosen by simulation (at a 5% level, up to about 8% with 8 to 12 subjects per group, worst with Unstructured). They rest on a normal shape past the limit, so use the log scale where that is the better shape; limits are logged with the values. A warning appears when more than half a group's values at a condition are past a limit. If every value of a group at a condition is past a limit, that mean can't be estimated: choose a trend for time, or leave that condition out. A subject with more than 8 values past a limit needs Random intercept, which is then used and named. Brackets show Δ rather than a standardized size. It can't yet be combined with Values from the same. Fits with many values past a limit take longer, seconds or sometimes a minute with Unstructured; Cancel beside Compute Brackets stops one.
- Fitting: REML, as R's mmrm and nlme (unstructured), lme4 (random intercept, + slope) and nlme (AR(1)) fit it. Tests: Type III F for the group, time and group × condition effects, with Satterthwaite's denominator df, as R's lmerTest and mmrm report them; checked to match lmerTest and nlme on balanced, unbalanced and incomplete data.
- With 3 or more groups, a table tests each pair's difference in shape within the one model, Holm-adjusted.
- Rate of change: each group's slope across conditions (the least-squares line through its model-based means, in the data's units per unit) with its CI, and each pair's difference in slope with a simultaneous CI and adjusted p; with 3 or more groups, a test that all slopes are equal. When one group rises or falls faster than another, this is the effect size to report beside the interaction, and a more sensitive test of a steady divergence than any single condition.
- Each subject's slope: at the end of the table, every subject's own least-squares slope over the conditions (by row, with its group and, if used, its cluster), and each group's mean and SD of them. Use these to plot or export one rate per subject (a neuron, say): Send to Data Log, select the rows, then Text Tools › Send to Spreadsheet…. They are descriptive; the group slopes above are the model's estimates. In a spreadsheet, =SLOPE(values, times) gives the same number for one row.
- Then: the model-based mean of each group at each condition with its 95% CI, and the group differences at each condition (as R's emmeans, Satterthwaite df). All conditions and pairs form one family, with simultaneous CIs and adjusted p-values that match them: a difference is significant exactly when its CI excludes 0.
- The adjustment: single-step, from the multivariate t distribution of the comparisons (R's emmeans "mvt", multcomp), which accounts for how they correlate and so is less conservative than Bonferroni with the same protection. It is integrated numerically (Genz & Bretz 2009) with a fixed seed, so a re-run gives the same p, accurate to about the 4th decimal. When that integral can't be set up, the table says the adjustment is Bonferroni instead.
- Standardized differences: Hedges' g* and Cohen's d* divide each difference by the root mean square of the two groups' SDs of a single value at that condition, √((S₁² + S₂²)/2), every level's variance included, as for independent groups (Delacre et al. 2021; Hedges 2007; Westfall, Kenny & Judd 2014). With Spreads Assumed equal the groups share one covariance and the two SDs are one. g* adds Hedges' exact small-sample correction at the df of the SD it divides by, ν = S²/(2·Var S) (Hedges 2007). Their CIs are approximate (delta method), simultaneous like the differences', and a little wider. Checked against R (mmrm, lme4 and nlme fits, with the delta method from the REML Hessian).
- The fit: the covariance estimates (for Unstructured, each condition's SD and the correlations between conditions; otherwise the between-subject SD, slope SD and correlation, AR(1) ρ and residual SD), the between-source SD when a Values from the same column is chosen, a singular-fit note when a variance is estimated at 0, the REML criterion, AIC, BIC and marginal R², plus conditional R² for the random-effect structures (Nakagawa & Schielzeth 2013; Johnson 2014).
- Data checks: normality and outliers in each group × condition cell, using every value, and Levene's test across the groups at each condition.
- Also: each pair of groups' difference averaged over the conditions (the difference in level, with its CI; with 3 or more groups, simultaneous CIs and adjusted p, as above), the natural follow-up when two groups share a shape; and, when another covariance structure fits clearly better by AIC, a line naming it.
- Finding it: a table whose checked columns include one of groups, as codes (0, 1, 2…) or labels that repeat (WT, KO; shown as written, in the order they first appear) beside 2 or more columns of measurements gets an offer in DATA to analyze it as a Mixed model, with a Use button. Changing the Design clears the result until Determine Effect, as changing the Analysis does; changes within a design update a result already shown.
- Nested data (Values from the same): when several subjects come from the same source (a batch, plot, classroom, site, plate, litter or animal), choose the column naming each subject's source under Values from the same in DATA (a text column is offered too, and in a window opened from a chart, a column the chart took as row labels); it is None by default, and the layout is otherwise unchanged. The labels can be text ("M1", "M2") or numbers. The model then adds a random intercept for each source above the subjects' own, as R's lme4 fits (1 | source) + (1 | subject). Effects that differ between sources (the groups, when each source gives one group) are then tested against the spread between sources, with degrees of freedom near the number of sources, not the number of subjects. The result adds the between-source SD and the number of sources, and notes when that variance is estimated at 0 (the results then equal those without the column). A column named like Animal, Mouse, Slice, Litter, Subject, Classroom, Plate or Site whose labels repeat is offered with a link (Use “Mouse”). Checked against lmerTest and nlme with sources crossed with and nested in the groups.
- One value per row (clustered data): when each row is one measurement (a sample, a plant, a student, a cell) and rows come from shared sources (batches, plots, classrooms, animals), check just the value column, pick the group column (or None for one group) and, under Values from the same, the column naming each row's source. A table laid out this way (a value column, a group column, codes or labels, and a column named like Animal, Subject, Classroom, Plate or Site whose labels repeat) is recognized in the Groups and One sample designs, which offer to switch.
- The model (one value per row): value ~ group + (1 | source), as lme4's lmer fits it, with Satterthwaite CIs as lmerTest reports them. Spreads (May differ, the default, or Assumed equal) sets whether each group has its own residual SD (nlme's varIdent, the counterpart of Welch's test). A second level inside the first, and repeated measures in a long table, work as under Values from the Same in Charts. Checked against lme4, lmerTest, nlme and a dense REML fit in R.
- The result (one value per row): each group's mean and the differences with CIs; the between- and within-source SDs; the ICC, the share of the variation that lies between sources (0 when rows from one source are no more alike than any two rows); n rows and n sources for each group; and the same comparison with the rows treated as independent, with the ratio of the interval widths. When spreads may differ, each group's residual and total SD are listed, and the rows-treated-as-independent comparison is Welch's.
- Sources and groups (one value per row): when sources span the groups (two cell types recorded in each animal), the comparison is made largely within each source, and its interval can be narrower than when the sources are ignored. When each source is in one group only, the comparison rests on the sources more than on the rows.
- Standardized differences (one value per row): Hedges' g (Cohen's d with Hedges' exact small-sample correction at the df of the SD it divides by, ν = S²/(2·Var S), as Hedges (2007) corrects dT) and Cohen's d. d is the difference divided by the two groups' total SDs, each the SD of a single value with every level's variance included (Hedges 2007; Westfall, Kenny & Judd 2014): their average for groups measured within the same sources (dav; Lakens 2013), their root mean square for groups from different sources (d*; Delacre et al. 2021). The CIs are approximate (delta method).
- With the Split-plot or Mixed model design, the chart is a profile of each group: the conditions across, one color per group, each group's means ± error bars joined across conditions, and each subject's own line faint behind them. In a window opened from a chart of the same table, choosing either design (or Use on the suggestion) turns that chart into the profile, and choosing another design turns it back (Undo in the chart works too). Otherwise Make Chart opens the repeated-measures chart and links the window to it. Either way the chart, its spreadsheet and the window are one analysis: the data, the group and Values from the same columns, the conditions, Trend, Covariance and Spreads are shared both ways, and the chart's brackets come from the same model. (A window linked to a chart of a different table opens a separate repeated-measures chart, which follows the window.) Subjects and Means, in the chart's Plot Style panel, turns the subject lines, the means and the data points on or off. Paired / Repeated shows checked and locked: each row is one subject followed across conditions, and the groups are different subjects. Repeated Measures by Group, in the chart's Plot Style panel, makes the same chart from the table (pick the group column and an optional Values from the same column), and Back to One Column per Category undoes it.
- Brackets on the repeated-measures chart (Statistics tab → Compute Brackets) come from the mixed model, not from a test at each condition: the Statistics tab's MIXED MODEL zone replaces Compare and offers the model's Time, Covariance, Spreads and Values from the same.
- Each bracket joins two groups at one condition and shows an effect size for the difference in their model-based means (first group minus second), with its simultaneous CI and its p, adjusted over the whole family: the numbers of the window's per-time table. Effect size chooses Hedges' g* (the default), Cohen's d* (the groups are independent, so their SDs are combined as a root mean square), or Δ in the data's units. Δ's CI excludes 0 exactly when p is below α; g*'s and d*'s are a little wider.
- The bracket list in the Statistics tab names each comparison in full ("Hit 8: Subtype 0 vs Subtype 2") and lists them by condition, left to right. Every condition's brackets are drawn at first; the Show menu above the list narrows them, and the list turns each on or off.
- Rate of change on the repeated-measures chart: under Header (BRACKETS › Display), Rate of change (difference in slope) adds each pair's difference in slope, with its CI and p, below the test name. Brackets, in the MIXED MODEL zone, switches to Rate of change: one bracket per pair of groups spanning the conditions of Slope over … to … (every condition at first), labeled with the difference in their slopes (least-squares slopes through the model-based means), its CI and its p adjusted over the pairs. Show each group's fitted line draws the lines compared.
- A bracket's ends are spread across its condition so it stays readable while the groups' markers nearly overlap, and brackets at neighboring conditions alternate in height so their labels don't collide. They are drawn in the SVG, PDF and PNG exports, and the methods caption describes the model.
- One chart per window: while the repeated-measures chart made from a Statistics window is open, that window's button reads Show Chart, and the chart follows the window: changing the data, the group or source column, Time or Covariance there updates the same chart (keeping its colors and settings) and recomputes brackets already shown. Close the chart to make a fresh one.
- The AI Assistant fits the same model from a table you give it, can open the repeated-measures chart, and can change a repeated-measures chart's Time, Covariance and Values from the same (⌘Z undoes it).
Repeated-Measures ANOVA and Sphericity
Sphericity (equal variances of all pairwise differences between conditions) is an assumption of RM ANOVA. Violation makes the F-test anti-conservative (p too small). @Graph tests sphericity with Mauchly's W, shows the corrected p-values, and reports the Greenhouse-Geisser p as the result.
- Mauchly's W: from 0 (severe violation) to 1 (perfect sphericity), matching R. p ≥ α = sphericity not rejected, where α is 1 − the confidence level in Settings (0.05 at 95%); the same α decides the two-way and split-plot interaction verdicts and the Levene line. With unequal group sizes the within-subjects effect uses Type III sums of squares (the groups weighted equally), as SPSS and afex report.
- Greenhouse-Geisser correction (εGG): multiplies both numerator and denominator df by ε. ε = 1 means no correction needed; ε = 1/(k-1) is the most conservative possible (lower bound).
- Huynh-Feldt correction (εHF): less conservative than Greenhouse-Geisser, and some prefer it when εGG > 0.75. The table shows both. In Split-plot ANOVA both ε are computed from the covariance pooled within the between-subjects groups (as SPSS and R's car package do), with Lecoutre's correction to Huynh-Feldt.
- Which p to report: the Greenhouse-Geisser-corrected p, whatever Mauchly's test says, as @Graph does (Maxwell & Delaney 2004). Mauchly's test has little power at the sample sizes RM designs usually have, so a non-significant result is weak evidence that sphericity holds, and when it does hold εGG is close to 1 and the correction costs almost nothing.
Two-Way ANOVA
Design: Two-way (factorial). Tests two independent factors (such as genotype × treatment) and their interaction on means, reporting each effect's partial η² and Cohen's f with 90% CIs (noncentral F) alongside the omnibus table. @Graph detects whether cells have equal replicate counts (balanced) or not (unbalanced) and chooses the sums of squares accordingly. The table's note says which was used.
- Balanced design (equal n per cell): the classical sums of squares (Types I, II and III all agree here).
- Unbalanced design (unequal n per cell, every cell with at least one value): Type III sums of squares with sum-to-zero contrasts, as SPSS and R's afex report. Each effect is adjusted for every other term, and the main effects are about the equal-weight (unweighted) marginal means, the same estimated marginal means the post-hoc comparisons test. A design with an empty cell is not supported.
- Post-hoc: Tukey HSD (the default), Dunnett (every level against the first level of its factor, so order the columns with the control first), Holm-Bonferroni, Šidák or Bonferroni. Main-effect comparisons for both factors and, when the interaction is significant (p < α, from the confidence level), simple-effects comparisons (one factor's levels within each level of the other), all using the omnibus test's pooled error term (the within-groups mean square, MSW). With unequal cell sizes the main-effect comparisons use estimated marginal means (each level's cell means averaged with equal weight, as R's emmeans does), each with its own SE. Each row gives the difference with a CI adjusted in the same way as its p-value (simultaneous within each family; for Holm, the Bonferroni simultaneous CI that goes with it), and Cohen's d (difference ÷ √MSW) with a per-comparison CI.
- Normality/variance check: Levene's test and a per-cell normality summary are shown for information. They don't change the test, but a failing check is a reason to also weigh the Scheirer-Ray-Hare result below.
- Sensitivity (Scheirer-Ray-Hare): with Show the comparison on other scales on, the table ends with the same sums-of-squares decomposition on ranks, reporting H and a chi-square p-value for each factor and the interaction. It needs the same number of values in every cell. It is conservative overall but prone to false positives for the interaction in small samples, so treat a significant interaction there with extra caution.
- Two independent factors, not one factor repeated across conditions/conditions: if one factor is the same subjects measured repeatedly, use Split-plot (mixed) instead (see ANOVA Tables above).
Sensitivity: The Same Comparison on Other Scales
With Show the comparison on other scales on (the default), a Groups or conditions result ends with the same comparison on the other three Compare scales: for 2 groups each one's estimate, CI, p and test; for 3 or more each one's omnibus p (or, for paired trimmed means, which has no omnibus test, its smallest Holm-adjusted pairwise p). A Two-way result ends with the same analysis on ranks (Scheirer-Ray-Hare; see Two-Way ANOVA). A conclusion that holds on only one scale is worth a second look.
Data Checks and Suggestions
What the Window Suggests
When the window opens, and whenever the checked columns change, @Graph looks at the data and suggests (never forces) an analysis. A choice you have made is left alone.
- Numeric vs. binary (checked first): if the checked columns hold only 2 distinct values between them (such as 0/1), the data are treated as categorical and routed to the Categorical analysis (Fisher's Exact, McNemar's, Cochran's Q or Chi-square independence, depending on the number of columns and pairing) instead of running the data checks. The suggested test is marked ✦ in the picker. For one binary column (One-sample Binomial) or two independent binary columns (Fisher's Exact), @Graph fills the count fields from your data; they follow a change of columns until you type in them. McNemar's picks up the two checked columns. McNemar's and Cochran's Q need 0/1 coding, and the panel says so when the two values are something else.
- Independent vs. paired: always your choice; @Graph never changes Paired/Repeated from the data. Equal sizes can be either, so a note asks you to check the box if the data are matched. With Paired on and different numbers of values per column (a missing value, say), a note says the paired tests use only the subjects with a value in every compared column.
- Design: one checked column opens as One sample vs. a value; a chart with several series per category (not paired) opens as Two-way (factorial); a repeated-measures chart opens as Mixed model (repeated measures); anything else as Groups or conditions. The design follows the data until you pick one.
- Comparisons: All pairwise. When a column is named like a control, a suggestion offers vs. Control with it as the control; Use applies it.
- Compare: Means (Welch's t or Welch's ANOVA) until you choose. The data checks suggest Means, Ratio, Trimmed means or Ranks (see below), and the suggestion stays visible with a Use button, but only Use or your own choice changes Compare. A chart shows Means (every chart type, Estimation Plots included) until you first open its Statistics tab or a linked Statistics window, or ask the AI Assistant to run its statistics; from then on it follows your Compare choice, which is saved with the chart. A linked window uses the chart's own choice, and changing a shared setting there recomputes brackets already on the chart.
- Suggestions never take you away from a Descriptive or Normality view you are looking at; they are applied to the analysis that Determine Effect will run.
Data Checks Are Advisory
The DATA CHARACTERISTICS zone, in the Statistics window and on a chart's Statistics tab, describes the data. Nothing in it changes the analysis: choosing a test from normality or variance pretests is unstable and distorts error rates (Rochon, Gondan & Kieser 2012), so the checks only inform your choice. Each line has an ⓘ with the detail.
- Normality: Shapiro-Wilk for n ≤ 50, skewness and kurtosis above that (see Skewness and Kurtosis, below). A paired design is judged on what its test models: each subject's difference (2 conditions) or the residuals after removing subject and condition means (3 or more), not each condition's raw values. Normality affects how accurate a Means comparison's p-value and CI are at small n; it does not decide what is compared.
- Spread (independent groups): Levene's test (Brown-Forsythe variant) and the ratio of the largest to the smallest variance, for information: the Spreads choice, not this check, sets the test (see Which effect size, when). A p-value within 40% of α (0.03 to 0.07 at 95% confidence) is marked borderline. There is no spread check for Paired / Repeated data, and none is needed: the paired tests work on each subject's difference, so the two conditions' own variances never enter them (the only spread that matters, that of the differences, is already in the test's standard error), and Levene's test assumes independent groups, so it would be miscalibrated on the same subjects measured twice. With 3 or more repeated conditions the matching assumption is sphericity, which the repeated-measures ANOVA corrects for itself (Greenhouse-Geisser).
- Outliers: points outside their group's Tukey fences (Q1/Q3 ± 1.5×IQR; beyond 3×IQR is "far out"), with a robust modified z-score for each (Iglewicz & Hoaglin 1993). On a chart, Show possible outliers rings the flagged points in orange.
- Shape and suggestion: each independent group is read on its own, since groups may differ in shape. A group of 8 or more is strongly skewed when |skewness| ≥ 1 (Bulmer 1979) and its skew is beyond chance by D'Agostino's test, Bonferroni-corrected for the number of groups. Skew shared by the groups is read from them together, each scaled by its own SD (at least 16 values, |skewness| ≥ 1). Paired data and a single column are one set of at least 16 values: the differences, the within-subject residuals or the column. Strong skew suggests Ranks, which assume no particular shape, unless every group is large enough for the mean to stay reliable (the rule of thumb n ≥ 25 × skewness²; Cochran 1977), when it suggests Means. Right skew in positive values spanning at least a tenfold range, with none left on a log scale, suggests Ratio instead of Ranks. No standard cutoff exists for a log scale, so treat this as a prompt: whether changes are proportional comes from what the values are. Far-out values (beyond 3×IQR, in a group of 7 or more) suggest Trimmed means when they alone cause the skew. Without strong skew they suggest it only when the 20% trimmed mean is clearly the more precise: its variance times 1 + n^(−1/4) must still be below the mean's, the form of margin Jaeckel (1971) gives for choosing the least trimming among near-equal variances, which shrinks as n grows. Choosing by estimated variance goes back to Tukey & McLaughlin (1963); the exponent is this app's choice among those Jaeckel's conditions allow. This suits heavy tails. One far-out value in a large group barely touches the mean, so that stays Means. The trim itself stays at 20%: variance is nearly flat across trims, and a trim chosen from the data would change what skewed groups' means estimate (Jurečková, Koenker & Welsh 1994). The points marked as possible outliers (beyond 1.5×IQR) don't enter the suggestion. Otherwise Means. The reason is given in words. When your Compare choice differs from the suggestion, "Suggested: compare …" is shown in orange with a Use button that applies it, and a note says it is only a suggestion based on the data's shape: choose the comparison from your study design.
- Nothing switches by itself. Compare opens on Means and changes only when you choose or click Use; a chart's first bracket computation (or turning on the Estimation Plot) stores the choice in force, so a saved chart reopens on the same analysis.
- In "Within category" mode (charts with several series) each series is pooled across categories after centering each category's values on their own mean, so the checks describe the comparison that runs in every category without mixing distributions centered in different places.
Skewness and Kurtosis
@Graph reports bias-corrected skewness (G1) and excess kurtosis (G2), the convention used by R, SPSS, GraphPad Prism and Excel.
- G1 (skewness): G1 = g1 × √(n(n−1)) / (n−2), where g1 is the uncorrected sample skewness. For n ≥ 30 the correction is about 5% or less; for n < 10 it can be substantial.
- G2 (excess kurtosis): G2 = (n-1)/((n-2)(n-3)) × ((n+1)×g2 + 6), where g2 is the uncorrected sample excess kurtosis. A normal distribution has G2 = 0.
- The D'Agostino-Pearson K² normality test uses the uncorrected sample skewness and kurtosis (√b1 and b2), as its formulas require, not G1 and G2.
- Normality verdict by sample size (following Kim 2013): Shapiro-Wilk has little power at small n and flags trivial deviations at large n, so @Graph tiers the verdict. Up to n = 50, Shapiro-Wilk's p-value decides (G1/G2 are shown for context). From n = 51 to 299, the z-scores of G1/G2 are compared against a stricter 3.29 cutoff instead of 1.96. At n ≥ 300, the raw values decide: |skewness| > 2 or |excess kurtosis| > 4. The normality line in DATA CHARACTERISTICS and every normality summary in the Statistics window and chart inspector use this verdict. The Normality Tests table itself reports Shapiro-Wilk's W and p for any n from 3 to 5,000 (the range covered by Royston's method, which R also uses).
Descriptive Statistics
- Descriptive table (in DATA): n, mean, SD, SEM, median, IQR, min, max, skewness (G1), excess kurtosis (G2) and a 95% CI of the mean for every checked column, whichever analysis is chosen.
- Normality tests (in DATA): Shapiro-Wilk (n = 3–5,000), D'Agostino-Pearson K² (n ≥ 20) and Kolmogorov-Smirnov (Lilliefors) for every checked column. With Paired / Repeated on, the table adds the paired differences (2 conditions) or the residuals of the subject + condition model (3 or more), which is what the test assumes normal and what the data checks judge. For a split-plot design it tests each group × condition cell.
Other Analyses
Categorical Tests
For dichotomous/count data rather than continuous measurements. Routed here automatically when the checked columns hold only 2 distinct values (see What the Window Suggests above), or chosen from Categorical under Analysis.
- Fisher's Exact Test (2×2, independent groups): compares proportions between two independent groups. Type the cell counts (a, b / c, d); when routed here from two binary columns, @Graph fills them from your data. Reports the odds ratio and relative risk, each with a 95% CI, and notes that only the odds ratio is valid for a case-control (retrospective) design. The odds ratio is the conditional maximum-likelihood estimate, as R's fisher.test reports it. Its CI is the exact interval matched to the p-value (Fay 2010, as R's exact2x2 gives it): the odds ratios the same two-sided test does not reject, so it excludes 1 exactly when p is below α, and it is the CI the chart's brackets show. (R's fisher.test prints the central interval, α/2 in each tail, which near α can contradict its own p: 1 3 / 6 0 has p = 0.033 beside a central CI of 0 to 1.17.) With a zero cell the estimate and one bound are 0 or ∞, as in R, rather than a finite number invented by adding 0.5 to every cell. The headline effect size is ln(Odds Ratio) with its own 95% CI, on which an odds ratio of 0.2 and one of 5.0 are equally far from 0 (signed, so its direction shows which group had the higher odds).
- McNemar's Test (paired 2×2): the same subjects measured on one binary outcome twice (such as before/after), entered as two 0/1 columns. The headline effect size is Δp, the difference in proportions (b − c)/n, with Tango's paired score interval (Tango 1998): how much more often one condition was positive, using every subject; it keeps close to its level at small n and stays finite when a discordant cell is empty. The table also reports the paired odds ratio (b/c, the ratio of discordant pairs), ln(Odds Ratio), and Cohen's g = b/(b+c) − 0.5, how far the discordant pairs depart from a 50/50 split (range ±0.5), and the discordant counts b and c; a chart's brackets can show any of them. The odds ratio and Cohen's g use only the subjects that changed, so with fewer than 10 of them the table adds a note: one changed subject gives g = 0.5. Their CIs come from one exact Clopper-Pearson interval for the discordant split b/(b+c), so they exclude the null exactly when the exact binomial test is significant (a Wilson interval could disagree with it: b = 5, c = 0 gave an OR CI excluding 1 beside p = 0.0625). When c or b is 0 the odds ratio is ∞ or 0, and the CI is open on that side. The p-value is always the exact binomial test (two-sided, as R's exact2x2 mcnemar.exact gives it), at any number of discordant pairs, so p and the CIs always agree.
- Cochran's Q (paired, k≥2 binary conditions): extends McNemar's to 3 or more repeated binary conditions per subject; the binary counterpart of Friedman's test. Reports the χ² p-value and an exact permutation p-value for the same Q (each subject's successes equally likely to fall on any condition; for 2 conditions it equals the exact McNemar test). When few subjects changed (n below 4 or n·k below 24, where n counts only the subjects whose responses differ across conditions, as in Tate & Brown 1970), the exact p is the test's p: it is the p the result, the per-category table, chart brackets and the AI Assistant report, with the χ² p beside it. Otherwise the χ² p is reported, with the exact one beside it; the result says which rule applied. With many subjects the permutation p is a Monte Carlo estimate (100,000 rearrangements, seeded from the data). Also reports a Kendall's W-style effect size with a bootstrap 95% CI, and runs pairwise McNemar post-hoc comparisons for k≥3, all pairs or each vs. a control (the Comparisons picker under Options), exactly as the chart's brackets run them: each pair uses every subject with values in both of its conditions, p is Holm-adjusted, and the paired odds ratio and Cohen's g have simultaneous (Bonferroni, 1 − α/m) exact CIs.
- Chi-square Test of Independence (r×c, independent groups): 2 or more groups against 2 or more categories, one column per group, each cell a category code (0, 1, 2, …). Reports Cramér's V and its bias-corrected version (Bergsma 2013), each with a bootstrap 95% CI, and the smallest expected count. When an expected count is below 1, or more than 20% of them are below 5 (Cochran 1954), the χ² p-value is unreliable: the result and the panel say so and suggest Fisher's exact (r×c), with a Use button. Three or more groups of 0/1 data open here.
- Fisher's Exact Test (r×c): the same table and effect sizes as the chi-square test of independence, with Fisher's exact p-value (the Freeman-Halton extension, as R's fisher.test): the probability, given the row and column totals, of every table no more likely than the one observed. A table too large to enumerate gets a Monte Carlo p-value from 100,000 random tables with the same totals, as R's fisher.test(simulate.p.value = TRUE), with the seed shown so it reproduces.
- Chi-square goodness-of-fit: tests observed counts against an expected distribution (uniform by default, or typed in, one value per category, separated by commas, or by semicolons when the values use a decimal comma: 0,3; 0,5; 0,2). The first checked column holds one count per category, one row per category; the panel and the result name it, and say so when other columns are checked, since they are not used. Reports Cohen's w (the one-sample analogue of Cramér's V) with a bootstrap 95% CI.
- One-sample Binomial Test: tests whether an observed proportion of successes differs from a hypothesized value p₀. Reports the observed proportion and its difference from p₀, each with an exact Clopper-Pearson 95% CI, and the exact two-sided p, as R's binom.test does. For p₀ other than 0.5 the CI and p can disagree just at the threshold (the CI inverts the equal-tailed test); the table then says so, and the p-value decides the test. When routed here from a single binary column, @Graph fills in the counts from your data.
Correlation and Regression
- Correlation (Pearson r, Spearman ρ, Kendall's τ-b, linear regression): for two continuous columns. Pearson r is the headline effect size, with a 95% CI (Fisher z-transform); the regression slope and intercept each get a 95% CI too. Spearman ρ and Kendall's τ-b are reported alongside, each with a bootstrap 95% CI (resampling the (x,y) pairs together). Kendall's p-value is exact, as in R, when there are no ties and n is below 50, and by permutation for n ≤ 10 with ties; Spearman's is exact (permutation) for n ≤ 10, and above that, with no ties, comes from the AS 89 Edgeworth series as in R (Best & Roberts 1975). Otherwise they use large-sample approximations. Exact p-values are marked '(exact)'.
- Regression: Simple Linear (one X, one Y, the default) and Dose-Response (4-parameter logistic) take one X and one Y column, like Correlation. Multiple Regression and ANCOVA take one row per observation, not one column per group. Simple Linear and Multiple Regression can add standardized coefficients, robust SEs and residual diagnostics. See Multiple Regression and ANCOVA below.
Multiple Regression and ANCOVA
The Regression analysis takes a different data shape from the group comparisons above: one row per observation (a cell, a sweep, an animal), with the outcome (Y) and each predictor in its own column. Pick the outcome in Y (outcome) column and check every predictor column in the Columns list. For a single predictor, choose Simple Linear or use Correlation, since Multiple Regression needs 2 or more.
- Multiple Regression: models one continuous Y from 2+ predictors at once (Y = b₀ + b₁X₁ + b₂X₂ + …), so each coefficient is that predictor's effect with the others held constant. Reports R² and Cohen's f (with 90% CIs from the exact distribution of R², treating the predictors as random; Fisher 1928), adjusted R², the overall model F-test, and each term's B/SE/95% CI/t/p. Predictors on a large offset (such as 10⁸ ± 1) fit normally. If a predictor is constant, or a combination of the others, the message names it.
- VIF (variance inflation factor): shown per predictor for up to 20 predictors (a note says when it is skipped). VIF > 5 flags moderate multicollinearity (interpret that coefficient with caution); VIF > 10 flags severe multicollinearity (that coefficient is unreliable; consider removing or combining the correlated predictors).
- Options for Simple Linear and Multiple Regression, all off by default (with none on, the table is exactly as described above):
- Standardized coefficients (β): adds a Std. β column beside each B, the change in Y in SDs per SD of that predictor (B × SD(X) / SD(Y) over the rows used, as R's lm on scale()d variables). It uses this sample's SDs, so it shifts with how widely each predictor happened to be sampled: compare it between predictors in one model, not across studies. With one predictor it equals Pearson r.
- Robust (heteroscedasticity-consistent) SEs: each coefficient's SE, 95% CI, t and p use the sandwich estimator instead, labeled with its name: HC3 (the default, recommended at lab sample sizes; Long & Ervin 2000), HC2, HC1 or HC0 (White 1980), as R's sandwich::vcovHC with lmtest::coeftest (t on the residual degrees of freedom). Use them when the spread of Y changes with a predictor, such as a fan shape in the Residuals vs Fitted plot. R², the model F test and VIF stay the ordinary ones.
- Residual diagnostics: adds R's four plot.lm plots under the result (Residuals vs Fitted, Normal Q-Q of the standardized residuals, Scale-Location, and Residuals vs Leverage with Cook's distance contours at 0.5 and 1), each with its lowess smooth in red and the most extreme rows numbered, plus a table of the rows with the largest Cook's D, leverage and studentized residuals. Each rule is listed with its cutoff and the rows it flags: Cook's D > 4/n (worth a look) or > 1 (highly influential; Cook 1977), leverage h > 2p/n (twice the average hat value, p counting the intercept; Belsley, Kuh & Welsch 1980), and |studentized residual| > 2 or > 3 (externally studentized, as R's rstudent; about 5% of rows pass 2 by chance). Rows are numbered as in your data. A flag is a reason to check that row, not to delete it. The plots stay in the window; the table goes into exported reports and the Data Log.
- ANCOVA: compares group means on Y after adjusting for one or more continuous covariates. Pick which checked predictor column is the categorical factor. It must hold small numeric group codes (0, 1, 2, …), since text labels can't be parsed; every other checked predictor is treated as a continuous covariate.
- ANCOVA's table reports each term's partial F-test and partial η² (each adjusted for every other term; the factor's partial η² and Cohen's f also get 90% CIs, noncentral F), the covariate-adjusted group means, and post-hoc pairwise comparisons of those means: mean difference with a 95% CI adjusted in the same way as its p-value (ANCOVA has its own post-hoc picker: Tukey-Kramer by default, as in R's emmeans, or Holm-Bonferroni, Šidák or Bonferroni), so each CI excludes zero exactly when its adjusted p is significant (for Holm, the Bonferroni simultaneous CI that goes with it), and Cohen's d. d divides the adjusted difference by the pooled within-group SD of Y before adjustment, not the covariate-adjusted residual SD, which is smaller and would inflate d relative to the same difference in a study without the covariate.
- Homogeneity of slopes: checked automatically. If the factor × covariate interaction is significant (p < 0.05), a warning appears: the covariate's relationship with Y differs across groups, so the adjusted-means comparison isn't valid as reported. Consider analyzing groups separately or modeling the interaction. If there is too little data to test this, the table says so; the comparison still runs, but on an unverified assumption.
- Variance homogeneity: Levene's test (Brown-Forsythe version) on the model's residuals across the factor groups is shown alongside, with a warning if their spread differs. ANCOVA assumes equal error variance, the spread around each group's line; the raw outcome's spread also reflects how much the covariate varies in each group, so it is not tested. Treat a violation as a reason to look closer, not proof the model is invalid.
- Scope: one categorical factor plus one or more covariates. ANCOVA with more than one categorical factor isn't supported.
- Dose-Response (4-parameter logistic): one X (dose/concentration) column and one Y (response) column, like Correlation. Fits a 4-parameter logistic (Hill) curve (Bottom, Top, LogEC50, Hill slope), reporting each parameter's SE and 95% CI, R², and EC50 on the raw dose scale. EC50 gets both a Wald and a profile-likelihood CI, and an F test says whether there is any dose-response at all. The fit is the same in any unit (amperes, counts, molar or nanomolar doses), as it runs on rescaled axes. "Converged: yes" means the fit reached a true minimum (R's relative-offset test) with every SE computable; otherwise a warning replaces the SEs and CIs. When the doses never reach one plateau, the profile CI can be one-sided (for example 0 – 2.1e-6), meaning the data cannot rule out an EC50 beyond that side. A checkbox says whether X already holds log10(dose) or should be log-transformed (raw doses must be > 0). This fit is separate from the Boltzmann (sigmoid) fit in a Graph window's Curve Fitting panel and shares no settings with it.
- Dose-Response constraints and weighting: check Bottom, Top or Hill slope under Constraints to hold it at the value you type (for example Bottom = 0 and Top = 100 for data normalized to percent). A fixed parameter is not fitted, so it has no SE or CI and gives its degree of freedom back to the residuals; the SEs, the profile CI and the F test all use the reduced model. Weighting by 1/Y² (scatter that grows with the response) or 1/Y (Poisson-like counts) uses the fitted curve's response, as Prism 5 and later do, re-estimated from each fit until it settles (iteratively reweighted least squares, the consistent estimator; Carroll & Ruppert 1988). Minimizing the weighted sum of squares outright, weights and all, pulls the curve up instead, so a program that does that gives slightly different numbers. R's nls weights by each point's own response instead, which pulls the curve toward the points that happen to fall low: in simulations with 20% scatter it left Top 7% low and 95% CIs covering 90%. R², the SEs, the CIs and every test then use the weighted sum of squares, which the table reports. With any option on, the table also lists the fixed values, the weighting and the residual SS with its df.
- Replicates test for lack of fit: offered when some dose is repeated. Pure error is the scatter of replicates around their own dose mean, which no curve can remove; the F test asks whether the curve misses the dose means by more than that scatter (Prism's replicates test, and what R's anova gives against a one-way ANOVA on dose). A small p means another model may fit better.
- Comparing curves: with Compare set, each checked column other than X is a data set at the X column's doses (or, with "Checked columns as X,Y pairs", the checked columns in order are X1, Y1, X2, Y2, …, as a Scatter lays them out). Ask whether one curve fits all data sets, or whether one parameter (LogEC50, Bottom, Top or Hill slope) differs while the others stay separate. The effect comes first: each data set's LogEC50 difference from the first, with its CI, and the matching EC50 ratio. Then the extra sum-of-squares F test of the shared model against separate curves (F, df, p and both models' SS), the shared fit's parameters with SEs and CIs, and, if checked, AICc: the difference and each model's probability of being correct. Constraints and weighting apply to every data set.
- Missing data: all three (Multiple Regression, ANCOVA, Dose-Response) use complete-case analysis: a row missing a value in Y, X, or any included predictor is dropped from that fit entirely.
Charts and the Data Log
Linked to a Chart
Opened from a chart (Open Full Statistics Window), the window is linked to it: Paired / Repeated and every Compare setting (Compare, Spreads, Question, effect size, post-hoc, tails) are shared both ways, including with the chart's brackets, and so are the comparisons and the control while the window compares exactly the chart's groups. The Show Chart button in the header brings the linked chart to the front. A window with no linked chart shows Make Chart instead: it opens a chart of the data and links the window to it, carrying the window's current settings over. Edit as Spreadsheet… links the window the same way to the spreadsheet it opens, and edits there update the statistics right away. While the chart is a profile (Split-plot or Mixed model), its spreadsheet shows the subject table: one row per subject, with the group column, the conditions and any source column.
Using the Data Log and Spreadsheets with Statistics
Any numeric table in the Data Log or a Spreadsheet can be analyzed. In the Data Log, type or paste tab-delimited columns (one group per column), select the block including any header row, and press ⌘T. In a Spreadsheet, use the Data Statistics toolbar button. A first row of text is read as headers. Results go to the Data Log only when you click Send to Data Log.
The Text Tools menu provides List Stats (⇧⌘T) to compute mean/SD/SEM/count for each column directly in the Data Log without opening the Statistics window.
Brackets and the Estimation Plot
A chart's Statistics tab uses the same zones and settings to draw effect size brackets (see Charts → Effect Size Brackets), and its Show Estimation Plot button plots each Compare estimate with its bootstrap CI and sampling distribution (see Charts → Estimation Plot).
References
Agresti A (2013). Categorical Data Analysis, 3rd edition. Hoboken, NJ: Wiley. The difference of paired (dependent) proportions, Δp, and McNemar's test.
Algina J, Keselman HJ & Penfield RD (2005). An alternative to Cohen's standardized mean difference effect size: a robust parameter and confidence interval in the presence of outliers. Psychological Methods, 10(3):317–328. https://doi.org/10.1037/1082-989X.10.3.317 AKP robust d.
Bakeman R (2005). Recommended effect size statistics for repeated measures designs. Behavior Research Methods, 37(3):379–384. https://doi.org/10.3758/BF03192707 Generalized η² for repeated-measures designs.
Bates D, Mächler M, Bolker B & Walker S (2015). Fitting linear mixed-effects models using lme4. Journal of Statistical Software, 67(1):1–48. The REML fit of the mixed model.
Belsley DA, Kuh E & Welsch RE (1980). Regression Diagnostics: Identifying Influential Data and Sources of Collinearity. New York: Wiley. The 2p/n leverage rule in regression diagnostics.
Bergsma W (2013). A bias-correction for Cramér's V and Tschuprow's T. Journal of the Korean Statistical Society, 42(3):323–328. https://doi.org/10.1016/j.jkss.2012.10.002 The bias-corrected Cramér's V.
Best DJ & Roberts DE (1975). Algorithm AS 89: the upper tail probabilities of Spearman's rho. Journal of the Royal Statistical Society, Series C (Applied Statistics), 24(3):377–379. The Edgeworth series for Spearman's p above n = 10, as R's cor.test uses.
Brunner E & Munzel U (2000). The nonparametric Behrens-Fisher problem: asymptotic theory and a small-sample approximation. Biometrical Journal, 42(1):17–25. The Brunner-Munzel test.
Bulmer MG (1979). Principles of Statistics. New York: Dover. The informal |skewness| ≥ 1 rule of thumb for strong skew behind the Compare suggestion.
D'Agostino RB (1970). Transformation to normality of the null distribution of g1. Biometrika, 57(3):679–681. The test of skewness behind the Compare suggestion.
Cochran WG (1977). Sampling Techniques, 3rd ed. New York: Wiley. The rule of thumb n ≥ 25 × skewness² for a reliable mean, behind the Compare suggestion at large n.
Carroll RJ & Ruppert D (1988). Transformation and Weighting in Regression. New York: Chapman & Hall. Why dose-response 1/Y² and 1/Y weights come from the fitted curve, iterated, rather than from each point's own response, which biases the fit.
Cleveland WS (1979). Robust locally weighted regression and smoothing scatterplots. Journal of the American Statistical Association, 74(368):829–836. https://doi.org/10.1080/01621459.1979.10481038 The lowess smooth on the regression diagnostic plots.
Cliff N (1993). Dominance statistics: ordinal analyses to answer ordinal questions. Psychological Bulletin, 114(3):494–509. https://doi.org/10.1037/0033-2909.114.3.494 Dominance δ.
Clopper CJ & Pearson ES (1934). The use of confidence or fiducial limits illustrated in the case of the binomial. Biometrika, 26(4):404–413. The exact interval behind the one-sample binomial CI, McNemar's odds ratio and Cohen's g CIs, and the paired dominance δ's CI.
Cook RD (1977). Detection of influential observation in linear regression. Technometrics, 19(1):15–18. https://doi.org/10.1080/00401706.1977.10489493 Cook's distance.
Cumming G & Calin-Jageman R (2024). Introduction to the New Statistics: Estimation, Open Science, and Beyond, 2nd edition. New York: Routledge. Estimation statistics.
Cumming G & Finch S (2001). A primer on the understanding, use, and calculation of confidence intervals that are based on central and noncentral distributions. Educational and Psychological Measurement, 61(4):532–574. https://doi.org/10.1177/0013164401614002 Noncentral-t intervals for d and g.
Delacre M, Lakens D & Leys C (2017). Why psychologists should by default use Welch's t-test instead of Student's t-test. International Review of Social Psychology, 30(1):92–101. https://doi.org/10.5334/irsp.82 Welch's t as the default.
Delacre M, Lakens D, Ley C, Liu L & Leys C (2021). Why Hedges' g*s based on the non-pooled standard deviation should be reported with Welch's t-test. PsyArXiv preprint. https://doi.org/10.31234/osf.io/tu6mp Hedges' g* and its CI, reported with Welch's t.
Dunnett CW (1980). Pairwise multiple comparisons in the unequal variance case. Journal of the American Statistical Association, 75(372):796–800. Dunnett's T3.
Efron B & Tibshirani RJ (1993). An Introduction to the Bootstrap. New York: Chapman & Hall. Percentile (ch. 13) and BCa (ch. 14) bootstrap intervals.
Fagerland MW, Lydersen S & Laake P (2014). Recommended tests and confidence intervals for paired binomial proportions. Statistics in Medicine, 33(16):2850–2875. Recommends the exact McNemar test and, for the difference of paired proportions (Δp), Tango's score interval among others.
Fisher RA (1928). The general sampling distribution of the multiple correlation coefficient. Proceedings of the Royal Society of London, Series A, 121(788):654–673. https://doi.org/10.1098/rspa.1928.0224. The exact distribution behind Multiple Regression's R² CI.
Fitts DA (2025). Bootstrap BCa confidence intervals for a standardized mean difference in a paired samples design using a pooled standard deviation. The Quantitative Methods for Psychology, 21(3):125–138. https://www.tqmp.org/RegularArticles/vol21-3/p125/p125.pdf The bootstrap CI for dav/gav (the paper covers the uncorrected statistic; @Graph applies the same method to gav).
Glass GV (1976). Primary, secondary, and meta-analysis of research. Educational Researcher, 5(10):3–8. Glass's Δ, standardized by the control group's SD.
Goulet-Pelletier J-C & Cousineau D (2018). A review of effect sizes and their confidence intervals, Part I: The Cohen's d family. The Quantitative Methods for Psychology, 14(4):242–265. https://www.tqmp.org/RegularArticles/vol14-4/p242/p242.pdf Shows that pooled-SD and average-SD standardizers coincide in a paired design, so Fitts (2025) applies to dav/gav.
Hall P, DiCiccio TJ & Romano JP (1989). On smoothing and the bootstrap. Annals of Statistics, 17(2):692–704. Why smoothing improves the bootstrap of a median or other quantile.
Hedges LV & Olkin I (1985). Statistical Methods for Meta-Analysis. Orlando, FL: Academic Press. The sampling distribution of Glass's Δ.
Hedges LV (1981). Distribution theory for Glass's estimator of effect size and related estimators. Journal of Educational Statistics, 6(2):107–128. The small-sample correction J behind g, g*, gz, gav and Glass's Δ.
Hedges LV (2007). Effect sizes in cluster-randomized designs. Journal of Educational and Behavioral Statistics, 32(4):341–370. https://doi.org/10.3102/1076998606298043. Effect sizes standardized by the total SD with every level's variance included, used for dav and gav with Values from the same.
Ho J, Tumkaya T, Aryal S, Choi H & Claridge-Chang A (2019). Moving beyond P values: data analysis with estimation graphics. Nature Methods, 16(7):565–566. https://doi.org/10.1038/s41592-019-0470-3 DABEST; the bootstrap estimation plot.
Hollander M, Wolfe DA & Chicken E (2014). Nonparametric Statistical Methods, 3rd edition. Hoboken, NJ: John Wiley & Sons. The Hodges-Lehmann estimate and its confidence interval.
Iglewicz B & Hoaglin DC (1993). How to Detect and Handle Outliers. Milwaukee, WI: ASQC Quality Press. The modified z-score shown for each outlier.
Jaeckel LA (1971). Some flexible estimates of location. Annals of Mathematical Statistics, 42(5), 1540–1552. Choosing the trimming by estimated variance, and the margin the Compare suggestion uses (p. 1545).
Johnson PCD (2014). Extension of Nakagawa & Schielzeth's R²GLMM to random slopes models. Methods in Ecology and Evolution, 5(9):944–946.
Jurečková J, Koenker R & Welsh AH (1994). Adaptive choice of trimming proportions. Annals of the Institute of Statistical Mathematics, 46(4), 737–755. Why the trim stays fixed at 20%.
Karch JD (2021). Psychologists should use Brunner-Munzel's instead of Mann-Whitney's U test as the default nonparametric procedure. Advances in Methods and Practices in Psychological Science, 4(2). https://doi.org/10.1177/2515245921999602 Brunner-Munzel as the test for Ranks.
Kelley K (2007). Confidence intervals for standardized effect sizes: theory, application, and implementation. Journal of Statistical Software, 20(8):1–24. https://doi.org/10.18637/jss.v020.i08. The MBESS implementation the η² and ω² intervals match; its R² interval approximates the exact one used here.
Kim H-Y (2013). Statistical notes for clinical researchers: assessing normal distribution (2) using skewness and kurtosis. Restorative Dentistry & Endodontics, 38(1):52–54. https://doi.org/10.5395/rde.2013.38.1.52 The sample-size-tiered normality verdict.
Kuznetsova A, Brockhoff PB & Christensen RHB (2017). lmerTest package: tests in linear mixed effects models. Journal of Statistical Software, 82(13):1–26. The mixed model's Type III F tests with Satterthwaite's df.
Lakens D (2013). Calculating and reporting effect sizes to facilitate cumulative science: a practical primer for t-tests and ANOVAs. Frontiers in Psychology, 4:863. https://doi.org/10.3389/fpsyg.2013.00863 dav/gav for paired designs.
Lecoutre B (1991). A correction for the ε̃ approximate test in repeated measures designs with two or more independent groups. Journal of Educational Statistics, 16(4):371–372. The Huynh-Feldt ε used for Split-plot ANOVA.
Lee YS (1971). Some results on the sampling distribution of the multiple correlation coefficient. Journal of the Royal Statistical Society, Series B, 33(1):117–130. The approximation R's MBESS uses for the same R² interval.
Long JS & Ervin LH (2000). Using heteroscedasticity consistent standard errors in the linear regression model. The American Statistician, 54(3):217–224. https://doi.org/10.1080/00031305.2000.10474549 HC3 as the robust SE for small samples.
MacKinnon JG & White H (1985). Some heteroskedasticity-consistent covariance matrix estimators with improved finite sample properties. Journal of Econometrics, 29(3):305–325. https://doi.org/10.1016/0304-4076(85)90158-7 The HC1, HC2 and HC3 robust SEs.
Mair P & Wilcox R (2020). Robust statistical methods in R using the WRS2 package. Behavior Research Methods, 52:464–488. https://doi.org/10.3758/s13428-019-01246-w
Maxwell SE & Delaney HD (2004). Designing Experiments and Analyzing Data: A Model Comparison Perspective, 2nd edition. Mahwah, NJ: Lawrence Erlbaum. Applying the Greenhouse-Geisser correction routinely.
Moher D, Hopewell S, Schulz KF, Montori V, Gøtzsche PC, Devereaux PJ, Elbourne D, Egger M & Altman DG (2010). CONSORT 2010 explanation and elaboration: updated guidelines for reporting parallel group randomised trials. BMJ, 340:c869. https://doi.org/10.1136/bmj.c869. Item 17b: for a binary outcome, report an absolute effect size, such as the difference in proportions (Δp), beside any relative one, such as an odds ratio.
Motulsky H & Christopoulos A (2004). Fitting Models to Biological Data Using Linear and Nonlinear Regression. New York: Oxford University Press. The dose-response constraints, 1/Y² and 1/Y weighting, the replicates test and the extra sum-of-squares F test and AICc for comparing curves.
Nakagawa S & Schielzeth H (2013). A general and simple method for obtaining R² from generalized linear mixed-effects models. Methods in Ecology and Evolution, 4(2):133–142.
Neubert K & Brunner E (2007). A studentized permutation test for the non-parametric Behrens-Fisher problem. Computational Statistics & Data Analysis, 51(10):5192–5204. The small-sample permutation p-value for Brunner-Munzel.
Olejnik S & Algina J (2003). Generalized eta and omega squared statistics: measures of effect size for some common research designs. Psychological Methods, 8(4):434–447. https://doi.org/10.1037/1082-989X.8.4.434 Generalized η² and ω².
Pauly M, Asendorf T & Konietschke F (2016). Permutation-based inference for the AUC: a unified approach for continuous and discontinuous data. Biometrical Journal, 58(6):1319–1337. The small-sample confidence interval for Brunner-Munzel's P, and so for δ.
Pinheiro JC & Bates DM (2000). Mixed-Effects Models in S and S-PLUS. New York: Springer. The AR(1) covariance structure.
Rochon J, Gondan M & Kieser M (2012). To test or not to test: preliminary assessment of normality when comparing two independent samples. BMC Medical Research Methodology, 12:81. https://doi.org/10.1186/1471-2288-12-81 Why the data checks advise rather than switch the test.
Satterthwaite FE (1946). An approximate distribution of estimates of variance components. Biometrics Bulletin, 2(6):110–114.
Silverman BW & Young GA (1987). The bootstrap: to smooth or not to smooth? Biometrika, 74(3):469–479. The smoothed bootstrap behind the Estimation Plot's medians and trimmed means.
Smithson M (2001). Correct confidence intervals for various regression effect sizes and parameters: The importance of noncentral distributions in computing intervals. Educational and Psychological Measurement, 61(4):605–632. https://doi.org/10.1177/00131640121971392
Steiger JH & Fouladi RT (1997). Noncentrality interval estimation and the evaluation of statistical models. In Harlow LL, Mulaik SA & Steiger JH (eds), What If There Were No Significance Tests? Mahwah, NJ: Erlbaum, 221–257. The noncentral-t confidence intervals for Cohen's d and Hedges' g.
Steiger JH (2004). Beyond the F test: Effect size confidence intervals and tests of close fit in the analysis of variance and contrast analysis. Psychological Methods, 9(2):164–182. https://doi.org/10.1037/1082-989X.9.2.164 With Smithson (2001), the noncentral-F CIs for η², partial η², ω², Cohen's f and R², and their 1 − 2α level.
Tango T (1998). Equivalence test and confidence interval for the difference in proportions for the paired-sample design. Statistics in Medicine, 17(8):891–908. The score interval for the paired difference in proportions: McNemar's Δp and the Estimation Plot's paired difference.
Tukey JW & McLaughlin DH (1963). Less vulnerable confidence and significance procedures for location based on a single sample (Trimming/Winsorization 1). Sankhyā Series A, 25, 331–352.
Westfall J, Kenny DA & Judd CM (2014). Statistical power and optimal design in experiments in which samples of participants respond to samples of stimuli. Journal of Experimental Psychology: General, 143(5):2020–2045. https://doi.org/10.1037/xge0000014. Standardizing a mixed model's difference by the SD of a single value, all variance components included.
White H (1980). A heteroskedasticity-consistent covariance matrix estimator and a direct test for heteroskedasticity. Econometrica, 48(4):817–838. https://doi.org/10.2307/1912934 The HC0 robust SE.
Wilcox RR (2017). Introduction to Robust Estimation and Hypothesis Testing, 4th edition. London: Academic Press. With Mair & Wilcox (2020), the trimmed-mean methods behind the Trimmed means comparison (Yuen's tests and the trimmed-means ANOVA).
Yuen KK (1974). The two-sample trimmed t for unequal population variances. Biometrika, 61(1):165–170. Yuen's trimmed t.
Zimmerman DW (2004). A note on preliminary tests of equality of variances. British Journal of Mathematical and Statistical Psychology, 57(1):173–181. Why the variance check never chooses the test.
Exporting
The Export button in a graph or chart window's toolbar (the first of its tool buttons) opens one menu for everything: under Image, Image… (PNG, JPEG, TIFF, GIF, PDF, SVG), Copy as PDF and Send to Keynote…; under Data, @Graph (.@graph) and the data formats below. File → Export… (⇧⌘E) opens the same image panel.
Exporting a graph happens in the background, so the app stays responsive while a large figure is written. If an export takes more than a moment, a progress indicator appears; click Cancel to stop it, and no file is written.
Export (⇧⌘E)
- PNG: lossless raster, good for presentations and the web. A PNG, JPEG or TIFF records its resolution in sRGB color, so it places at its intended size in Word or a journal system.
- JPEG: compressed raster with a quality slider (50–100%), for smaller files.
- GIF: 256-color raster, for simple figures.
- PDF: vector, resolution-independent. Best for publications and Illustrator/Affinity.
- SVG: vector with individually selectable elements and editable text, for Illustrator, Affinity Designer and Inkscape. Its size is in points (72 per inch), so it opens at the same physical size in Illustrator, Inkscape, Affinity and browsers.
- TIFF: lossless raster.
The exported image matches what's on screen, including axis labels, group layout, colors, effect size brackets, data overlays, scale bars, cursors A and B, and minor ticks. PDF and SVG exports are clean vector with no clipping masks. The panel starts from the format, size and resolution set in Settings → Export. Transparent background leaves the background out of PNG, TIFF and GIF images.
Graphs: set the width and height (pixels for images, points for PDF and SVG); the panel shows the placed size in millimeters and inches. For images, choose the resolution (72 to 1,200 dpi); 300 dpi suits photos and color figures, 600 dpi line art. The panel shows the output in pixels and warns when an image would be too large to make (over 30,000 pixels a side or 250 million pixels). Match window resets the resolution to 72 dpi; raise it afterwards for a sharper image with the same layout. PDF and SVG are sized in points (72 per inch), so a figure places at the size shown in Illustrator, Inkscape and Affinity. Match window, Copy as PDF and Send to Keynote use the size of the graph area on screen.
- Every graph export (PNG, JPEG, TIFF, GIF, PDF and SVG) is drawn by the same code as the window: the same axis ranges, tick values and units (such as ms), junction-potential-corrected Y labels, log axes, legend, trend line, scale bars, interval bars, AP markers and error bars.
- Each sweep is one editable path. Parts of a trace outside the plot area are cut off exactly at its edge. For PDF and SVG, Data resolution sets how many points per inch of printed plot width each sweep keeps (200, 400, 600, All or a custom number; the panel shows the points per sweep). Every sweep keeps the highest and lowest value of each stretch and its first and last points, and gaps stay gaps, so peaks and gaps survive at any setting.
- What only matters while you work is left out: the selected sweep's highlight and a panel's highlighted analysis window.
- PDF exports of graphs embed the fonts they use, as subsets with just the characters needed, so text looks the same on every computer, passes journal checks for embedded fonts, and stays searchable and editable. Each label uses the font you chose (Helvetica for the system font), and symbols such as µ, Δ, Ω, Greek letters, subscripts and non-Latin scripts print correctly. If a font's license doesn't allow embedding, its text is drawn as outlines instead and the Data Log says so. SVG text uses the fonts chosen in the inspector. SVG text names each font's family with its weight (from Thin to Black), italic and width, so faces such as Avenir Next Medium or Helvetica Neue Condensed Bold look the same in browsers, Inkscape and Illustrator as on screen.
Printing (⌘P)
File → Print… (⌘P) prints the front window: a graph, chart, image, spreadsheet or data table, a Statistics window, the Protocols window, a Text Editor or the Data Log. It's dimmed when the front window has nothing to print. Graphs and charts print as vector graphics that fill the page, so lines and labels stay crisp. Tables print across as many pages as needed, with their header rows and columns on every page, and text never splits a line between pages. In the print dialog, Print header and footer adds the title, date and page numbers, and Fit to page width shrinks wide tables to fit. File → Page Setup… (⇧⌘P) sets the paper size, orientation and scale for the front window, which keeps them until it closes. The User Guide prints too: the page you're reading, or the whole guide with Print all sections in the print dialog. Help → Open User Guide in Browser shows the whole guide as one web page in your default browser, with a contents list linking to each section. To keep or share a copy, save it from the browser (in Safari, File → Save As… with Format set to Page Source). A graph's Spreadsheet prints every row, with row numbers and the Time column on each page. If that would take more than 2,000 pages, @Graph asks whether to print just the selection or the first 500 pages.
Copy as PDF
Copy as PDF (in the Export menu, or right-click the graph or chart) copies the current view to the clipboard as a vector PDF, ready to paste into Keynote, Pages, Word or any app that accepts PDF, with an image alongside for apps that paste only images. A graph is copied at the size of its graph area on screen, with a 2× PNG. A chart is copied as PDF, PNG and TIFF, at the size and resolution set in Settings → Export. In a Spreadsheet window, Copy as PDF and Send to Keynote… make a clean table of the sheet or the selected cells (bold headers, grid lines), not a screenshot.
Send to Keynote
Send to Keynote… places the current graph or chart on the current slide of the frontmost Keynote presentation as a vector image. If no presentation is open, a new one is created. If Keynote can't take the image, the PDF opens in Preview instead.
The first time you use Send to Keynote, macOS asks whether @Graph may control Keynote. Click OK; this is needed only once.
Export Data
- ABF (.abf): the Export ABF sheet asks for the sample format first. 32-bit (exact) saves every sample as it is, as ABF 2 (pCLAMP 10 and later), because pyABF can't open 32-bit ABF 1 files; 16-bit (smaller) is ABF 1.8 at half the size, with each channel rounded to 1/65,534 of its range, except that a 16-bit ABF recording keeps its own scaling and stays exact. The choice starts at the one that matches where the samples came from, and the sheet says why. ABF holds at most 16 channels, one sample rate, and the same number of sweeps on every channel; a graph outside that is refused with the reason, and a format that can hold it (NWB or HDF5) is suggested. 32-bit holds up to 4 GB of samples (pCLAMP's limit), keeps blank samples, and ends a sweep shorter than the others in blank samples (the Data Log says so). 16-bit needs one sweep length and no gaps: blank samples at the end of sweeps (SutterPatch leaves 16 on current and aux inputs) are dropped, every sweep is cut to the last recorded sample, and if another channel at the same rate loses a few real samples at its end to keep the lengths equal, the Data Log says so (a cut of more than 1% of a sweep is refused).
- AxoGraph (.axgx): AxoGraph X format with one time column and one column per sweep, in volts and amperes. A file opened from AxoGraph and exported with the same channels and sweeps keeps AxoGraph's display settings; a recording of several episodes otherwise gets trace and group headers and its episode count, so neo reads each episode as a segment. The first-sample time is kept, and the file reads back with exactly the same values and the recording's date, even for a single episode. Every sweep must share one sample rate; a table of measurements is written as Y columns against its X column.
- MATLAB (.mat): level 5 format; per channel a [samples × sweeps] matrix with its sample rate, units and (when they differ) sweep lengths, or one spike-times vector per unit for a raster. MATLAB and SciPy read it, and @Graph reads it back as it was. A variable over 2 GB is refused, with NWB or HDF5 suggested.
- HDF5 (.h5): one dataset per channel, [sweeps × samples], with channel_name, units and sample_rate attributes (and each sweep's length when they differ); a raster writes one dataset of spike times per unit under /units, with its name, recorded span and sweep start as attributes. h5py and MATLAB read it, and @Graph reads it back exactly. Names and units are UTF-8 text, so symbols such as µ read correctly in Python, MATLAB and HDFView. It is plain HDF5, not NWB.
- NWB (.nwb): a Neurodata Without Borders 2 file, which pynwb opens and its validator passes with no errors. The file carries the NWB schema it follows, so NWB tools and DANDI can check it on their own, and @Graph reopens its NWB exports exactly, sweep names included. The session starts at the recording's date and time, with its time zone, when the file has one (else at the time of export). Only this export writes NWB: a .@graph file, and the HDF5 export below, are plain HDF5 that NWB software won't open.
- NWB from a waveform window: one series per channel and sweep under /acquisition/, with the data in the graph's own unit, the NWB unit (volts or amperes) and conversion factor, its sample rate and its start time; each sweep keeps its own rate and length.
- NWB intracellular channels: a graph doesn't record the amplifier's mode, so the units guess it (the metadata sheet can change the guess): the first voltage or current channel sets it (voltage: current clamp; current: voltage clamp). Channels of that unit are the responses (CurrentClampSeries or VoltageClampSeries), each with its own electrode on the amplifier device. A channel of the other unit recorded alongside (Im beside Vm) is a response's stimulus, paired in order and kept in the file's stimulus section; any channel left over (a light monitor in mV, say) is a plain TimeSeries. When no command channel was recorded, an ABF protocol's command waveform is written as the stimulus. The intracellular recordings and simultaneous recordings tables list each sweep's electrode, stimulus and response.
- NWB extracellular channels (a voltage in µV, or in mV from an Intan, Open Ephys, Neuralynx, Blackrock, Plexon or TDT file) are ElectricalSeries: each sweep's channels of one sample rate share a series, one column per channel, so a recording with several sweeps or rates becomes a series per sweep and rate, each starting at its own time. Every extracellular channel is a row of the electrodes table, with its location and electrode group, and the group's device (the recording system). Channels marked LFP in the metadata sheet go into processing/ecephys/LFP instead. Other units are plain TimeSeries.
- NWB from a raster window (from Detect Spikes → Raster, the Spike Sorter or a spike-sorted file): the Units table, with each train's spike times in seconds from the session start (its sweep's start added), its name, and the span it was recorded over when known. A raster's spike-time resolution is set for you: the sampling interval of the recording its spikes were found in (Detect Spikes, the Spike Sorter), or the clock of a Plexon or Blackrock file.
- CSV (.csv): one column per visible sweep, in group order (prefixed with the group name when more than one group is visible), holding the data's own values (not junction-potential shifted) in full precision. Each value column's header includes its unit. A gap inside a sweep is an empty cell, as is the end of a sweep shorter than the others. Sweeps sharing one sample rate share a first Time (s) column, measured from the start of each sweep. Otherwise, and for X-Y data, each sweep has its own X column beside it. Data to Graph… reads this layout back in. Every CSV @Graph writes (graphs, charts, spreadsheets, image data, and Data Log or Text Editor text saved with a .csv name) opens correctly in Excel: a file with a symbol such as µ or ° starts with a UTF-8 byte-order mark, and a plain ASCII file has none.
ABF, AxoGraph, MATLAB, HDF5 and NWB keep channel names, units, sample rates and sweep structure, so the file reopens in @Graph and in tools that read that format. X-Y data (such as an I-V curve) can only be exported as CSV or AxoGraph, and HDF5 needs every sweep of a channel at one sample rate.
NWB Metadata
Export → NWB first opens a sheet for what the data can't say but NWB tools and the DANDI Archive ask for. Everything is optional; a small orange diamond marks what DANDI needs to accept the file. Export… writes what you entered, Skip exports without any of it, and Cancel stops.
- Subject: subject ID, species (pick a common lab species or type a Latin binomial such as Mus musculus, or an NCBI taxonomy link), sex (M, F, U for unknown, O for other), and the age as a number of days, weeks, months or years (exact, a range, or that age or older, counted from birth or conception) or a date of birth instead. Strain, genotype, description and weight (g, kg or mg) are optional. The age is written in ISO 8601 form (90 days: P90D; 90 to 120 days: P90D/P120D).
- Session: experimenters (Last, First; separate several with semicolons), institution, lab, experiment description, session ID, keywords (separated by commas) and related publications (DOIs, such as doi:10.1523/…).
- Channels: each channel's role, guessed from its unit and the recording system (Automatic) or set to current clamp, voltage clamp, stimulus, extracellular (wideband), extracellular (LFP) or other. Set it when the guess is wrong: a file holding only the command current is a stimulus, not a voltage-clamp recording, and LFP channels are never guessed. For a patch-clamp electrode: cell ID, location (for mouse, an Allen Mouse Brain Atlas name or acronym such as CA1 or VISp), slice, electrode description, seal and resistance. For an extracellular channel: location, electrode group (channels with the same group name share one; the first to give a group description or device sets it), device (the recording system unless you name one), position (x, y, z in µm) and filtering. Intan and Neuralynx files fill in the filtering from their headers, and an NWB file fills in what its electrodes table says.
- Spike Times (a raster): the resolution is filled in when @Graph knows the sampling rate; otherwise enter the rate the spikes were detected at.
- The sheet starts from what you entered for this graph last time (a saved .@graph keeps it) or what an NWB file it came from says, and fills blank experimenters, institution, lab, species and strain from your last export.
- The bottom of the sheet lists what DANDI will refuse and what the NWB Inspector's best practices note. With the DANDI fields and each electrode's cell ID filled in (and, for mouse, an Atlas location), the export passes pynwb's validator, the NWB Inspector with no critical issues or best-practice violations, and dandi validate once dandi organize has named the files. If you export with blanks, the Data Log says what DANDI will refuse.
Export Visible Sweeps
The Export Visible… button, in the bar above the plot, sends only the visible sweeps to a new window (Open in new window), a file (Save to file, as .@graph), or Both. It is unavailable while View → Plot Sweeps at Recording Time is on. The panels stay as they are (each group keeps its name, style, Y range and axis title, whatever the grouping), and so do the graph's look, labels, overlays and junction-potential setting. Each sweep keeps its own sample rate and length, and X-Y data such as I-V curves keep their X values. A spike-train raster exports its visible trains.
When the X axis is zoomed, 'Only the X range on screen' (on by default) cuts each sweep to that range; times keep reading as they do now. With sweeps at different sample rates, the cut starts at a time every rate shares (for example, a whole millisecond for 20 kHz and 1 kHz), so every sample keeps its exact time. Turn it off to export whole sweeps.
To export a single group as its own file, hide all other groups in the Groups panel, then use Export Visible… → Save to file.
Chart Windows
Chart windows use the same Save (⌘S) and Save As (⇧⌘S) as graph windows, and the .@graph file reopens with all series and formatting. Saved graphs and charts (.@graph) open in the background, as recordings do: a large one shows a progress indicator while it loads, and @Graph stays responsive. File → Export… (⇧⌘E) opens Export Chart, with the same image formats as for graphs (PNG, JPEG, TIFF, GIF, PDF, SVG), and reproduces all chart settings.
- Size: set it in points, inches, centimeters or millimeters. Journal width sets a journal's column width (Nature, Cell, Science, PNAS, eLife / PLOS) and keeps the chart's proportions. Text keeps its point size, so check that labels still fit.
- Resolution (images): 72, 144, 150, 300, 600 or 1,200 dpi; the panel shows the output in pixels.
- PDF and SVG files are laid out like the chart window, title included, and SVG text stays editable. Heatmaps of more than 250,000 cells (or 2,000 rows or columns) export their cells as an embedded image, with labels, dendrograms and legend still vector.
- CSV (.csv) / TSV (.tsv): every chart type (bar/dot/pie/line series, volcano plots, heatmaps) can also be saved as delimited text from the Export menu. Headers match the on-screen spreadsheet view.
- Large heatmap matrices (tens of millions of cells) export without running out of memory.
CSV/TSV is the most portable way to take chart or genomics data (differential-expression tables, expression matrices) into R, Python/pandas, Excel or other tools.
Lab Tools
The Lab Tools menu opens a single window with seven calculators on tabs. Values you enter are kept when you switch tabs. A result shows a dash (—) until every value it needs is a valid number. In fields that show a unit, a value can be typed with a unit and is converted to the field's (50 mg in a g field, 100 mM or 100 mmol/L in an M field, 5 ml or 500 µl in an mL field); a unit of another kind, or one on a plain number such as NA, shows the dash. α and power take 0.05 or 5%.
Molarity Calculator
Choose what to solve for (mass, molecular weight, volume or concentration) and enter the other three. A list of common compounds (NaCl, KCl, CaCl₂ and MgCl₂ anhydrous and as their usual hydrates, HEPES, EGTA, Na₂ATP, Na₂GTP and others) fills in the molecular weight of the form you weigh.
Dilution Calculator
Solves C₁V₁ = C₂V₂ for whichever value you choose (for example, the stock volume needed for a given final concentration and volume). A result that would make the final concentration higher than the stock is flagged, since that usually means swapped values or mismatched units. The Serial Dilution section lists the concentration at each step for a chosen starting concentration, dilution factor and number of steps (a whole number; the table shows up to 100 steps and says so when it stops there). Enter plain numbers, with both concentrations in the same unit and both volumes in the same unit; the result uses that unit.
Nernst Equation
Calculates an ion's reversal potential (Erev) from its inside and outside concentrations and the temperature. Presets for K⁺, Na⁺, Ca²⁺, Cl⁻ and H⁺ fill in the valence and typical mammalian-neuron concentrations. The valence must be a nonzero whole number (+1, −1, +2). R and F are the CODATA 2018 values. The result updates as you type.
Henderson–Hasselbalch
Calculates buffer pH from the pKa and the base and acid concentrations, or the base-to-acid ratio needed for a target pH. A table of common buffers (HEPES, PIPES, MES, MOPS, Tris, phosphate, bicarbonate and others) has a Use button that fills in the pKa. Its values are for 25 °C: pKa falls as the temperature rises (Tris by about 0.028 per °C, so a Tris buffer made to pH 7.4 at 25 °C is near pH 7.1 at 37 °C) and shifts with ionic strength, so check it for your conditions. A very small or large ratio is shown in scientific notation (8.71e-04).
Ohm's Law
Relates voltage (V), current (I), resistance (R) and power (P) through V = IR and P = VI. Choose what to solve for and enter the two values it needs (for power, any two of V, I and R); power is always shown too, in the unit chosen beside it. The solved quantity's unit menu sets the unit its result is shown in. Units default to millivolts, picoamperes and megaohms; current goes down to femtoamperes.
Microscopy Resolution
Calculates theoretical optical limits and recommended imaging parameters for a given objective, camera and wavelength (550 nm to start). Enter the NA and refractive index (n) under Illumination, and the camera's pixel size, sensor pixels, objective magnification, coupler/relay and binning under Camera & Magnification.
- Abbe resolution limit (d = λ / 2NA, for incoherent light or a condenser matching the objective's NA) and Rayleigh criterion (d = 0.61λ / NA).
- Nyquist pixel size (λ / 4NA): the largest pixel at the sample that samples the finest detail a widefield (incoherent) image carries, its cutoff 2NA/λ, at twice its frequency, as SVI's Nyquist calculator gives it. Half the Rayleigh limit (0.305λ/NA), a common rule of thumb, is about 22% larger and undersamples. A confocal image carries finer detail and needs smaller pixels still.
- An NA above the refractive index is flagged: it can't be reached in that medium. The refractive index has a Preset menu (Air, Water, Glycerol, Immersion oil).
- A Sampling status line says whether the pixel size at the sample meets Nyquist, with the ratio, and Min magnification for Nyquist gives the total magnification needed. The effective pixel size and total magnification are shown too.
- Depth of field (DoF = λ·n / NA² + n / (M·NA) · e, where M is the total magnification and e the image pixel on the sensor: the camera's pixel size times the binning).
- Field of view from the camera's pixel size and pixel count and the total magnification (objective × coupler, with a coupler Preset menu from 0.35× to 2.0×).
- Binning (1 × 1, 2 × 2, 3 × 3, 4 × 4 or 8 × 8): with n × n on-chip binning each image pixel is n camera pixels wide, so the pixel size at the sample, the sampling status and the objective recommendations all use n × the camera pixel; the sensor line gives the binned image size.
- Wavelength (300–1300 nm): drag the spectrum slider, step it with the arrows, or type a value, which applies as you type (in nm, or with a unit such as 0.488 µm). The slider spans visible light (380–700 nm); an ultraviolet or near-infrared wavelength, such as IR-DIC or a NIR dye, can be typed. The formulas are for one-photon imaging, so they don't give two-photon resolution.
- An Objective menu (air, water and oil objectives) that sets magnification, NA and refractive index.
- A Camera menu of common sCMOS, CMOS and EMCCD cameras that fills in pixel size and sensor dimensions. The Andor Sona comes in two models, the 4.2B-6 (6.5 µm pixels) and the 4.2B-11 (11 µm).
- The tab opens with the camera and objective chosen in Settings → Imaging, once per session; after that it keeps what you enter.
The Objective Recommendations box at the bottom of the Microscopy tab lists the objectives that meet Nyquist sampling with the current camera and wavelength, with each one's pixel size at the sample and field of view. Objectives that undersample are listed below them.
Power Analysis
Estimates the sample size needed for a target power, the power of a given sample size, or the smallest effect a given sample size detects, for an independent (two-sample), paired or one-sample design. Enter the effect size directly, or turn on Compute from group means. What the effect size divides by depends on the design:
- Independent: Cohen's d, the mean difference over the common SD (or two means and a common SD).
- Paired: the same Question as the Statistics module, Magnitude (the default) or Consistency; the ⓘ beside it explains both. Magnitude takes Cohen's dav, the mean difference over the average of the two conditions' SDs (or two condition means and that average SD), and the expected correlation r between the conditions (default 0.5, between −1 and 1; take it from pilot data or earlier studies). It is converted to dz = dav / √(2(1 − r)), taking the two SDs as about equal, and the dz used is shown with the result. At r = 0.5 dav and dz are equal. Consistency takes Cohen's dz, the mean difference over the SD of the differences, as R's pwr (type = "paired") and G*Power take it (or two condition means and the SD of the differences).
- One-sample: Cohen's d, (mean − μ₀) / SD (or the sample mean, μ₀ and the SD).
- Solve for Sample Size: enter the effect size, significance level (α) and target power to get N per group (independent), N pairs (paired) or N (one-sample).
- Solve for Power: enter the effect size, α and a sample size to see the power it achieves. Power of 99.95% or more shows as > 99.9%.
- Solve for Detectable Effect Size: enter α, the target power and a sample size to get the smallest effect the test detects with that power: Cohen's d, or for a paired design dz (Consistency) or dav with the dz it comes from (Magnitude, using r). The target power must be above α.
- Exact for the two-sided t-test: power from the noncentral t distribution, as G*Power, R's pwr and statsmodels compute it; N is the smallest whole number that reaches the target power. α must be between 0 and 1 (type 0.05 or 5%, not 5).
- For a very small effect the required N can exceed 1,000,000, and is shown as such.
Cohen's conventions: d ≈ 0.2 is a small effect, 0.5 medium, 0.8 large. They are for d and dav, not dz: the SD of the differences shrinks as the two conditions correlate, so dz equals dav at r = 0.5, is larger above it and smaller below it. Enter an independent-groups or average-SD effect under Magnitude with the expected r, and dz from paired pilot data under Consistency; entering an independent-groups d as dz misstates the N needed.
References
Cohen J (1988). Statistical Power Analysis for the Behavioral Sciences, 2nd edition. Hillsdale, NJ: Lawrence Erlbaum Associates.
Keyboard Shortcuts
The Keyboard Shortcuts menu in the menu bar lists the zoom, inspector-navigation, grouping and signal-processing commands below, plus Focus Review Sweeps Field, so you can also click them. Its last item, See All Keyboard Shortcuts, opens this page. A few keys do something different when a text editor or the Data Log has the focus; those are noted in the Text Tools table.
File
⌘O Open File…
⌘N New Data Importer window: a drop-zone for any data or image file, grouped by kind
⇧⌘N New Text Editor window
⌥⌘N New Spreadsheet window
⇧⌘G Graph Selected Text: graph highlighted numbers from the Data Log or any text editor
⇧⌘H Chart Selection: chart highlighted table from the Data Log or any text editor
⌥⌘L Volcano Plot from Selected Text (File → Omics Plot): build a volcano plot from highlighted data (replicates, or computed fold changes and p-values)
⌥⌘M Heatmap from Selected Text (File → Omics Plot): build a heatmap from a highlighted table
⇧⌘V Smart Visualization (Text Editor and Data Log): opens the selected text as whichever kind of Graph or Chart suits it
⌘S Save: a .@graph document for Graph, Chart, Spreadsheet and Image windows; plain text for Text Editor and Data Log windows
⇧⌘S Save As… (works in all window types)
⇧⌘K Duplicate: open a copy of the window with the same data (Graph, Chart, Spreadsheet, Text Editor and Image windows; the Data Log's copy opens in a Text Editor)
⇧⌘E Export…: Graph, Chart and Image windows as an image; Spreadsheet windows as CSV, TSV or Excel
⌘P Print the front window
⇧⌘P Page Setup… for the front window
⌘W Close window (asks to save unsaved changes)
⇧⌘W Close Window: the front window with all its tabs (⌘W closes one tab)
⌥⌘W Close All: close every window
⌘Q Quit. If anything is unsaved, choose Discard Changes and Quit, Cancel, or Review Changes… (the default), which brings up each unsaved window in turn with Save / Don't Save / Cancel
View & Navigation
⌘L Show the Data Log, or hide it when it's in front
⌘I Show / hide the inspector panel (Graph windows)
⌘K Show / hide analysis cursors A and B (Graph windows)
⇧⌘U Show this user guide, or hide it when it's in front
⌘F (in this guide) Jump to the guide's Search field
⌘@ Show the Welcome window, or hide it when it's in front
⌘, Settings
⌥⌘I Open AI Assistant (after turning it on in Settings → AI Assistant)
Tab / ⇧Tab Step forward / back one sweep
Space / ⇧Space Add the next sweep to those shown / remove the last one added
, Jump to first sweep
. Jump to last sweep
← → (hold) Pan the X axis when it is zoomed in (not while typing in a text field)
↑ ↓ (hold) Pan the Y axis when it is zoomed in (not while typing in a text field)
Delete Remove the legend entry you double-clicked (the sweep stays on the graph)
Drag on plot Rubber-band zoom into a rectangle
Drag on Y axis 1D Y-axis zoom for this group only
Drag on X axis 1D X-axis zoom (all groups, Y unchanged)
Dbl-click axis Type exact axis limits in a popover (accepts units, such as 752 ms or -80 mV; a lone comma or period follows your Mac's number format, so 1,000 is one thousand in English and 1,5 is one and a half in German)
Dbl-click plot Step back one zoom; with none left, fit the data
Dbl-click title bar Rename the window: edit the title in place, then press Return to confirm or Escape to cancel
⌥⇧-click on plot Log the selected sweep's value at that X position ('x = … y = …', in the axes' units, Y junction-potential corrected) to the Data Log; on X-Y data, the point nearest the click. With no sweep selected, it logs the pointer's position. Needs 'Log routine file and window activity' on in Settings → General. Not available on a spike-train raster.
Double-click-to-rename works in Graph, Chart, Image, Spreadsheet, Text Editor and Statistics windows, including those opened from a chart. A Text Editor with a file renames the file too.
If you rename or move a saved file in the Finder while it is open in @Graph (Graph, Chart, Image, Spreadsheet or Text Editor window), the window's title and save location follow it automatically.
Zoom
⌘= or ⌘+ Zoom In X: narrow the time window
⌘− Zoom Out X: widen the time window
⌘→ / ⌘← Zoom in / out on the X axis, as ⌘= and ⌘− (not while typing in a text field)
⌘↑ / ⌘↓ Zoom In Y / Zoom Out Y: narrow or widen the amplitude window (not while typing in a text field)
⌘0 Reset Zoom: fit X and Y to the data
⌘= / ⌘− / ⌘0 (text) In the Data Log or a Text Editor: larger text, smaller text, back to the default size (the Data Log's is set in Settings → General)
⌘= / ⌘− / ⌘0 (sheet) In a Spreadsheet window: zoom in, zoom out, back to 100%
Inspector Navigation
⇧⌘F Open inspector → Filter/Smoothing
⇧⌘B Open inspector → Baseline and focus its Start field (switching to Mean subtraction if the chosen method has no region)
⇧⌘X Open inspector → Data Transform (scale/offset axes, Set X = 0)
⇧⌘M Open inspector → Measure
⇧⌘D Open inspector → Peaks (Peak Detection)
⇧⌘J Open inspector → AP Detection
⇧⌘I Open inspector → Rₛ Correction (series resistance)
↩ in text field Run the panel's main action (Apply Filter, Measure, Fit, Detect APs and so on)
⌥⌘R Focus the "Review sweeps:" field, then type a range (such as 1-4, 7-10, 11) and press Return
Grouping
⌥⌘G Single Group: combine all sweeps into one group
⌥⌘S Separate All Sweeps: put each sweep into its own group
Signal Processing (front window)
⇧⌘A Average Visible Sweeps → new window
⇧⌘R Normalize: opens the inspector's Normalize panel
⌥⌘K Align Sweeps at Peak → new window
⌥⌘P Power Spectral Density / FFT → new window
Graph Utilities
⌃⌘H Convert to Histogram…
⌥⌘C Copy Style: copy the look of the front Graph, Chart or Image window
⌥⌘V Paste Style: apply the copied look to the front window of the same type
Image Windows
⌘S Save the image session as a self-contained .@graph file (pixel data, ROIs, LUT, display range and analysis settings); it opens without the original TIFFs
⇧⌘S Save As… (choose a new name or location)
⇧⌘K Duplicate: open a second view of the same image with all ROIs and settings
Space Play / pause a time series; with one time point, step to the next ROI-trace sweep
⌘= / ⌘− / ⌘0 Zoom the image in, out, or back to fit (the ⌘-arrow keys zoom too)
Arrow keys Pan the zoomed image
Delete Remove the selected ROI
⌥-drag an ROI Drag a copy of the ROI
Tab / ⇧Tab, comma / period Step through the ROI-trace sweeps, or jump to the first or last
Escape Cancel a polygon or freehand ROI in progress
Spreadsheets
⌘S Save spreadsheet as .@graph
⇧⌘S Save As… (choose name / location)
⌘Z / ⇧⌘Z Undo / Redo edits in any spreadsheet
⌘C Copy selected rectangle (or all data)
⌘A Select all
⌘V Paste at selected anchor: auto-expands grid
⌘D / ⌘R Fill Down / Fill Right: copy the selection's first row or column into the rest (New Spreadsheet and Chart Spreadsheet)
Type Start typing to replace the selected cell's value; double-click a cell to edit it
⌥↩ (Option-Return) Start a new line inside a cell or column title while editing
Delete Clear the selected cells
Tab, ↩, arrow keys Move the selection
Shift-click Extend cell selection to a rectangle
Header click Select whole column; Shift-click adds column
Row # click Select whole row; Shift-click extends to row range
⌘-click Add a cell or row number to the selection, or remove it
Drag Select a rectangle of cells
Text Tools (Text Editor & Data Log)
⌘T Statistics… (open Statistics window with selected text)
⇧⌘T List Stats: compute mean/SD/SEM/n for each column inline
⇧⌘L Convert Lists / Table
⇧⌘X (with a selection), or ⌃⇧X Transpose Table: swap the rows and columns of the selected tab-delimited table. ⇧⌘X needs a selection (without one it opens Data Transform as usual); ⌃⇧X always works.
⇧⌘R Reverse List Order (in a graph window, ⇧⌘R opens Normalize instead)
⌘V / ⌥⇧⌘V Paste as plain text / Paste with Formatting
= (inline) Inline math: type an expression ending in = (such as '37*81*5^6=') and the result appears in blue (whole numbers below 10^15 in full, others to 13 significant digits). Supports + − × · ÷ * / ^ %, parentheses, functions such as sqrt() and ln(), and pi, e and tau. A lone number or a date gets no result. Keypad Enter evaluates the whole line.
Statistics Window
↩ Determine Effect: run the analysis with the current settings
Editing
⌘Z Undo (filter, smoothing, baseline, scale/offset, fits, Set X = 0, Rₛ and junction-potential correction, style changes, the graph title, units and grouping, ROIs, overlays, an image's display, rotation and measuring settings, spreadsheet edits). To step back a zoom, double-click the plot.
⇧⌘Z Redo
⌘F Find… (Edit → Find) in the front window: the Data Log and Text Editors show a find bar; in the User Guide, ⌘F goes to its search field
⌥⌘F Find and Replace…
⌘G Find Next
⌘E Use Selection for Find. Find Previous is in the Edit → Find menu, without a shortcut (⇧⌘G is Graph Selected Text)
Dbl-click label Edit axis label text directly on the plot
Settings (⌘,)
Open Settings from the @Graph menu (⌘,) to set app-wide defaults. The window has seven tabs: General, Appearance, Neurophysiology, Imaging, Export, Statistics and AI Assistant. Most settings apply to new windows, and the exceptions are noted.
General
- Restore last session on launch (off by default): reopens each window that was open with a file when you quit: a graph from its .@graph file or its recording, and charts, images, spreadsheets and text files from theirs. Windows never saved to a file (results, new charts) aren't reopened.
- Show start-up window at launch (on by default): shows the Welcome window at every launch. This is the same setting as the 'Show this window at launch' checkbox in the Welcome window.
- Show sample data buttons (on by default): shows or hides the Welcome window's Sample Graph, Sample Chart and Sample T-Series buttons.
Data Log
- Default font size (13 pt; 9–24 pt): the Data Log's text size. With the Data Log in front, ⌘= and ⌘− change it for the session, and ⌘0 returns to this value.
- Timestamp each log entry (off by default): prefixes every Data Log entry with the time (HH:MM:SS).
- Include filename header on file open (on by default): adds a line with the file name and recording details to the Data Log when a file opens. This is independent of routine logging.
- Log routine file and window activity (on by default): when off, routine Data Log entries (files opened, saved or exported, styles copied or pasted, cursor readings) are left out. Analysis results, errors and warnings are always logged.
File Handling
- Opening Files: 'Open as tabs (same window)' (the default: new files join the front window as tabs) or 'Open as separate windows'.
- Daughter Files: 'Open as tabs (in the parent window)' (the default) or 'Open as separate windows', for result windows made from an existing Graph or Chart window, such as a Venn Diagram from a Volcano Plot, or a Spectrogram, Cross-Correlation, Histogram or Slow AHP Analysis result.
Appearance: App
- App appearance: Dark (default), Light or System Default, for menus, panels and windows. Takes effect immediately, and the View menu's Dark Mode, Light Mode and System Default items set it too. The graph background is set separately (Appearance → Graphs).
- Show a line under the front tab (on by default): a thin line in your accent color under the front tab of a window with tabs, also when the window is in the background, where the front tab otherwise looks much like the others.
Appearance: Font
Settings → Appearance → Font sets the default font. New graphs and charts use it for titles, axis labels, tick labels, legends, scale bars and pie labels, and titles stay bold. Text you add to a chart or graph starts in its tick label font. Graphs and charts you already have keep their fonts; change those in the inspector.
Appearance: Numbers
Settings → Appearance → Numbers sets how graphs and charts write their numbers. Match System Region (the default) uses the decimal and thousands separators of your region in System Settings → General → Language & Region, so a German Mac shows 1,5. Always 1,234.5 keeps the point and comma whatever the region. It applies to tick labels, scale bars, legends and statistics labels in open and new windows, on screen and in exported figures. Negative numbers always use a true minus sign (−). Spreadsheets, the Data Log and exported data keep plain numbers.
Appearance: Graphs
These defaults apply to new graph windows. Open windows are unchanged unless noted.
- Dark background: new graph windows open with a black (on) or white (off) background. Changing it also updates open graph windows.
- Sweep color palette (Rainbow by default): the colors overlaid sweeps take while a graph's 'Use … spectrum for overlaid sweeps' option (Plot Style) is on: Rainbow (red through the spectrum to purple), Warm (red → orange), Cool (cyan → blue), Monochrome (white → gray) or Viridis (purple → blue → green → yellow). Open graphs change at once.
- Default sweep line width (1 pt) and Default axis line width (2.5 pt), each 0.5–5 pt.
- Default sweep line color / Default sweep symbol color: the colors a new sweep starts with when the spectrum option is off. While it is on, the palette above decides. Reset returns to the built-in color.
- Default sweep symbol (None by default): the marker shape new sweeps start with, from the same list as the Plot Style panel.
Appearance: Charts
- Default chart axis line width (1.5 pt; 0.5–5 pt): axis line thickness for new charts.
- Default bar/chart color and Default data point color: the bar (mean) color and data-point color of the first series in a new chart, however it is created (including by the AI Assistant, unless you ask it for a specific color). Further series use @Graph's built-in palette so they stay distinct. Reset returns to the built-in color (blue), and the data points then match the bars.
- Default data point symbol (Circle by default): the marker shape for a new chart's data points. To change it on one chart, see Data Point Symbol under Charts.
Default effect-size brackets and error bar type for new charts are in Settings → Statistics → New Chart Defaults (below).
Neurophysiology
- Enable JP correction by default (off by default): new graph windows open with junction potential correction on, and the JP Correction button in the status bar highlighted.
- Default JP value (12 mV; −100 to 100 mV): the junction potential new windows start with, whether or not correction starts on. It's subtracted only from channels that look like a membrane potential. Typical patch-clamp values are 5–15 mV, and a liquid junction potential calculator (such as JPCalc) gives the value for your solutions.
- Default dV/dt threshold (20 mV/ms, the Allen Institute IPFX's cutoff): the rate-of-rise threshold the AP Detection panel, Batch Processing and Protocol steps start with. Typical values are 10–50 mV/ms, and you can change it per experiment in the panel.
- Default threshold method: the method AP Detection opens with, and the one new Batch Processing and Protocols steps start with.
- Input Resistance (VI and IV Plots): fit the line through the origin, allow for noise with 5 or 6 steps (VI Plot only), and flag outlier sweeps with a robust fit. All off by default; see VI Plot under E-Phys Tools.
Imaging
- Default Hardware: the camera and objective the Microscopy Calculator opens with. Choosing others in the Calculator leaves these defaults as they are.
- Color Cameras: how a color camera's exposure (ND2, CZI) opens. One channel (the default): its red, green and blue added together, shown in the color that holds its signal, or in gray when none does (DIC, brightfield). Red, green and blue channels: its three colors separately, for a stained brightfield image whose colors are the data. Applies to files opened afterward.
Export
- Default format (PNG by default): PNG, JPEG, TIFF, GIF, PDF or SVG, the format selected when the Export panel opens (⇧⌘E). PDF and SVG are vector formats; the others are raster.
- Resolution (raster formats): 72, 96, 144, 192, 288, 300 or 600 dpi. 144 dpi (2×, the default) suits screen and web, 300 dpi photographs and color figures in print, and 600 dpi line art. Vector formats are resolution-independent.
- Default canvas size (1200 × 800): the width × height the Export panel starts with, in points (1/72 inch, so pixels at 72 dpi), from 1 to 20,000. Copying a chart uses this size and resolution too.
- Transparent background (off by default): PNG, TIFF and GIF exports of graphs and charts get a see-through background instead of the background color, handy for placing figures on slides. JPEG can't be transparent.
- In the Export panel itself, 'Match window' sets the canvas to the on-screen graph's size and proportions, and the Resolution menu (72 to 1,200 dpi) sharpens an image without changing the proportions.
For publication figures, export PDF or SVG (vector, sharp at any size), or PNG or TIFF at 300 dpi (600 for line art). Use 'Match window' to keep the on-screen proportions; a chart's Journal width menu sets a journal's column width.
Statistics
These settings change how statistical results are computed or reported, so they're kept together in their own tab, where they're easy to find and check.
- Default confidence level: 90%, 95% (default) or 99%. Applies to every confidence interval @Graph reports, closed-form and bootstrap: descriptive statistics, the estimate and effect size of every Compare choice, post-hoc comparisons (Tukey, Games-Howell, Dunnett, Dunnett's T3, Šidák, Bonferroni, Holm), Multiple Regression coefficients, correlation (Pearson, Spearman, Kendall), McNemar/Fisher exact/relative-risk tables, every interval on an Estimation Plot and Kaplan-Meier hazard-ratio CIs. With 3 or more groups, pairwise CIs are simultaneous at 1 − α/m. The variance-explained effect sizes (η², partial η², ω², Cohen's f and R²) get a 1 − 2α interval, 90% at the default 95% (Steiger 2004), so each excludes zero exactly when its F test is significant. It also sets the level of a chart's CI error bars and the new-chart default below. The AP phase plot's band is the one exception and stays at 95%. Table headers and notes (such as "95% CI") show the active level.
- Bootstrap CI method: BCa (bias-corrected and accelerated, the default and recommended) or Percentile (choose it only to reproduce results made with it). It applies to every confidence interval that is bootstrapped because no formula fits: AKP (Algina–Keselman–Penfield) robust d (Trimmed means), dav/gav for paired means, the Estimation Plot's intervals for means and dominance δ (its medians and trimmed means use the smoothed bootstrap's percentile interval), Kendall's W for Cochran's Q, Cramér's V, Cohen's w, and Spearman/Kendall correlation. Test-based intervals (t, noncentral t and F, Yuen, the rank-inversion Hodges-Lehmann CI, Clopper-Pearson) are never bootstrapped. The setting applies the next time an analysis runs, and labels show '(BCa bootstrap)' or '(Percentile bootstrap)'. See 'Which bootstrap?' under Statistics → Confidence Intervals.
- Warn on small-sample bootstrap CIs (on by default; 'Warn below n =' 5, from 3 to 20): adds a note to a Statistics window result table when one of those bootstrap CIs is built from fewer values per group or pair than the threshold. The default is below the 6–12 per group typical of routine work, so it rarely appears. The note is a reminder that the interval is imprecise, not a sign that it is wrong.
- Always show effect sizes as positive (off by default): effect sizes are normally signed (negative when the first group is lower). When on, a result-table row with a negative estimate is restated the other way round: the group names are swapped and the estimate, its CI, the test statistic and the effect size are all given for the reversed order, never just the sign of the effect size flipped. A chart bracket, which has no direction, shows its effect size and CI for the order that makes them positive; Estimation Plot labels stay signed as plotted (later minus earlier group). It also applies to Cohen's g and ln(odds ratio) on proportions charts. η², ω², Cramér's V and Kendall's W are never changed.
New Chart Defaults
These only set what a new chart starts with, and you can change them on any chart.
- Effect-size brackets: Show effect size, Show p-value and Show test name (all on by default), and Effect size position (Above by default) and p-value position (Below by default) relative to the bracket line. These match the Display and Position controls under Brackets in a chart's Statistics tab.
- Default error bar type (SD by default): None, SD, SEM, or a confidence interval at the Default confidence level above, for every series of a new chart. Change an existing chart's error bars in its Plot Style panel.
AI Assistant
- Enable AI Assistant (off by default): turns on the AI Assistant window and menu (⌥⌘I). You're still asked for consent the first time you send data to each AI provider.
- Default Backend: the Backend the AI Assistant starts with, and its Model when it offers more than one. Changing it doesn't change a conversation already open. Until you choose one, it's Apple Private Cloud Compute, which is free, on a Mac that can use it (macOS 27 or later with Apple Intelligence), and Claude otherwise.
- API Keys: shows which backends have a saved key, with a Clear button for each. You enter a key in the AI Assistant window the first time you use that backend. Keys are kept in the macOS Keychain and sent only to that backend's own service.
- Attach window screenshots automatically (off by default): when the AI Assistant works with a window, it also receives a picture of that window, not just the numbers.
- Reset Remembered Data-Sharing Consent…: the next request to each backend asks for consent again.