Hi all,
This is going to be a bit long, and is separated into 3 parts.
I am simulating a detector, similar in geometry to the one simulated here by Sundberg et al.: 1-μm spatial resolution in silicon photon-counting CT detectors, and I have noticed some irregularities.
(Full .conf file is at the bottom)
Irregularity 1: disappearing charge carriers
When generating an animation of the charge propagation, I noticed some of the charge carriers disappearing, as can be seen in the image below from the plot from TransientPropagation of the same event, where two of the charge carriers (on the right side) have disappeared on the way down to the backside electrode. Yes I have checked that the integration time is long enough (140ns), and the charge carriers disappears at around 20ns into the propagation according to the gif.
So my question is then, why does this happen?
Irregularity 2: Incomplete charge carrier collection.
This may be connected to irregularity 1, but there seems to be incomplete charge collection, which can be between a few percent, to 20 percent, for example with 20% discrepancy:
|10:31:00.740| (INFO) (Event 7) [R:DepositionGeant4] Deposited 4918 charges in sensor of detector detector4
|10:31:03.502| (INFO) (Event 7) [R:TransientPropagation:detector4] Propagated 4918 charges
Recombined 0 charges during transport
Trapped 0 charges during transport
|10:31:03.554| (INFO) (Event 7) [R:PulseTransfer:detector4] Total charge induced on all pixels: -2023e
and for a few %:
|10:31:04.302| (INFO) (Event 8) [R:DepositionGeant4] Deposited 4138 charges in sensor of detector detector2
|10:31:07.085| (INFO) (Event 8) [R:TransientPropagation:detector2] Propagated 4138 charges
Recombined 0 charges during transport
Trapped 0 charges during transport
|10:31:07.134| (INFO) (Event 8) [R:PulseTransfer:detector2] Total charge induced on all pixels: -1994e
I initially thought that it was a problem with the weighting potential, but then this should be fairly consistent if the number of charge carriers deposited is close to the same close to the same position, like above. However, this is seen for all energies, sometimes the collected charge carriers is close to the deposited, but always less, and sometimes it is a lot less.
So my question here then is: Where are the charges going?
To clarify, I am not using any recombination, trapping, or anything else. Here is the TransientPropagation config (full conf at bottom):
[TransientPropagation]
temperature = 293K
mobility_model = "jacoboni"
charge_per_step = 1
timestep = 0.1ns
integration_time =140ns
max_charge_groups = 0
distance = 2
output_plots = 1
output_linegraphs = true
output_plots_align_pixels = true
output_linegraphs_collected = true
output_linegraphs_recombined = true
output_linegraphs_trapped = true
Irregularity 3: too wide charge clouds
Similarly as in the article by Sundberg et al.: 1-μm spatial resolution in silicon photon-counting CT detectors, I am using a gaussian curve fit scheme to estimate the interaction position in one dimension (center of the gaussian), and using the standard deviation of the gaussian to find a power function fit to find the interaction position in the orthogonal direction (wafer thickness), from which we get the PSFs and MTFs for the two dimensions (orthogonal to the x-ray travel direction).
When performing the curve fit, we get good agreement in the wafer width direction, but the data diverge in its behaviour when looking at the set of standard deviations of all curve fits of the interactions.
In the figure below, one can see that there is a bell shape curving up when the interactions get closer to the collection electrodes (0% on the x-axis). This is, at least to me, counter intuitive, since the charges get less time to diffuse. Compare Figure 5a in the article by Sundberg. Note that most of the bell curve up-tick is from low energy interactions, but this could also be due to most of the compton interactions (the only ones considered here) are low energy.
To clarify, the pixel pitch is similar to the ~12um as in the article above in the width direction, and ~500um in the direction parallell to the x-ray path. The main difference is electrodes of ~1um compared to 10um used by Sundberg.
Further, the interactions are filtered such that only the ones where all charge is collected in one electrode row are kept. Further, here only the compton interactions are considered.
I then checked the number of electrodes that the charges spread to, which can be seen in the figure below, where the data points are colored by the total detected energy of all pixels in the event.
It doesn’t seem reasonable to see this kind of spread from compton interactions happening just a few microns from the electrodes.
I also had a look at the line graphs from transient propagation, see the figures below. The first one shows an interaction where the electrons only spread a small amount, with the second one showing an interaction where the electrons seem to spread alot more than before. And the third one is zoomed in on a third interaction with a large spread. Apologies that it is difficult to see, haven’t found how to properly zoom in the 3D plots in TBrowser.
This is confusing me since there is no carrier-carrier interactions simulated.
My question(s) here then is: Where could this behaviour come from?, is it physical?, have I done something erroneous somewhere perhaps?
I did inspect the electric field mesh, but it seems to be correct as far as I can tell.
Taking any and all help and tips.
All the best,
Rickard
.conf file
[Allpix]
log_level = "INFO"
log_format = "DEFAULT"
detectors_file = "detector.conf"
number_of_events = 100
output_directory = "output"
[GeometryBuilderGeant4]
world_material = air
[DepositionGeant4]
physics_list = FTFP_BERT_PEN
record_all_tracks = true
source_type = "macro"
file_name = "xray_source_140kVp.mac" #140kVp source, filtered by Be, Al, H20
number_of_particles = 1
max_step_length = 0.1um
[ElectricFieldReader]
model = "mesh"
file_name = electric_field.init"
field_mapping = "PIXEL_FULL"
log_level = "INFO"
output_plots = 1
output_plots_project = y
output_plots_projection_percentage = 0.5
[WeightingPotentialReader]
model = "mesh"
file_name = "weighting_potential.init"
field_mapping = "PIXEL_FULL"
log_level = "INFO"
output_plots = 1
[TransientPropagation]
temperature = 293K
mobility_model = "jacoboni"
charge_per_step = 1
timestep = 0.1ns
integration_time = 140ns
max_charge_groups = 0
distance = 2
output_plots = 1
output_linegraphs = true
output_plots_align_pixels = true
output_linegraphs_collected = true
output_linegraphs_recombined = true
output_linegraphs_trapped = true
#output_animations = true
[PulseTransfer]
output_plots = 1
output_pulsegraphs = true
#[Ignore]
[DefaultDigitizer]
electronics_noise = 0e
threshold = 0e
threshold_smearing = 0e
qdc_smearing = 0e
[ROOTObjectWriter]
# This is generally excluded, not now when debugging
#exclude = DepositedCharge, PropagatedCharge