Scanning photocurrent microscopy and ultrafast transient photovoltage field dependence data with simulation programs
Abstract
Photogenerated carriers in Sb-doped Bi₂Se₃ can travel unusually long distances, possibly due to the formation of an exciton condensate in the material. This study contains the measurements and models we used to study how an applied electric field alters that transport to resolve the charge nature of carriers. We measured the photovoltage of Bi₂Se₃ devices with lock-in detection while sweeping an in-plane electric field, at temperatures from 12 to 150 K and laser powers from 5 to 100 µW. We mapped the photocurrent across the device with scanning photocurrent microscopy for a series of field values of both polarities, and we recorded pump–probe time traces of the photovoltage as a function of field at four temperatures and four pump powers, from which carrier recovery times, mobilities, diffusion coefficients, and Einstein ratios were extracted. To interpret the measurements, we developed a two-dimensional drift–diffusion simulation of field-dependent carrier flux and a one-dimensional exciton transport model with field-dependent dissociation. The results show that the long-range photoresponse is not carried by free charge but by a charge-neutral correlated state.
Measurements, processed results, analysis scripts, and simulation code behind Figures 1- 4 of the article. The experiments are electrically detected optical measurements on Sb-doped Bi2Se3 nanoribbon devices under an in-plane electric field: lock-in photovoltage versus field, scanning photocurrent microscopy, and pump-probe photovoltage time traces. Two models accompany them: a 2D drift-diffusion simulation of field-dependent carrier flux and a 1D exciton transport model with field-dependent dissociation.
The deposit is organized by figure. Each leaf folder has its own README that documents the file format, the processing steps and parameters, and the command that regenerates that folder's results. This file is the map, and it also carries the data dictionary for every variable used anywhere in the deposit.
Layout
Files.zip/
|-- README.md <- this file
|
|-- Figure 1 data/
| |-- PV signal vs Electric field at fixed location/
| | photovoltage vs field at 20 K, both polarities (raw sweeps,
| | processed curve, script) -> README.md
| |-- SPCM under Electric field/
| | photocurrent maps at 20 K for 10 field values of each polarity,
| | with reflection images, line cuts, script -> README.md
| `-- Simulation/
| 2D drift-diffusion solver, sweep data, figure -> README.md
|
|-- Figure 2 data/
| 1D multiple-pass exciton transport model, the 20 K measurement it is
| fitted to, figure and plotted curves -> README_multipass_v2.md
|
|-- Figure 3 data/
| `-- Temperature and Fluence analysis sweep Vt/
| |-- Temperature dependence/ photovoltage vs field, 25-150 K, 5 uW
| | -> README.md
| `-- Fluence dependence/ photovoltage vs field, 45 K, 5-100 uW
| -> README.md
`-- Figure 4 data/
`-- Temperature analysis TT/
pump-probe time traces at 12, 20, 80, 120 K and four pump powers;
fitted recovery times; mobility, diffusion coefficient and
Einstein ratio -> README.md
Reproducing the figures
Python >= 3.9 with numpy, scipy, pandas, and matplotlib. Every script locates its data relative to its own file, so it can be run from any working directory. Run times are in seconds, except where noted.
| Figure | Command (from the folder that holds the script) |
|---|---|
| 1, photovoltage vs field | python "Transverse electrode lockin method.py" |
| 1, photocurrent maps | python spcm_efield.py |
| 1, simulation | python drift_diffusion_solver.py (about 30 s) |
| 2, multiplepass sim | python multipass_model_v2.py |
| 3, temperature | python "Transverse electrode lockin method.py" in Temperature dependence/ |
| 3, fluence | python "Transverse electrode lockin method.py" in Fluence dependence/ |
| 4 | python code/run_all_fits.py then python code/einstein_ratio.py; add --refit to redo the fits from the raw traces (1-2 min per dataset) |
Processed outputs are shipped alongside the raw data in every folder, so the published curves can be inspected without running anything.
Conventions shared by all folders
- Raw measurements are plain-text
.datfiles (tab-separated) with a short header. Part of the metadata lives only in the file name; see the filename tokens table below. - Lock-in readings are stored in instrument units, not volts. The scripts convert them to physical units using the sensitivity encoded in the file name; the two conversions are given in the data dictionary.
- The in-plane field is the transverse bias divided by the electrode gap of that device,
E = Vt / gap. The gap is not the same in every folder: 5 um for Figures 1 and 2, 15 um for Figures 3 and 4. The value used is a constant at the top of each script (GAP_UM). - There are no missing values anywhere in the deposit except in
mu_D_einstein.csv, whereeinstein_ratioandeinstein_ratio_errare left empty for the single dataset (20 K, 25 uW) in which the mobility could not be determined, andnoteis empty for the fifteen datasets that need no flag. Empty means "not defined". - Processed results are
.csvfiles with labelled column headers; figures are.pngand.svg.
Data dictionary
Every variable in the deposit is listed once below, with units. Variables that recur in several files are described at their first appearance and cross-referenced afterwards.
1. Metadata carried in file names
Some quantities are recorded only in the file name, and the scripts parse them from there. A typical pump-probe name:
03, 690, 12K, TT, 218-270UpDown, 1vel, 3900acc, 0Vg, 0.0025mWPr, 0.015mWPu, BH, 30uV, 40x, VbDG=101.12mV.dat
| Token | Meaning | Units |
|---|---|---|
| leading integer | acquisition index, used only for ordering | - |
690 |
excitation wavelength | nm |
12K, 20K ... |
sample temperature | K |
TT |
measurement type (time trace) | - |
218-270UpDown |
delay-stage travel range and that it sweeps out and back | mm |
1vel, 2vel |
delay-stage velocity | mm/s |
3900acc |
delay-stage acceleration | mm/s2 |
0Vg |
back-gate voltage | V |
0.0025mWPr |
probe power (0.0025 mW = 2.5 uW) | mW |
0.015mWPu |
pump power | mW |
BH |
electrode pair used for detection | - |
30uV, sen=100uV |
lock-in full-scale sensitivity | uV |
40x |
objective magnification | - |
VbDG=101.12mV |
transverse bias applied across the electrode gap | mV |
10^-7, 10^-6 |
current-preamplifier sensitivity, full scale | A |
power=5uW |
incident laser power | uW |
positive bias / negative bias |
polarity of the transverse bias | - |
pos 2, pos=3 |
laser position on the device | - |
x axis |
In-phase axis for lock-in | - |
2. Raw data files
2a. Lock-in bias sweeps
Figure 1 data/PV signal vs Electric field at fixed location/Raw data/*.dat and both Raw data/ folders under Figure 3 data/. Tab-separated, one header line, one row per sample.
| Column | Description | Units |
|---|---|---|
V(V) |
DC voltage across the device; 0 in every deposited file | V |
Lockin(V) |
Lock-in output as a percentage of full scale, despite the header. Convert with PhotoV (uV) = Lockin(V) * sensitivity(uV) * sqrt(2) * pi / 4 / 100, which takes percent to fraction, RMS to amplitude, and the square-wave fundamental to its peak |
% of full scale |
Vg(V) |
back-gate voltage; 0 in every deposited file | V |
Time(sec) |
elapsed time from the start of the sweep | s |
Vt(mV) |
transverse bias across the electrode gap, magnitude only; the polarity is in the file name | mV |
2b. Scanning photocurrent maps
Figure 1 data/SPCM under Electric field/20K/{Positive,Negative}/*.dat. Nine header lines of the form key: value, then a tab-separated matrix with one row per scan line (y) and one column per scan point (x).
| Header key | Description | Units |
|---|---|---|
Ouput rate (Hz) |
DAC update rate (spelling as written by the instrument) | Hz |
Input rate (Hz) |
ADC sampling rate | Hz |
Y Scan Size (um) |
scan extent along y | um |
X Scan Size (um) |
scan extent along x | um |
Scan Rate (Hz) |
line rate | Hz |
Scan Points |
samples per line, i.e. number of matrix rows | count |
Scan Lines |
number of lines, i.e. number of matrix columns | count |
Average Over |
hardware averages per point | count |
Bias/Gate |
instrument bias field; unreliable, use VbDG from the file name |
V |
| Matrix | Description | Units |
|---|---|---|
*-cur.dat values |
photocurrent as a fraction of the preamplifier full scale. Convert with I (nA) = value * 10^(9+n) where 10^n is the sensitivity in the file name |
fraction of full scale |
*-ref.dat values |
simultaneously recorded reflected optical power, used only to locate the device | arbitrary |
2c. Pump-probe delay scans
Figure 4 data/Temperature analysis TT/data/<T>K/<power>uW/*.dat.
Same five-column layout as 2a, but the last column means something different:
| Column | Description | Units |
|---|---|---|
V(V), Vg(V) |
as in 2a; both 0 throughout | V |
Lockin(V) |
as in 2a; converted to photovoltage the same way | % of full scale |
Time(sec) |
elapsed time. The delay axis is derived from this and the stage velocity in the file name, then re-zeroed at t0 | s |
Vt(mV) |
instrument readback, not the applied bias. The bias for these files is the VbDG value in the file name; the analysis ignores this column |
mV |
3. Processed data files
3a. processed_pv.csv
Figures 1 and 3, one row per bias bin. Produced by
Transverse electrode lockin method.py.
| Column | Description | Units |
|---|---|---|
temperature_K |
sample temperature of the sweep | K |
power_uW |
incident laser power | uW |
sign |
polarity of the transverse bias: positive or negative |
- |
vt_mV |
signed bin-centre transverse bias, bin width 1 mV | mV |
electric_field_mV_per_um |
vt_mV / GAP_UM; gap is 5 um in Figure 1 and 15 um in Figure 3 |
mV/um |
pv_averaged_uV |
photovoltage after binning and a 10-bin centred moving average | uV |
pv_averaged_std_uV |
1 sigma of the raw samples, pooled over the smoothing window (RMS of the per-bin standard deviations). With ERROR_KIND="sem" the column is named pv_averaged_sem_uV and holds the standard error instead |
uV |
pv_averaged_zeroE_normalized |
pv_averaged_uV / zeroE_reference_uV; equals 1 at E ~ 0 |
dimensionless |
pv_averaged_zeroE_normalized_std |
the band above, in normalized units | dimensionless |
zeroE_reference_uV |
photovoltage at the smallest measured |Vt| for that temperature, averaged over the two polarities where both reach it | uV |
3b. 20K_{Positive,Negative}_cross_sections.csv
Figure 1 data/SPCM under Electric field/output/. One row per scan point along x; one column per bias.
| Column | Description | Units |
|---|---|---|
x_um |
position along the channel | um |
I_nA_at_<bias>V |
Photocurrent in the cross section at that bias, dark-offset subtracted and averaged over an 11 (y) x 3 (x) pixel window at y = 14.9 um. The bias appears in the column name in volts, e.g. I_nA_at_-0.2513V |
nA |
3c. right_flux_sweep.csv
Figure 1 data/Simulation/data/. Raw solver output, one row per (mobility, field). All fluxes are percentages of the total optical generation rate, so they are independent of the absolute laser power.
| Column | Description | Units |
|---|---|---|
mobilityCm2Vs |
carrier mobility used for that solve | cm2/Vs |
eFieldMvUm |
applied field across the slab thickness, signed | mV/um |
diffusionUm2Ns |
diffusion constant, from the Einstein relation D = mu kB T / e |
um2/ns |
interfaceRightPct |
carrier flux crossing the internal interface into the right field-free buffer, at x = +W/2. This is the simulated signal | % of generation |
interfaceLeftPct |
same at the left interface, x = -W/2 | % of generation |
topContactPct |
flux absorbed by the top contact | % of generation |
bottomContactPct |
flux absorbed by the bottom contact | % of generation |
farLeftPct |
flux leaving the far left numerical edge | % of generation |
farRightPct |
flux leaving the far right numerical edge | % of generation |
recombinedPct |
carriers lost to bulk recombination | % of generation |
balancePct |
sum of all boundary fluxes and recombination; a closure check that should equal 100 (it does, to 1e-11) | % of generation |
3d. right_flux_normalized.csv
Same folder. One row per field, one column per mobility. This is the file that is plotted.
| Column | Description | Units |
|---|---|---|
eFieldMvUm |
Applied field, signed | mV/um |
mu_<value>_cm2Vs |
interfaceRightPct divided by its value at E = 0, for the mobility named in the column (100, 1000, 10000, 100000 cm^2/Vs) |
dimensionless |
3e. Figure 2 files
| File and column | Description | Units |
|---|---|---|
Normalized_PV_vs_E_t_20K_D1.csv : Efield_exp |
transverse field, the measurement the model is fitted to (20 K, device D1; the same sweep as Figure 1, unbinned) | mV/um |
Normalized_PV_vs_E_t_20K_D1.csv : Lockin_exp |
measured photovoltage normalized to its low-field plateau | dimensionless |
Fig2a_profiles.csv : x_um |
laser position along the 275 um channel | um |
Fig2a_profiles.csv : I_sT0, I_sT0p5, I_sT1, I_sT5, I_sT10, I_sT50 |
simulated photocurrent profile, normalized to max|I| of the zero-field profile. The suffix is the sink strength in units of 1e-4 um^-1, with p for the decimal point (I_sT0p5 is s_T = 0.5e-4 um^-1) |
dimensionless |
Fig2b_sT_vs_Et_points.csv : Et_mV_per_um |
transverse field, binned | mV/um |
Fig2b_sT_vs_Et_points.csv : sT_per_um |
sink strength of the biased transverse contact pair, obtained by inverting the measured suppression through the model | um^-1^ |
Fig2b_PF_fit.csv : Et_mV_per_um, sT_per_um |
the Poole-Frenkel fit line ln s_T = 1.2425 sqrt(E_t) - 14.978, sampled for plotting |
mV/um, um^-1^ |
3f. recovery_times.csv
Figure 4 data/Temperature analysis TT/results/. One row per pump-probe trace. L and R denote the negative-delay and positive-delay branches of the trace.
| Column | Description | Units |
|---|---|---|
T_K |
sample temperature | K |
pump_uW |
pump power | uW |
bias_mV |
transverse bias, from VbDG in the file name |
mV |
E_mV_per_um |
bias_mV / 15 um |
mV/um |
tau_L_ps |
recovery time of the delay < 0 branch, from a single-exponential fit. This is the one used in step 2 | ps |
tau_L_err_ps |
1 sigma on tau_L_ps from a moving-block residual bootstrap |
ps |
tau_R_ps, tau_R_err_ps |
the same for the delay > 0 branch | ps |
A_L, A_R |
fitted baseline photovoltage of each branch | uV |
B_L, B_R |
fitted amplitude of each branch; negative, since the signal dips | uV |
dV_over_V_L, dV_over_V_R |
relative dip depth, 100 * B / A |
% |
3g. mu_D_einstein.csv
Same folder. One row per (temperature, pump power) dataset, from a weighted straight-line fit of 1/tau_L against field: 1/tau = A + B E, with
D = A W0^2 / 4 and mu = B W0, using W0 = 0.85 +- 0.05 um and a
15 +- 1 um gap.
| Column | Description | Units |
|---|---|---|
T_K |
sample temperature | K |
pump_uW |
pump power | uW |
fluence_uJcm2 |
pump fluence | uJ/cm^2 |
n_points |
number of traces entering the line fit | count |
intercept_A |
intercept A of 1/tau versus field |
1/ns |
intercept_err |
1 sigma on the intercept | 1/ns |
slope_B |
slope B of 1/tau versus field |
1/ns per (mV/um) |
slope_err |
1 sigma on the slope | 1/ns per (mV/um) |
D_cm2s |
diffusion coefficient | cm2/s |
D_err |
1 sigma on D, from the fit only | cm2/s |
mu_cm2Vs |
mobility | cm2/Vs |
mu_err |
1 sigma on mu, from the fit only | cm2/Vs |
einstein_ratio |
(D/mu) / (kB T / q); equals 1 if the Einstein relation holds. Empty where the slope is unresolved and the ratio is therefore undefined |
dimensionless |
einstein_ratio_err |
1 sigma, from the fit only; empty on the same row. A further +-9 % geometric systematic from W0 and the gap is not included | dimensionless |
note |
free text, empty unless the dataset needs a flag. The only entry is on 20 K / 25 uW: "slope of 1/tau vs E not resolved mobility and R undefined". On that row mu_cm2Vs = -26.4 with mu_err = 408 is the raw fit output and should not be used as a mobility; D_cm2s, which comes from the intercept, is unaffected |
- |
3h. fit_param_<power>uW.dat
Figure 4 data/Temperature analysis TT/results/fits/<T>K/<power>uW/.
Tab-separated with a header line, one row per bias. These are the per-dataset
fits that recovery_times.csv collects.
| Column | Description | Units |
|---|---|---|
A_left, A_left_err |
baseline of the delay < 0 branch and its 1 sigma | uV |
B_left, B_left_err |
amplitude of the delay < 0 branch and its 1 sigma | uV |
tau_left, tau_left_err |
recovery time of the delay < 0 branch and its 1 sigma | ps |
A_right, A_right_err |
baseline of the delay > 0 branch and its 1 sigma | uV |
B_right, B_right_err |
amplitude of the delay > 0 branch and its 1 sigma | uV |
tau_right, tau_right_err |
recovery time of the delay > 0 branch and its 1 sigma | ps |
vg |
back-gate voltage | V |
PPr |
probe power | uW |
PPu |
pump power | uW |
lamb |
excitation wavelength | nm |
T |
sample temperature | K |
DeltaV_V_l, DeltaV_V_r |
relative dip depth of each branch, 100 * B / A |
% |
Vt |
transverse bias | mV |
4. Figures included as files
| File | Content |
|---|---|
*_maps.png |
photocurrent maps, one panel per bias, symmetric +-1000 nA colour scale |
*_cross_sections.png |
the line cuts in 3b, coloured by bias |
right_flux_normalized_xlog.png |
normalized simulated flux versus field, one curve per mobility |
Multipass.png |
Figure 2 panels (a) and (b) |
overlay_deltaVoverV.svg |
every pump-probe trace of a dataset as dV/V versus delay, with the fitted branches |
tau_vs_V.png |
fitted tau_L and tau_R versus bias, with error bars |
Relations between folders
- The measurement fitted in Figure 2 (
Normalized_PV_vs_E_t_20K_D1.csv) is the same 20 K sweep as inFigure 1 data/PV signal vs Electric field at fixed location/, exported unbinned and normalized. Both therefore use the 5 um electrode gap. - The temperature and fluence sweeps of Figure 3 use the same script and the same processing as the Figure 1 photovoltage data, on a device with a 15 um gap.
- Figure 4 uses the same 15 um gap as Figure 3.
Measurements were made on Sb-doped Bi₂Se₃ single-crystal devices fabricated with lithography methods, mounted in a cryostat and held at temperatures between 12 and 150 K. Carriers were excited with a 690 nm laser focused through a 40× objective to a spot of about 1.9 µm. The resulting photovoltage or photocurrent was detected with a lock-in amplifier. An in-plane electric field was applied as a voltage across a 5 µm/ 15µm (D1/D2) transverse electrode gap. We collected field-dependence data by sweeping this voltage at a fixed laser position while recording the lock-in signal. We collected scanning photocurrent maps by rastering the laser over a 300 µm × 40 µm region of the device at fixed field. Pump–probe traces were collected by splitting the beam into a pump and a weaker probe, varying their relative delay with a mechanical delay stage, and recording the photovoltage as a function of delay at each applied field.
