About Avalanche Settings in Garfield++

Hi experts,

Recently I am trying to using Garfield++ to simulate a diamond detector response to an incident pion. I came across some confusing things while using AvalancheMC to simulate the avalanche generation. Here is the core part of my code:

for (const auto& cluster : track.GetClusters()) {
  ++nc;
  nesum += cluster.electrons.size();
  for (const auto& electron : cluster.electrons) {
    drift.DriftElectron(electron.x, electron.y, electron.z, electron.t);
    drift.AvalancheElectron(electron.x, electron.y, electron.z, electron.t, true);
  }
  for (const auto& hole : cluster.ions) {
    drift.DriftHole(hole.x, hole.y, hole.z, hole.t);
    drift.AvalancheHole(hole.x, hole.y, hole.z, hole.t, true);
  }
}

So I want to simulate the whole process after the pion pass through the detector, including the drift and diffusion of electrons and holes generated by incident pion, and also the secondary electrons and holes from avalanche generation, then get the signal (induced current).

My questions are:

  1. Is this part of the code written correctly? It seems that with or without the “drift.AvalancheElectron” and “drift.AvalancheHole” lines, the induced currents are really different. (the one with avalanche rows is 2~3 times higher) which should not be with such a difference…
  2. How does the AvalancheElectron simulate the Avalanche generation of carriers exactly, and how to control it? I have a avalanche simulation result from sentaurus TCAD and it uses Chynoweth’s equation for avalanche calculation, the results are quite different… I am trying to understander the reason…

Thank you very much for your time!

Huazhen

I guess @hschindl can help.

To simulate an avalanche from every electron-hole pair produced along the track you can do something like this

for (const auto& cluster : track.GetClusters()) {
  ++nc;
  nesum += cluster.electrons.size();
  for (const auto& electron : cluster.electrons) {
    drift.AvalancheElectronHole(electron.x, electron.y, electron.z, electron.t, true);
  }
}

For diamond, impact ionisation is not taken into account at the moment. Do you have an expression for the impact ionisation coefficients αe, αh? If yes, it should be straightforward to implement them in MediumDiamond.

Hi,

Thanks for your reply, that’s really helpful!

Yes, I have an expression for alpha_e and alpha_h, and I guess I need to use the SetElectronTownsend() and SetHoleTownsend() functions to implement them? And here the input “alpha” in SetElectronTownsend(ie, ib, ia, alpha) is actually the natural log value of ionisation coefficients with a unit cm^(-1), is that correct?

Cheers
Huazhen

Hi,
if you have an analytic expression for alpha_e and alpha_h it’s probably easier to implement them directly in MediumDiamond. Can you post the expressions? And ideally the source from where you got the expression?

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.