CbmRoot
Loading...
Searching...
No Matches
CbmStsParAsic.cxx
Go to the documentation of this file.
1/* Copyright (C) 2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Volker Friese [committer] */
4
9#include "CbmStsParAsic.h"
10
11#include <TF1.h> // for TF1
12#include <TMath.h> // for Exp
13#include <TRandom.h>
14
15#include <cassert> // for assert
16#include <sstream> // for operator<<, basic_ostream, stringstream
17
18
19// ----- Constructor ---------------------------------------------------
20CbmStsParAsic::CbmStsParAsic(UShort_t nChannels, UShort_t nAdc, double dynRange, double threshold, double timeResol,
21 double deadTime, double noise, double znr)
22{
23 Set(nChannels, nAdc, dynRange, threshold, timeResol, deadTime, noise, znr);
24}
25// -------------------------------------------------------------------------
26
27
28// ----- Copy constructor ----------------------------------------------
30{
31 Set(other.fNofChannels, other.fNofAdc, other.fDynRange, other.fThreshold, other.fTimeResolution, other.fDeadTime,
32 other.fNoise, other.fZeroNoiseRate);
35}
36// -------------------------------------------------------------------------
37
38// ----- Copy assignment operator --------------------------------------
40{
41 Set(other.fNofChannels, other.fNofAdc, other.fDynRange, other.fThreshold, other.fTimeResolution, other.fDeadTime,
42 other.fNoise, other.fZeroNoiseRate);
45 return *this;
46}
47// -------------------------------------------------------------------------
48
49// ----- Destructor ----------------------------------------------------
54// -------------------------------------------------------------------------
55
56// ----- Deactivate channels -------------------------------------------
58{
59
60 if (fraction < 0.) return 0;
61
62 // --- Average number of dead channels
63 double meanDead = fraction * double(fNofChannels);
64 if (meanDead > fNofChannels) meanDead = fNofChannels;
65
66 // --- Sample actual number of dead channels from Poissonian
67 Int_t nDead = gRandom->Poisson(meanDead);
68
69 // --- Deactivate the given number of channels
70 Int_t nDeactivated = 0;
71 while (nDeactivated < nDead) {
72 Int_t channel = Int_t(gRandom->Uniform(0, fNofChannels));
73 if (IsChannelActive(channel)) {
74 fDeadChannels.insert(channel);
75 nDeactivated++;
76 } //? Channel was active
77 } //# Deactivated channels
78
79 assert(nDeactivated == nDead);
80 return nDead;
81}
82// -------------------------------------------------------------------------
83
84
85// ----- Single-channel noise rate -------------------------------------
87{
88 if (fNoise == 0.) return 0.;
89 double ratio = fThreshold / fNoise;
90 return 0.5 * fZeroNoiseRate * TMath::Exp(-0.5 * ratio * ratio);
91}
92// -------------------------------------------------------------------------
93
94
95// ----- Random charge of a noise signal -------------------------------
97{
98 assert(fIsInit);
99 return fNoiseCharge->GetRandom();
100}
101// -------------------------------------------------------------------------
102
103
104// ----- Initialise the noise charge distribution ----------------------
106{
107 if (fNoiseCharge) delete fNoiseCharge;
108 fNoiseCharge = new TF1("Noise_Charge", "TMath::Gaus(x, [0], [1])", fThreshold, 10. * fNoise, "NL");
109 fNoiseCharge->SetParameters(0., fNoise);
110 fIsInit = kTRUE;
111}
112// -------------------------------------------------------------------------
113
114
115// ----- Set the parameters ---------------------------------------------
116void CbmStsParAsic::Set(UShort_t nChannels, UShort_t nAdc, double dynRange, double threshold, double timeResol,
117 double deadTime, double noise, double zeroNoiseRate, std::set<UShort_t> deadChannels)
118{
119
120 // Assert validity of parameters
121 assert(dynRange > 0.);
122 assert(threshold > 0.);
123 assert(timeResol > 0.);
124 assert(deadTime >= 0.);
125 assert(noise >= 0.);
126 assert(zeroNoiseRate >= 0.);
127
128 fNofChannels = nChannels;
129 fNofAdc = nAdc;
130 fDynRange = dynRange;
131 fThreshold = threshold;
132 fTimeResolution = timeResol;
133 fDeadTime = deadTime;
134 fNoise = noise;
135 fZeroNoiseRate = zeroNoiseRate;
136 fDeadChannels = deadChannels;
137
138 Init();
139}
140// --------------------------------------------------------------------------
141
142
143// ----- String output ----------------------------------------------------
144std::string CbmStsParAsic::ToString() const
145{
146 std::stringstream ss;
147 ss << "nAdc " << fNofAdc << " | dynRange " << fDynRange << " e | thresh. " << fThreshold << " e | tResol "
148 << fTimeResolution << " ns | deadTime " << fDeadTime << " ns | noise " << fNoise << " e | ZNR " << fZeroNoiseRate
149 << "/ns | SCNR " << GetNoiseRate() << "/ns";
150 return ss.str();
151}
152// --------------------------------------------------------------------------
153
154
ClassImp(CbmConverterManager)
int Int_t
Parameters of the STS readout ASIC.
double GetRandomNoiseCharge() const
Random noise charge.
double fTimeResolution
Time resolution [ns].
TF1 * fNoiseCharge
Flag for being initialised.
void Set(uint16_t nChannels, uint16_t nAdc, double dynRange, double threshold, double timeResol, double deadTime, double noise, double zeroNoiseRate, std::set< uint16_t > deadChannels={})
Set parameters.
std::string ToString() const
Info to string.
double fDeadTime
Channel dead time [ns].
std::set< uint16_t > fDeadChannels
Map of dead channels.
uint16_t DeactivateRandomChannels(double fraction)
Randomly deactivate a fraction of the channels.
double GetNoiseRate() const
Single-channel noise rate.
~CbmStsParAsic()
Destructor.
double fZeroNoiseRate
Zero-crossing noise rate [1/ns].
CbmStsParAsic()
Default constructor.
double fNoise
RMS of noise [e].
CbmStsParAsic & operator=(const CbmStsParAsic &other)
Copy assignment operator.
double fTimeOffset
Time offset [ns].
double fDynRange
Dynamic range [e].
std::array< double, 31 > fWalkCoef
Parameters for correction of walk effect.
void SetWalkCoef(std::array< double, 31 > par)
Set coefficients for walk correction.
uint16_t fNofAdc
Number of ADC channels.
Bool_t IsChannelActive(uint16_t channel) const
Check for a channel being active.
void SetTimeOffset(double offset)
Set time offset.
uint16_t fNofChannels
Number of readout channels.
double fThreshold
Threshold [e].
void Init()
Initialisation.