Simulation of HVCMOS pixels detector

I am currently working on simulating an HVCMOS silicon detector, which is essentially a pixel detector consists of 4x4 clusters, and each cluster contains 16x16 pixels. I am particularly interested in studying the cluster size under different bias voltage values and at various angles for the incident particles.

The specifics of my simulation include using silicon as the detector material, with a thickness of 150 micrometers. However, I am facing some challenges in properly configuring the high voltage CMOS detector aspect of the simulation. I am unsure about the correct settings for this, and I would greatly appreciate any guidance or advice you can provide on how to appropriately set up the high voltage CMOS detector parameters in Allpix².
here is the detector configuration:
type = “monolithic”

geometry = “pixel”
number_of_pixels = 64 64
pixel_size = 83um 83um

sensor_thickness = 150um
sensor_material = “Silicon”
in_pixel_adc_resolution = 12-bit
counter_resolution = 6-bit

number_of_clusters = 16
pixels_per_cluster = 256

I run the simulation and noticed the cluster size increase as the bias voltage increase. but it fluctuates when rotating the detector, so I thought it is worth to check the simulation files first. I attached the simulation files for your reference. If anyone have any comment or can help with that, let me know please.
Many thanks in advance,
Best regards,
allpix_config.conf (1.2 KB)
tut.conf (197 Bytes)


I’ll try to help a bit, with what I spot as odd here.
First of all, the keywords in_pixel_adc_resolution and counter_resolution don’t do anything in the detector configuration file. We’ll look into adding warnings for this.
The ADC resolution can be defined in the [DefaultDigitizer] module, in your allpix_config.conf file: DefaultDigitizer | Allpix Squared.
Secondly, the [cluster] block does not do anything. It is currently not possible to group pixels like this in the geometry definition stage.

Looking at the allpix_config.conf file, [GeometryBuilderGeant4] doesn’t have a keyword of size and position. The keyword to set a material is world_material, and you can set the size of the world by changing the margins around the minimum world size (which is calculated automatically by the framework); GeometryBuilderGeant4 | Allpix Squared

The rest looks okay, as far as I can see.
As for the effects you’re seeing, I do expect the cluster size to change as the sensor rotates, as the incoming particles will cross several pixels depending on the angle of incidence.

Hope this helps, feel free to write if there are further questions

Kind regards,

1 Like

Many thanks, HĂĄkan, for your helpful response. I really appreciate your assistance. I apologize for the delayed response; I spent some time editing, testing the code, and trying to solve a couple of errors that occurred.

If you have the time to offer advice on these errors, it would be highly appreciated. When I attempted to rotate the detector at 30 degrees on the y-axis, I encountered a strange distribution for the clusters per event. It might be due to the beam hitting the edge of the sensor; so I tried to visualise my simulation to investigate the issue, but I couldn’t because of this error:
[I:VisualizationGeant4] Caught Geant4 exception visman0202: Scene has no extent. Please activate or add something.
The camera needs to have something to point at!
Add a volume. (You may need “/run/initialize”.)
Or use “/vis/scene/add/extent”.
“/vis/scene/list” to see list of models.

Although I followed what’s mentioned here : here
but I haven’t been able to resolve it yet
Attached a picture for the distribution, and the position of the detector as follows :
position = 0mm 0mm -125mm
orientation = 0 30deg 0deg
Screenshot 2023-11-01 at 11.02.36
many thanks in advance,

Hi @Fajer

how does your main configuration file look like with the visualization module activated?


Hi @simonspa ,
Thanks for your response, please find attached the main configuration file.
allpix_config.conf (1.1 KB)

Hi @Fajer ,
It seems to work for me, with the geometry definition you gave in your first post (updated to new position and orientation) and your new main configuration file;

We get a warning message saying that gui is not a keyword however; what you’re looking for here is driver.
If you send along your new tut.conf and HVTrack.conf as well, maybe that can reproduce the visualisation issue.
If you didn’t try to run it with the defaults in [VisualizationGeant4] yet, I would recommend doing so (I find the default QtGui nicer. I would set number_of_events to 1 for this visualisation however, as it only pops up at the end of the run currently.

If this doesn’t work, it may be an issue with the Geant4 build not having the required flags.

As for the “Clusters per event” histogram, I’d recommend looking at the cluster charge as well. Maybe you’re not collecting a lot of charge, and then your threshold is too high to get a hit registered in many of the events (and thus zero clusters). Your beam seems to be hitting the detector fine, as far as I can tell. It could also be helpful to do a linegraph in the propagation GenericPropagation | Allpix Squared , to visualise how the charges move inside the sensor (note: do this for just one or a few events, as it takes a long time)

Kind regards,