Creating a pixelated detector

Hello everyone,
I want to create a pixelated detector and calculate the energy deposition in each pixel, is there any suggestions to achieve that.
many regards

There are multiple ways to do that depending on the specifics of your detector. Maybe you can use a Geant4 Parameterised Volume.


Maybe a simple idea would be:

Create some kind of chip/wafer volume where you pixels will be placed in. Then you create a β€œrow” volume along one axis.
Create a pixel (as a box), then you can place the pixel in the row using the G4Replica (n placements along a certain axis); then you can to the same with the row, place the row with G4Replica along a the other axis in your chip/wafer volume. Based on this you get the copy number of each pixel in each row later on and the same for the copy number of the row and the respective module providing you with a channel number for each pixel.

Of course there are implementations available like the Allpix, but I do not have any experience with this.


thank you @cdreisbach for your answer, i have created 100 small volumes using G4Replica along Z axis, I want to extract some quantities from the volumes (i.e. energy deposited in each single volume), I will very thankful if there is some suggestions

Basically what I did was the following:

Using the copy number to create a channel number for each pixel and analyse the hit/step data in in the pixel as sensitive detector:

Create a Sensitive Detector which you set for the pixel you used for replication.
With this you get access to the step (hit) in the sensitive detector volume (pixel) within the ProcessHit method.
Now you can use the Touchable History to navigate through the pixel, row, column and module like this. So you obtain the copy number (increasing number with placement) and can calculate a channel number:

G4TouchableHistory* theTouchable =(G4TouchableHistory*)(step->GetPreStepPoint()->GetTouchable());
G4VPhysicalVolume* plane = theTouchable->GetVolume(4);
G4VPhysicalVolume* module = theTouchable->GetVolume(3);
G4VPhysicalVolume* row = theTouchable->GetVolume(1);
G4VPhysicalVolume* pixel = theTouchable->GetVolume(0);

And using a hit class with channel number property:

pixelSiliconPixelHit._channelNo = this->_pixelPerModule * module->GetCopyNo() + this->_pixelPerRow  * row->GetCopyNo() + pixel->GetCopyNo();

Could do the job.

All the best

1 Like