Wide distribution of PropagatedXPosition at electrodes

Dear all,
using the same setup described here plus a 2T magnetic field in the +y direction I get the following plot for PropagatedXPosition vs PropagatedZPosition:

The sensor is 100 um thick and I am depositing charge at x=y=z=0 mm.
My question is the following: why the carriers spread out so much at the electrode?
I suspect this is a feature of the simulation and I am looking for a suggestion to get a more narrow /close to reality distribution at the electrodes.

Thanks and regards,
Marco Bomben

Hi @mbomben

you mean the vertical sharp lines at the upper and lower sensor boundary?

My guess would be that the field is very low there. Charge carriers are drawn towards the surface but never reach it actually. Over the time of your simulation the charge carriers then start diffusing towards the sides, perpendicular to the sensor surface, and are kept close to the surface by the field.

Do you by any chance have a plot of the z-dependence of your electric field?

Cheers,
Simon

Hello @simonspa ,
here is the field projection

I see, thanks. Is there a way to stop the drift (simulation?) if the distance to the collecting electrode is smaller than a certain value, please?

Thanks and cheers,
Marco

Hi @mbomben

in your version v2.3 not without code changes, even though they are very minor. The criterion for stopping the propagation is here: src/modules/TransientPropagation/TransientPropagationModule.cpp · v2.3-stable · Allpix Squared / Allpix Squared · GitLab

While we use a method of the detector model (isWithinSensor(pos)) you could just add your own criterion, taking into account that x = 0 is in the cnter of the sensor and units are mm. so something like this:

while(within_sensor 
         && (initial_time + runge_kutta.getTime()) < integration_time_ 
         && is_alive 
         && !is_trapped 
         && std::fabs(position.z()) < (model_->getSensorSize().z() / 2 - 0.01)) {
    // ...
}

should work just fine. Adjust the 0.01 to whatever you can read off your plot above where the field is zero.

If you would move to a newer version, we have the option to define implants with a certain depth, both on front and back, that would allow you to do the same without code changes.

Cheers,
Simon

Hi @simonspa , thanks!
I am ready to embrace newer versions :slight_smile: Which is the one that you recommend, please?

Thanks again,
Marco

Hi @mbomben

as of yesterday, this feature is in master, so if you are on CVMFS just use the latest tag there.

On order to control what portion of your sensor is considered an implant for charge collection, you have to add them to your detector model. See documentation.

Essentially it means adding two implants with the size of your pixel to the model file:

[implant]
type = frontside
shape = rectangle
size = <pitch_x> <pitch_y> < desired depth>


[implant]
type = backside
shape = rectangle
size = <pitch_x> <pitch_y> < desired depth>

This will then stop propagation when charge carriers enter the implant regions. Make sure to enable collect_from_implants from your transfer module.

Cheers,
Simon

Hi
What is the command to generate this chart? I haven’t used Root in a long time and forgot about it.

Hello,

yourTree->Draw("PropagatedXPosition:PropagatedZPosition")

Regards,
Marco Bomben

Thanks a lot,its worked !

best regards

zhl

Dear @simonspa ,
using v3.0.1 I am trying to implement the implant definition but I get very strange results. Here is what I am doing:

  1. in the main.conf file I have added the following line:

model_paths="/home/mbomben/work/Digitizer/ITk/LUTs/create_luts_implants/rd53a_50.conf"

  1. The file at the model_paths location contains the following information:
# SPDX-FileCopyrightText: 2021-2024 CERN and the Allpix Squared authors
# SPDX-License-Identifier: MIT

type = "hybrid"
geometry = "pixel"

number_of_pixels = 400 192
pixel_size = 50um 50um

sensor_thickness = 150um
sensor_excess_top = 0.0mm
sensor_excess_bottom = 0.0mm
sensor_excess_right = 0.6um
sensor_excess_left = 0.6um
bump_sphere_radius = 9.0um
bump_cylinder_radius = 7.0um
bump_height = 20.0um
bump_offset = 0.0um 0.0um

chip_thickness = 400um

[support]
thickness = 500um
size = 30mm 20mm
offset = 0 0mm
location = "chip"
material = "aluminum"



[implant]
type = frontside
shape = rectangle
size = 37um 37um 73.5um


[implant]
type = backside
shape = rectangle
size = 50um 50um -73.5um

This is a modified RD53 50 um pitch sensor where I want to have 37 um wide n+ implant, uniform p+ implant at the back, and the depth of both implants is about 1.5 um

  1. I use [PulseTransefer] (using electric field and weighting potential from TCAD) like this:
[PulseTransfer]
#log_level = DEBUG
max_depth_distance = 5um
output_plots = 1
collect_from_implant = 1

Am I missing something, please?

I join also the various conf files:
main.conf (1.6 KB)
planar_detector.conf (99 Bytes)
rd53a_50.conf (698 Bytes)

I would like to understand if there is already a clear mistake at this level.

Many thanks in advance and best regards,
Marco Bomben

Hi @mbomben

You seem to set a z coordinate for the implant thickness, but you should be setting just the thickness as a positive value, so

[implant]
type = backside
shape = rectangle
size = 50um 50um 1.5um

THe code interpreting the thickness is here and it essentially takes the frontside (or backside, depending on type) position and subtracts or adds the thickness.

Re-reading the documentation I do see that this is more than unclear currently, and we should rephrase this. Please test this - and if it works I will

a) add a check to catch situations like this (negative values should be disallowed)
b) improve the documentation to make clear this is the thickness.

Best,
SImon