Obtaining time dependent signals from CSADigitizer

Hi everyone,

We are working on simulating 4H-SiC detectors (currently simple diodes, with LGADs planned in the future) in Allpix². In order to simulate the output of our laboratory test devices, we are interested in the CSA signal from MIPs/alphas hitting a detector. Because of the statistical nature of our experimental data, we need to generate a large number of events (~20k) to feed into our pulse analysis.

I am currently using a TransientPropagation together with the PulseTransfer and CSADigitizer modules. However, I am uncertain on how to best obtain a time-dependent CSA signal from the CSADigitizer. In my understanding, the module outputs just the ToA/ToT time and not the signal itself.

My current approach is to use the output_pulsegraphs = true flag and read the x/y data from the ROOT TGraph objects in the modules.root output. Of course, this does not work with multiprocessing, but by splitting the simulation into two parts (everything up to TransientPropagation and PulseTransfer + CSADigitizer themselves), I was able to run the compute expensive propagation multi-threaded and generate the CSA plots single-threaded. However, this is still not optimal, as the data written by the TransientPropagation module is not of insignificant size.

Is there another way to obtain the CSA signal as a function of the time from the CSADigitizer module?

If this needs to be implemented in the CSADigitizer module itself (for example, by writing the CSA signal into a new branch), what do I need to consider regarding concurrency and multi-threading?

PS: If required, I can also append my simulation configuration, but this question should not depend on the specific implementation.

Thanks for your reply,

Hi @agsponer

thanks for your request - something quite interesting indeed. Accidentally I overlooked your suggestion to implement this yourself - and went ahead and coded something for you.

Could you have a look at this merge request and see if the new data type PixelPulse is what you were looking for? In your analysis, you can treat it just like a vector.

But to still answer your question: as long as you do not store data in member variables of a module, there is nothing that you need to take care of in terms of concurrency. The whole system is designed such that modules can run independently. Only if you start storing/caching things in a module object it becomes more complicated, because the run() method might be called multiple times in parallel.

Let me know if the merge request code works for you, we would then merge this and release it in v3.0 (because it alters the PixelHit object to add a reference it;s not backwards compatible for v2.3 or v2.4 releases).


Hi Simon

Thank you for the quick reply.
Yes, this is exactly what I was looking for :smile:.
I tested the pixelpulse changes quickly this morning and was able to successfully read the CSA data using a short ROOT macro.

I will keep you updated if I encounter any issues with the code.

Thanks again,

1 Like

Great, happy to hear! :slightly_smiling_face:

1 Like