Published November 5, 2026 | Version v1

SIMION-Based Modeling of Picosecond Ion Pulses from a Nanotip Using Laser-Stimulated Desorption - Dataset

Description

Dataset Description

This data repository provides the underlying data and plotting routines associated with the manuscript titled "SIMION-Based Modeling of Picosecond Ion Pulses from a Nanotip Using Laser-Stimulated Desorption" by Redl et al., published in Physical Review Applied (2026). DOI: https://doi.org/10.1103/gfl6-fh1k

In the manuscript, we present a SIMION-based simulation of desorbed H+ ion emission and transport from tungsten nanotips. The simulation combines nanoscale electrostatic fields at the apex with macroscopic ion optics. Using deliberately broad initial energy and angular distributions, we show that picosecond ion pulses emerge predominantly from trajectory selection rather than from intrinsic desorption dynamics. The simulated ion pulses agree quantitatively with experimentally measured time-of-flight spectra. A correlation between detector impact position and ion flight time is identified, which enables substantial pulse narrowing through spatial filtering. The results demonstrate that ion transport is the dominant limitation to temporal resolution in current nanotip-based LSD ion sources.

All data files are released under the Creative Commons Attribution 4.0 International (CC-BY) license, while all code files are distributed under the MIT license.

Note on SIMION potential array files: The refined SIMION potential arrays (.PA0-.PA6, about 46 GB per tip displacement and 740 GB in total) are not part of this dataset. They can only be read with SIMION or its PA.py module, which is licensed under the SIMION terms and therefore cannot be published here, and they can be fully regenerated from the SIMION input files in simulation (including the unrefined coarse arrays LSD_.PA#). AnalysisPA.py contains a dummy PA class instead of PA.py. All data and plots can still be reproduced without SIMION, because the electrode geometries and potentials needed for the figures are provided as pre-extracted numpy arrays (.npy, see below). If you own a SIMION license, regenerate the potential arrays and replace the dummy PA class to re-extract the arrays.

Files

The dataset is split into several zip files, so that the parts can be downloaded separately. Extract all of them into the same folder to obtain the layout described below. All paths inside the zip files are relative to this folder.
  • code_and_figures.zip - all scripts, this readme, requirements.txt, plots, exp, blender and np_tmp. This is enough to reproduce Figs. 3, 5 and 6
  • PAs.zip - extracted potential arrays, needed for Figs. 1 and 2
  • LSD_initial_start_stop.zip - ion starting positions, needed for Fig. 2(a)
  • LSD_0x_PAs.zip - trajectories of the reference configuration (no tip displacement), needed for Figs. 2(b) and 4
  • LSD_<d>x_PAs.zip, LSD_<d>z_PAs.zip - trajectories for all other tip displacements, only needed to regenerate the files in np_tmp (Figs. 3, 5 and 6)
  • LSD_0x_PAs_supplementary.zip - drift tube voltage and grid size variations (Sec. IV)
  • simulation.zip - SIMION input files to regenerate the simulations

Dataset Layout

  • Analysis.py - parsing of simulation and experimental data files, filtering, fitting and FWHM estimation
  • Analysis3D.py - triangulation and area calculation of ion starting positions (effective emission area)
  • AnalysisPA.py - reading and plotting of potential arrays (electrode geometry and potentials), with a dummy PA class (see note above)
  • Paper.py - helper functions for pretty plotting (figure size, labels, saving, laser packet drawing)
  • PlotStyles.py - loads the matplotlib style sheet
  • paper.mplstyle - matplotlib style sheet used for all figures
  • plot_setup.py - plotting script for Fig. 1 (simulation geometry and potentials)
  • plot_start_distribution.py - plotting script for Fig. 2 (ion starting position distribution)
  • plot_offset_areas.py - plotting script for Fig. 3 (effective emission area vs. tip displacement)
  • plot_tof_distribution.py - plotting script for Fig. 4 (MCP impact positions and TOF spectra)
  • plot_offset_fwhm.py - plotting script for Fig. 5 (TOF spectra for tip displacements, R = 15 nm)
  • plot_experiment_simulation.py - plotting script for Fig. 6 (simulation for R = 150 nm vs. experiment)
  • LSD - folder with SIMION ion trajectory simulation output
    • <d>x_PAs - simulations with the tip displaced by d mm laterally (x and y direction, the sign is encoded in the file name, see below)
    • <d>z_PAs - simulations with the tip displaced by d mm along the axial (z) direction (signed)
      • mass_single_fine_0-10eV_<R>nm - H+ ions (1 amu, single charge), initial kinetic energy uniformly sampled from 0-10 eV (restricted to 0-4.3 eV in the plotting scripts), tip apex radius R
      • mass_single_fine_0-10eV_<R>nm_zoom - same as above with the starting positions restricted to the apex region
      • 0x_PAs/mass_single_fine_0-10eV_15nm_DT - reference configuration with varied drift tube potentials DTe and DTf (-50 to -2050 V, see file names), basis of the drift tube discussion in Sec. IV (no plotting script)
      • 0x_PAs/mass_single_fine_0-10eV_15nm_grid - reference configuration with ultrafine voxel sizes of 0.5, 1 and 2 nm (suffix of the file name), basis of the grid convergence statement in Sec. IV (no plotting script)
    • initial_start_stop_<R>nm, initial_start_stop_<R>nm_zoom - ion starting positions on the nanotip surface (full illuminated surface / apex region)
  • PAs - folder with the numpy arrays extracted from the SIMION potential arrays, used for plotting
    • LSD_.PA0_* - macroscopic geometry (tip holder, drift tubes, MCP), coarse grid with 0.05 mm voxels
    • fine_nanotip_15nm.pa0_* - fine grid around the nanotip, 1 µm voxels
    • ultrafine_nanotip_15nm.pa0_* - ultrafine grid at the nanotip apex, 1 nm voxels
  • simulation - SIMION input files to regenerate all potential arrays and ion trajectories (requires SIMION 8.1)
    • Setup.lua - main workbench program: builds and refines the fine and ultrafine nanotip arrays, generates the ion starting positions from the laser profile, flies the ions and writes the output files in LSD. All simulation parameters (potentials, tip radius, energy range, laser direction, ...) are adjustable variables at the top of the file
    • ion.lua, ion_nanotip.lua - particle definitions used by Setup.lua
    • fine_nanotip.gem - SIMION geometry file of the nanotip (parameterized by tip radius, half angle, length and grid density)
    • ultrafine_nanotip.zo - SIMION view settings of the ultrafine array
    • STL - CAD geometry of the macroscopic setup used to create the coarse array (see STL/desc_parts.txt), LSD_3(<d>).stl contains the tip holder for each tip displacement
    • <d>x_PAs, <d>z_PAs - one SIMION workbench folder per tip displacement, containing Setup.iob (workbench), a copy of Setup.lua (SIMION requires it next to the .iob) and LSD_.PA# (unrefined coarse potential array created from the STL files, see below)
    • input_start_positions_<R>nm, input_start_positions_<R>nm_zoom - fixed ion starting positions in [mm] (comma separated x, y, z per line) as used for the published runs (use_start_positions = 1 in Setup.lua)
  • exp - folder with the experimental TOF spectrum shown in Fig. 6(b)
  • np_tmp - folder with intermediate numpy files (see below). Figs. 3, 5 and 6 are generated from these files, so the scripts do not need to re-read the full simulation output in LSD
  • blender - folder with a 3D render of the electrode geometry, used as background in Fig. 1(a)
  • plots - output folder of the plotting scripts
All scripts expect to be run from this folder as the working directory, e.g. python plot_setup.py.

Simulation File Naming

Simulation output files in LSD are named 1 (6500,-1850,-1850,-1950)(1)[DA].txt, where
  • (6500,-1850,-1850,-1950) - electrode potentials in V (tip, DTe, DTf, MCP)
  • D - laser direction (laser_direction in Setup.lua). Since the tip is always displaced along the same workbench axis, this gives the displacement relative to the laser: 0 = +x, 1 = -x, 2 = +y, 3 = -y (for z_PAs folders always 0)
  • A - starting position set (apex_start_only in Setup.lua): 0 = full illuminated nanotip surface, 1 = restricted to the contributing apex region
The coordinate system follows Fig. 1(a) of the manuscript: z is the axial direction (tip to MCP), x is the laser propagation direction, and y is perpendicular to both.

Uncommon Data Types

  • .txt (in LSD/*_PAs) - SIMION ion trajectory output in ascii format: one header line, then one ion per line with comma separated columns:
    ion_mass [amu], ion_charge [e], ion_time_of_flight [µs], ion_px_mm, ion_py_mm, ion_pz_mm [mm] (final position), ion_energy [eV], ion_volts [V], ion_px_mm_start, ion_py_mm_start, ion_pz_mm_start [mm], ion_energy_start [eV], ion_volts_start [V].
    Ions that reached the MCP have ion_pz_mm ≈ 20.65 mm (minus the axial displacement).
  • start_stop[DA].txt - ion starting positions in ascii format: two header lines, then pairs of lines start pos: x, y, z and end pos: x, y, z in [mm]. The start position is the projected laser position on the tip surface, the end position is the same point moved onto the ion initialization equipotential surface.
  • .PA# - SIMION potential array before refining (binary, readable with SIMION). # marks a fast-adjustable array, refining creates one .PA0 - .PAn file per electrode
  • .npy (in PAs) - numpy arrays extracted from the potential arrays, named after the source .PA0 file:
    • *_solid.npy - electrode mask (1 = electrode, 0 = free space)
    • *_potentials.npy - electrostatic potential in [V]
    • LSD_.PA0_<scale>_<xwb>_<ywb>_<zwb>_<X|Y>_*.npy - 2D slice through the 3D macroscopic geometry normal to the given axis, with the scale [mm/grid unit] and workbench offsets [mm]
    • *nanotip_15nm.pa0_<N>_potentials.npy - 2D cylindrically symmetric potential of the nanotip grid, sampled with N subdivisions per voxel
  • .txt (in PAs) - metadata for the .npy arrays: first line is the number of grid points nx ny nz, second line is the voxel size dx dy dz in [mm]
  • .npz (in np_tmp) - intermediate numpy files:
    • tof_R<R>_E<E>_A<A>.npz - tofs: TOF of all ions reaching the MCP in [ps], relative to the fastest ion, with initial energy ≤ E eV, for all tip displacements pa_offsets_all [mm] along x, y and z (in this order); ions: total number of simulated ions per configuration
    • area_*.npz - effective emission area x_areas, y_areas, z_areas in [nm2] for the tip displacements x_shifts, y_shifts, z_shifts in [mm]
  • .cod2 - binned experimental TOF histogram in ascii format, comma separated columns: time [ns], counts

Regenerating the Simulations

Regenerating the potential arrays and ion trajectories requires a licensed copy of SIMION 8.1. The refined potential arrays need about 50 GB of disk space per tip displacement. The published runs used the fixed starting positions provided here, but no fixed random seed, so the initial kinetic energies and emission directions are re-sampled. A re-run therefore gives statistically equivalent, not identical, trajectories.

For each tip displacement folder simulation/<d>_PAs:
  1. Workbench program: the folder already contains a copy of Setup.lua (identical to simulation/Setup.lua). SIMION only runs a workbench program that has the same name as the .iob file and sits in the same folder. The other input files (ion.lua, ion_nanotip.lua, fine_nanotip.gem, ultrafine_nanotip.zo, input_start_positions_*) are found one folder up.
  2. Coarse potential array LSD_.PA#: the unrefined array used for the published simulations is included in each folder, so it only has to be refined in SIMION. This creates LSD_.PA0 to LSD_.PA6. Alternatively, the array can be recreated from the STL files with SIMION SL Tools → STL -> PA, using these settings:
    • cell size 0.05 mm in all three dimensions
    • electrode numbers (also used by fast_adjust in Setup.lua): LSD_1.stl → 1 (ground cylinder), LSD_2.stl → 2 (bolts, ground), LSD_3(<d>).stl → 3 (cathode holder and tip, use the file of the respective displacement), LSD_4.stl → 4 (MCP), LSD_5.stl → 5 (DTe), LSD_6.stl → 6 (DTf)
    Save the array as LSD_.PA# in the folder before refining.
  3. Nanotip arrays: fine_nanotip.pa0 and ultrafine_nanotip.pa0 are created by Setup.lua from fine_nanotip.gem (gem2pa, then refined) at the start of each Fly'm, with 1 µm and 1 nm voxels and the tip parameters set by the adjustable variables.
  4. Open Setup.iob in SIMION, set the adjustable variables and start a Fly'm. The output files are written to a sub-folder named after the run settings, in the format described above. The settings of the published runs follow from the folder and file names:
    • tip_radius = 15 or 150 nm
    • e_kin_min / e_kin_max = 0 / 10 eV
    • potential_tip, potential_dt1, potential_dt2, potential_mcp as in the file name
    • laser_direction and apex_start_only as in [DA]
    • use_start_positions = 1 (fixed starting positions)

Script Requirements

Scripts were run using Python 3.14.0 on Windows with the following packages installed (see requirements.txt)
  • numpy (2.3.5)
  • matplotlib (3.10.7)
  • scipy (1.16.3)
  • shapely (2.1.2)
Additional notes:
  • The matplotlib style sheet uses text.usetex: True and the font Times New Roman, so a working LaTeX installation is required.

Files

code_and_figures.zip

Files (42.2 GiB)

NameSize Download all
md5:07f7650901ec2343de9d4f19dc72583b
69.2 MiBPreview Download
md5:fdb870da26a6d0ba92d2e9103b0a0912
902.4 MiBPreview Download
md5:223fcf97116911e270474b2c52f4500d
903.7 MiBPreview Download
md5:5281a62ef1a9c55da4776f963131526d
905.5 MiBPreview Download
md5:af2f3ec2c53b6b65f51fe60371314c71
907.2 MiBPreview Download
md5:219055a4fb154792f8636b9c6406b894
908.7 MiBPreview Download
md5:9eac95ef063b0638ac4f35b95ca0f3de
4.0 GiBPreview Download
md5:a15822b43e9506aa3e1b48e8106cba50
900.8 MiBPreview Download
md5:bb5e1d89a8d4e282c3429fa64b8c5a91
4.0 GiBPreview Download
md5:011ffe3e190c3a7b23014d333436b2ca
899.4 MiBPreview Download
md5:99234873e9108e247598d3c69ce8951f
4.0 GiBPreview Download
md5:7fbc309bac1be89ef2a051c04ed01c73
896.8 MiBPreview Download
md5:3eece7db7ab27b9ff01dc31209edaade
4.0 GiBPreview Download
md5:640b451477fc773d211d752d14f393de
893.7 MiBPreview Download
md5:5a05feb3c9e47d394b3d1fd50d115346
5.7 GiBPreview Download
md5:0c0f2e3bb68e4d44a014d8f5ad7fadf8
2.2 GiBPreview Download
md5:dfc572aa0e7fb4a0543ab5c8b64ddd5b
4.0 GiBPreview Download
md5:28175f43356acd3edfb030f217532564
890.3 MiBPreview Download
md5:2bdbedb106e6a0dd1dc78b88074c0a93
119.8 MiBPreview Download
md5:e668b08ad2edfcc38df0002e977e60fd
4.4 GiBPreview Download
md5:160ad0cde6e0f3f28f9ae3e3710b4ea6
1022.9 MiBPreview Download

Additional details

Related works

Is part of
Journal Article: 10.1103/gfl6-fh1k (DOI)

Funding

FWF Austrian Science Fund
10.55776/Y1174