Positive Conformation of Avalanche

Hello,

I am using Garfield++ packages and specifically AvalancheMicroscopic to simulate a gaseous detector similar to Garfield example “DriftTube”.
In short, how can I be sure that the simulation indeed creation an avalanche?
( I have looked at the header and source files and am not quite sure )

In length, those are the steps the simulation is doing. aval is:

AvalancheMicroscopic* aval = new AvalancheMicroscopic();

I am generating a random trajectory that generates a track with clusters along it. I am going over all electrons in all clusters with:

while (track->GetCluster(xcls, ycls, zcls, tcls, ne, ni, e, extra))
        {
            double xe1, ye1, ze1, te1, e1;
            double dxe1, dye1, dze1;
            double xi1, yi1, zi1, ti1;
            double xeS, yeS, zeS, teS, xeE, yeE, zeE, teE;
            int status;

            for (int j=1; j<=ne; j++)
            {
                // electrons ionized by main particle
                track->GetElectron(j-1,xe1, ye1, ze1, te1, e1, dxe1, dye1, dze1); 
                aval->DriftElectron(xe1, ye1, ze1, te1, e1, dxe1, dye1, dze1);
                aval->AvalancheElectron(xe1, ye1, ze1, te1, e1, dxe1, dye1, dze1); 
            }
}

I also added some other functions to convince myself that an avalanche is happening:

while (track->GetCluster(xcls, ycls, zcls, tcls, ne, ni, e, extra))
        {
            double xe1, ye1, ze1, te1, e1;
            double dxe1, dye1, dze1;
            double xi1, yi1, zi1, ti1;
            double xeS, yeS, zeS, teS, xeE, yeE, zeE, teE;
            int status;

            for (int j=1; j<=ne; j++)
            {
                // electrons ionized by main particle
                track->GetElectron(j-1,xe1, ye1, ze1, te1, e1, dxe1, dye1, dze1); 
                aval->DriftElectron(xe1, ye1, ze1, te1, e1, dxe1, dye1, dze1);
                aval->AvalancheElectron(xe1, ye1, ze1, te1, e1, dxe1, dye1, dze1); 
                cout << "\nAvalancheSizeLimit = " << aval->GetAvalancheSizeLimit() << "\n" ;
                int electron_number, holes_number, ion_number ;
                aval->GetAvalancheSize( electron_number, holes_number, ion_number) ;
                cout << electron_number << " " << holes_number << " " << ion_number << "\n" ;
                cout << "# Of Electron End points = " << aval->GetNumberOfElectronEndpoints() << "\n" ;
            }
}

After all of that, I am successfully simulating a signal using the transfer function from the “DriftTube” example, the signal reaching a peak of -0.025 [fC].
Are avalanches happening in these simulations?

Have a good day,
Dvir


ROOT Version: 6.24.06
Platform: Ubuntu20.04
Compiler: g++ 9.4.0


I guess @hschindl can help.

Hi,
GetAvalancheSize and GetNumberOfElectronEndpoints are both good ways to check whether you have multiplication. In the absence of attachment, the number of electrons you get from these two methods should be the same (GetNumberOfElectronEndpoints also includes the electron trajectories that were terminated because of attachment while GetAvalancheSize does not).

By the way, I noticed two small issues in the snippet of code you posted:

  • The electron energy you get from track->GetElectron(...) is not meaningful. Better use a value that is small compared to the ionisation energy (something in the range 0.1 … 1 eV) as initial energy for DriftElectron or AvalancheElectron.
  • There is no need to call DriftElectron here. AvalancheElectron includes the drift of the initial electron.
1 Like

Thank you!

@hschindl , I have some follow ups questions about your comments if it is ok.
I don’t quite understand the first comment. Do you suggest use a random energy in said value range?

About the second comment, I get different values for using “DriftElectron” or using “AvalancheElectron”. Also, a get a third set of values for using both of them. How do I choose which one to use?
I was under the impression that one is simulation a drifting electron from the ionization of the main particle and the second function calculates the avalanche caused by it.

You could indeed do that. But it’s usually sufficient to use a fixed initial energy.

DriftElectron simulates the trajectory of a single electron with a given starting point and energy but it does not track the secondary electrons produced in the avalanche (if any).
AvalancheElectron simulates the trajectory of the initial electron and of the secondary electrons produced in the avalanche.
So if you want to simulate an avalanche you should use AvalancheElectron.

1 Like

I see, Thank you!

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