Sensitive detectors - next-exp/nexus GitHub Wiki

Sensitive detectors in NEXUS

A sensitive detector is a property of a logical volume, which allows one to keep track of the "hits" that the volume records. We use sensitive detectors basically in two cases: for photosensors, to save the detected photoelectrons, and for the active volume, to save the true energy depositions.

Photosensor numbering in NEXUS

In NEXT we have two kinds of photosensors, at the moment: PMTs and SiPMs. The SiPMs are placed on boards, in groups of N photosensors for each board. PMTs are numbered starting from 0, in ascending, consecutive order, while SiPMs on board 1 go from 1000 to 1000+N-1, SiPMs on board 2 go from 2000 to 2000+N-1 etc.

How to assign each photoelectron to the correct photosensor

In NEXUS we use the SensorSD class to process each photoelectron that hits the sensitive area of a photosensor. Every time a photon is detected, we need to retrieve the ID of the photosensor that has detected it, to account for it correctly. To do so, we use the copy number assigned during the placement of the photosensors, in the construction of the geometry. The method GetCopyNumber(n) of the G4VTouchable class is used to retrieve the copy number of the nth encapsulating volume starting from the logical volume which is set as sensitive detector. Does it look like a tongue-twister? An example can help. Let's have a look, for instance, at the NEXT-100 tracking plane. In the GenericPhotosensor class, the sensitive detector is set on the window logical volume, which is placed one step inside the logical volume of the class itself. The sensor, in turn, is placed in a volume of gas, which is the one being replicated in the placement. For this reason, GetCopyNumber(2) will be used to retrieve the correct copy number of the GenericPhotosensor object being replicated. We save this number in the sensor_depth_ variable of the SensorSD class, which is settable through the SetDetectorVolumeDepth() method.

If the sensor is placed in a volume that is also replicated (such as the SiPMs on the sensor boards), one needs also the copy number of this mother volume, in order to build a unique ID for each one of the sensors. To this aim, we use the naming_order_ and the mother_depth_ variables (set through the SetDetectorNamingOrder() and the SetMotherVolumeDepth() methods, respectively). GetCopyNumber(mother_depth_) will be used to retrieve the correct copy number of the mother volume; in our example, mother_depth_ is the number of steps between the sensitive detector volume and the board volume, which is 4, since the volume of gas is placed inside the mask volume, which is, in turn, placed in the board volume. This number is multiplied by naming_order_, so that the SiPMs on each board start from a different number, as explained above. In our example, naming_order_ is set to 1000.