Hello,
I am using Garfield++ TrackSrim to simulate low-energy lithium-ion ionisation. I found unexpectedly low electron yields and would appreciate advice on whether my interpretation and proposed changes are reasonable.
My setup is:
- Lithium ions, initial kinetic energies of 1–100 keV.
MediumMagboltz: He/N₂ = 98/2, 6 atm, 293.15 K.- SRIM input: lithium in pure helium, density 0.00108 g/cm³.
- Work function: 40 eV.
- Default combined energy-loss fluctuation model (
SetModel(4)). - A large active region, so the tracks should stop inside the gas.
The SRIM table starts at 1.1 keV. I understand that using a pure-He table for the mixture, and extending it below its minimum energy, introduces separate physical uncertainties. My questions here concern the tracking and sampling logic.
1. Possible premature termination
In TrackSrim::NewTrack(), I found the following logic, abbreviated:
if (stpmin > stpmax) {
// Debug message: "depositing all energy"
if (deem + dehd > ekin) {
eloss = ekin - dehd;
} else {
eloss = deem;
}
finish = true;
}
For a 5 keV ion, the initial short step gives approximately:
Electronic energy loss: 15.079 eV
Nuclear energy loss: 34.966 eV
Remaining kinetic energy: 4949.955 eV
Here, stpmin > stpmax, so the track terminates after this step, although most of its kinetic energy remains.
For this first step:
SRIM projected range at 5 keV: 62.11 μm
tracklength = 10 × range: 0.06211 cm
stpmax = tracklength - dsum: 0.06211 cm
stpmin: approximately 0.36944 cm
I tried retaining the mean electronic loss for the current step while removing the unconditional finish = true from this branch. Existing termination conditions for exhausted energy, track-length limits and geometry boundaries remain active.
2. Possible dependence of electron yield on cluster subdivision
With Fano sampling enabled, the original code draws an energy for the next ion pair:
const double ernd1 = RndmHeedWF(w, fano);
if (ernd1 > ecl) break;
If the available energy is insufficient, the unused energy is retained in epool, but this sampled ion-pair energy is discarded. A new value is drawn in the next cluster.
Could repeatedly discarding unaffordable draws bias the electron yield when a track is divided into many small clusters?
I tried preserving this pending draw across cluster boundaries within the same track. A new value is drawn only after the previous ion pair has been produced. This reduced the observed dependence of total electron yield on cluster subdivision.
3. Fluctuations after boundary truncation
When a step is shortened to a geometry boundary, the code recalculates its mean losses and samples the energy loss again. This occurs after the earlier negative-loss check.
In boundary tests, I observed negative energy losses from this second sampling path. I therefore tried:
- Rechecking
SmallestStep()after truncation. - Using mean loss if the shortened step is unsuitable for the fluctuation model.
- Constraining electronic loss to
[0, ekin - dehd].
The track still terminates at the boundary, retaining its outgoing kinetic energy.
Results
Mean total electron counts were:
| Initial energy | Original implementation, 200 tracks | Modified implementation, 2000 tracks |
|---|---|---|
| 1 keV | 0 | 2.31 |
| 5 keV | 0 | 23.23 |
| 10 keV | 0.84 | 72.08 |
| 15 keV | 138.88 | 138.74 |
| 20 keV | 217.30 | 217.10 |
After the changes, the fully contained test tracks exhausted their kinetic energy. Deterministic electronic losses agreed with an independent integral of Se / (Se + Sn) over energy. Boundary tests retained outgoing energy, and subdivision tests showed improved consistency.
These checks establish numerical consistency, rather than the physical accuracy of the low-energy ionisation model.
My questions are:
- Is termination in the
stpmin > stpmaxbranch intentional, or should tracking continue using mean energy loss? - Is carrying an unaffordable
RndmHeedWFdraw across clusters consistent with the intended W/Fano sampling model? - Is mean-loss fallback appropriate when boundary truncation makes a step too short for the fluctuation model?
- Is there an existing fix or a more suitable Garfield++ approach for low-energy heavy-ion ionisation?
Thank you.