KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
Particle identification

Identification telescopes

Particle identification in KaliVeda is handled by the KVIDTelescope class family. A basic KVIDTelescope associates 2 successive detectors on any of the particle trajectories through the array which in principle can provide \(\Delta E\)- \(E\) identification. Specialised classes are available to handle single-detector identification methods as required (such as PSA in silicon detectors for FAZIA (KVFAZIAIDSiPSA), or fast-slow identification in CsI(Tl) crystals for INDRA (KVIDINDRACsI)).

The actual identification procedure can be handled in different ways, but the method which attempts to identify whatever passed through the detector(s) is

double Double_t
virtual Bool_t Identify(KVIdentificationResult *, Double_t x=-1., Double_t y=-1.)
Full result of one attempted particle identification.

x and y here refer to coordinates in a 2-D identification map (for \(\Delta E\)- \(E\) identification we would have x= \(E\) and y= \(\Delta E\)). The results of the identification attempt are returned in the KVIdentificationResult object passed as first argument. This is a very detailed report on how well (or not) the identification went (see KVIdentificationResult for details).

As the x and y arguments have default values, this method can be called without providing their values, and indeed this is how it is used most of the time. In this case the methods

Base class for particle identification in a 2D map.
Definition KVIDGraph.h:32
Double_t GetIDGridYCoord(KVIDGraph *) const
Double_t GetIDGridXCoord(KVIDGraph *) const
void GetIDGridCoords(Double_t &X, Double_t &Y, KVIDGraph *grid, Double_t x=-1, Double_t y=-1)

are used to provide the coordinates for the identification map. As will be seen below, the values to be used for the coordinates are automatically computed even if several identification grids are assigned to the same telescope.

Identification grids

The most common way of implementing the identification of particles is by defining identification grids, which are a collection of lines and contours in a 2-D map which can be used to reject or accept particles, assign them a value of \(Z\) and/or \(A\), depending on where they fall in the map, and this in turn depends on how we assign \((x,y)\) coordinates to each particle.

X- and Y-coordinates

This decision is made when histograms are prepared from data in order to draw the identification grid. Naively, for a simple \(\Delta E\)- \(E\) telescope, one would think to fill this histogram as follows:

// supposing TH2F* myhisto (pointer to predefined 2-D histogram)
TH2F* myhisto;
// and KVIDTelescope* idt (pointer to current DE-E identification telescope)
myhisto->Fill(idt->GetDetector(2)->GetDetectorSignalValue("Energy"),
idt->GetDetector(1)->GetDetectorSignalValue("Energy"));
Double_t GetDetectorSignalValue(const KVString &type, const KVNameValueList &params="") const
Definition KVDetector.h:493
Base class for all detectors or associations of detectors in array which can identify charged particl...
KVDetector * GetDetector(UInt_t n) const
virtual Int_t Fill(const char *namex, const char *namey, Double_t w)

using the calibrated energy of each of the two detectors (see Detector signals and calibrations). However this is unlikely and discouraged for two reasons:

  • we don't want to wait for detector calibration before implementing the identifications
  • if we use a calibration to set up identification maps, what happens if the calibrations are later changed? Redo the identification!

One is therefore more likely to use some 'raw' data signal for each detector, or a combination of them (the following example is just to illustrate the possibilities, not a serious suggestion):

double X = idt->GetDetector(2)->GetDetectorSignalValue("Q3.Amplitude")
/idt->GetDetector(2)->GetDetectorSignalValue("Q3.RiseTime");
double Y = idt->GetDetector(1)->GetDetectorSignalValue("Q2.FPGAEnergy")
+idt->GetDetector(1)->GetDetectorSignalValue("I2.Amplitude");
myhisto->Fill(X,Y);
#define X(type, name)

assuming of course that all of the above signals exist for each of the two detectors (see Detector signals and calibrations).

Next you draw your grid(s), and as long as you define the VARX, VARY parameters (using the graphical interface, KVIDGridEditor) to be

VARX : Q3.Amplitude/Q3.RiseTime
VARY : Q2.FPGAEnergy+I2.Amplitude

then when the grid will be loaded by the identification telescope using

// assuming KVIDGraph* mygrid is a pointer to your grid
KVIDGraph* mygrid;
idt->SetGrid(mygrid);

the default KVIDTelescope::GetIDGridCoords() method will automatically return the correct values for your grid, according to the expressions in VARX and VARY.

Multiple grids for the same telescope

Some identifications require several grids for them to be correctly handled: for example, when high gain and low gain signals are available for one or both of the detectors concerned. This can be handled by KVIDTelescope, you just need to give the order in which the grids should be tried in an environment variable (.kvrootrc file):

[dataset].[array name].[ID type].GridOrder: [VARY1]_[VARX1],[VARY2]_[VARX2],[VARY3]_[VARX3],...
#Example:
INDRAFAZIA.E789.FAZIA.Si-Si.GridOrder: QL1.Amplitude_Q2.FPGAEnergy,QH1.FPGAEnergy_Q2.FPGAEnergy

Identification with each grid will be attempted in the order given; the first successful identification (with quality code < 4; see KVIDZAGrid) will be accepted.