CbmRoot
Loading...
Searching...
No Matches
CbmTrdDigi.cxx
Go to the documentation of this file.
1/* Copyright (C) 2009-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Florian Uhlig [committer] */
4
5#include "CbmTrdDigi.h"
6
7#include "CbmTrdAddress.h" // for CbmTrdAddress
8
9#include <iomanip> // for operator<<, setprecision, setw
10#include <sstream> // for operator<<, basic_ostream, stringstream
11#include <string> // for char_traits
12#include <utility>
13
14#include <cmath>
15
16#include "AlgoFairloggerCompat.h" // for LOG
17
18#ifdef NO_ROOT
19// Coming from Rtypes.h in ROOT mode
20#define BIT(n) (1ULL << (n))
21#define SETBIT(n, i) ((n) |= BIT(i))
22#define CLRBIT(n, i) ((n) &= ~BIT(i))
23#define TESTBIT(n, i) ((Bool_t)(((n) &BIT(i)) != 0))
24#endif
25
26using std::endl;
27using std::string;
28using std::stringstream;
29
41const double CbmTrdDigi::fgClk[] = {62.5, 12.5, 0.0};
42const float CbmTrdDigi::fgPrecission[] = {1.e3, 1., 0.0};
43//_________________________________________________________________________________
44CbmTrdDigi::CbmTrdDigi() : fInfo(0), fCharge(0), fTime(0) {}
45//_________________________________________________________________________________
46CbmTrdDigi::CbmTrdDigi(int32_t padChNr, float chargeT, float chargeR, uint64_t time) : fTime(time)
47{
59 SetChannel(padChNr);
60 SetCharge(chargeT, chargeR);
61}
62
63//_________________________________________________________________________________
64CbmTrdDigi::CbmTrdDigi(int32_t padChNr, int32_t uniqueModuleId, float charge, uint64_t time, eTriggerType triggerType,
65 int32_t errClass)
66 : fTime(time)
67{
79 SetChannel(padChNr);
80 SetAddress(uniqueModuleId);
81 SetCharge(charge);
82 SetTriggerType(triggerType);
83 SetErrorClass(errClass);
84}
85
86// ---- Copy c'tor ----
88{
89 fInfo = digi.fInfo;
90 fCharge = digi.fCharge;
91 fTime = digi.fTime;
92}
93
94//_________________________________________________________________________________
96{
98 LOG(warn) << "CbmTrdDigi::AddCharge(CbmTrdDigi*, double) : Only available for "
99 "FASP. Use AddCharge(double, double) instead.";
100 return;
101 }
102 int8_t dt = fCharge >> 24, dts = sd->fCharge >> 24;
103 uint32_t t = ((fCharge & 0xfff000) >> 12), r = (fCharge & 0xfff), ts = ((sd->fCharge & 0xfff000) >> 12),
104 rs = (sd->fCharge & 0xfff);
105 // apply correction factor to charge
106 float tsf = f * ts / fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)],
107 rsf = f * rs / fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)];
108 ts = tsf * fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)];
109 rs = rsf * fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)];
110
111 if (t + ts < 0xfff) t += ts;
112 else
113 t = 0xfff;
114 if (r + rs < 0xfff) r += rs;
115 else
116 r = 0xfff;
117 dt += dts;
118 fCharge = r | (t << 12);
119 fCharge |= dt << 24;
120}
121
122//_________________________________________________________________________________
123void CbmTrdDigi::AddCharge(double c, double f)
124{
126 LOG(warn) << "CbmTrdDigi::AddCharge(double, double) : Only available "
127 "for SPADIC. Use AddCharge(CbmTrdDigi*, double) instead.";
128 return;
129 }
130 SetCharge(GetCharge() + f * c);
131}
132
133//_________________________________________________________________________________
135{
138 return (fInfo >> fgkRoOffset) & 0xfff;
139}
140
141//_________________________________________________________________________________
143{
146 return CbmTrdAddress::GetAddress(Layer(), Module(), 0, 0, 0);
147}
148
149//_________________________________________________________________________________
151{
153 return fCharge / fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kSPADIC)];
154 }
155 else {
156 return (fCharge & 0xfff) / fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)];
157 }
158}
159
160//_________________________________________________________________________________
161double CbmTrdDigi::GetCharge(double& tilt, int32_t& dt) const
162{
170 LOG(warn) << "CbmTrdDigi::GetCharge(double &) : Use double GetCharge() "
171 "instead.";
172 return 0;
173 }
174 int8_t toff = fCharge >> 24;
175 dt = toff;
176 tilt = ((fCharge & 0xfff000) >> 12) / fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)];
177 return (fCharge & 0xfff) / fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)];
178}
179
180//_________________________________________________________________________________
181double CbmTrdDigi::GetChargeError() const { return 0; }
182
183//_________________________________________________________________________________
184std::pair<CbmTrdDigi::eTriggerType, bool> CbmTrdDigi::GetTriggerPair(const int32_t triggerValue)
185{
186 // First get the trigger type kSelf or kNeighbor it is written to the first bit of the trigger bits.
187 eTriggerType type = static_cast<eTriggerType>(triggerValue & 1);
188
189 // Now extract if we had a multihit or not the info is written two the next bit
190 bool isMultihit = static_cast<bool>((triggerValue >> 1) & 1);
191
192 return std::make_pair(type, isMultihit);
193}
194
195//_________________________________________________________________________________
196bool CbmTrdDigi::IsFlagged(const int32_t iflag) const
197{
198 if (iflag < 0 || iflag >= kNflags) return false;
199 return (fInfo >> (fgkFlgOffset + iflag)) & 0x1;
200}
201
202//_________________________________________________________________________________
203void CbmTrdDigi::SetAddress(int32_t address)
204{
207}
208
209//_________________________________________________________________________________
216
217//_________________________________________________________________________________
218void CbmTrdDigi::SetCharge(float cT, float cR, int32_t dt)
219{
226 uint32_t r = uint32_t(cR * fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)]),
227 t = uint32_t(cT * fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kFASP)]);
228 int8_t toff = dt;
229 if (dt > 127) toff = 127;
230 else if (dt < -127)
231 toff = -127;
232 if (r > 0xfff) r = 0xfff;
233 if (t > 0xfff) t = 0xfff;
234 fCharge = r | (t << 12);
235 fCharge |= toff << 24;
236}
237
238//_________________________________________________________________________________
240{
241
242 fCharge = uint32_t(c * fgPrecission[static_cast<size_t>(eCbmTrdAsicType::kSPADIC)]);
243}
244
245//_________________________________________________________________________________
246void CbmTrdDigi::SetFlag(const int32_t iflag, bool set)
247{
248 if (iflag < 0 || iflag >= kNflags) return;
249 if (set) SETBIT(fInfo, fgkFlgOffset + iflag);
250 else
251 CLRBIT(fInfo, fgkFlgOffset + iflag);
252}
253
254//_________________________________________________________________________________
256{
257 switch (GetType()) {
259 fTime = uint64_t(ceil(t / Clk(GetType())));
260 break;
261 }
263 fTime = static_cast<uint64_t>(t);
264 break;
265 }
266 case eCbmTrdAsicType::kNTypes: return;
267 }
268}
269
270//_________________________________________________________________________________
272{
273 if (GetType() != eCbmTrdAsicType::kFASP) return;
274 fCharge <<= 8;
275 fCharge >>= 8;
276 fCharge |= t << 24;
277}
278
279//_________________________________________________________________________________
281{
282 if (triggerType < eTriggerType::kBeginTriggerTypes || triggerType >= eTriggerType::kNTrg) return;
283 const int32_t ttype = static_cast<int32_t>(triggerType);
284 fInfo |= (ttype << fgkTrgOffset);
285}
286
287//_________________________________________________________________________________
288void CbmTrdDigi::SetTriggerType(const int32_t ttype)
289{
290 if (ttype < static_cast<int32_t>(eTriggerType::kBeginTriggerTypes)
291 || ttype >= static_cast<int32_t>(eTriggerType::kNTrg))
292 return;
293 fInfo |= (ttype << fgkTrgOffset);
294}
295
296
297//_________________________________________________________________________________
299{
300 stringstream ss;
301 ss << "CbmTrdDigi(" << (GetType() == eCbmTrdAsicType::kFASP ? "F)" : "S)")
302 << " | moduleAddress=" << GetAddressModule() << " | layer=" << Layer() << " | moduleId=" << Module()
303 << " | pad=" << GetAddressChannel() << " | time[ns]=" << std::fixed << std::setprecision(1) << GetTime();
305 int32_t trg(GetTriggerType()), dt;
306 double t, r = GetCharge(t, dt);
307 bool ttrg(trg & 1), rtrg((trg & 2) >> 1);
308 ss << " | pu=" << (IsPileUp() ? "y" : "n") << " | mask=" << (IsMasked() ? "y" : "n") << " |charge=" << std::fixed
309 << std::setw(6) << std::setprecision(1) << t << (!ttrg && t > 0 ? '*' : ' ') << "/" << r
310 << (!rtrg && r > 0 ? '*' : ' ') << "[" << dt << "]";
311 }
312 else {
313 ss << " | charge=" << GetCharge() << " TriggerType=" << GetTriggerType() << " ErrorClass=" << GetErrorClass();
314 }
315 ss << endl;
316 return ss.str();
317}
318
319#ifndef NO_ROOT
321#endif
ClassImp(CbmConverterManager)
Helper class to convert unique channel ID back and forth.
#define SETBIT(n, i)
Definition RTypes.h:15
#define CLRBIT(n, i)
Definition RTypes.h:16
static uint32_t GetModuleId(uint32_t address)
Return module ID from address.
static uint32_t GetLayerId(uint32_t address)
Return layer ID from address.
static uint32_t GetAddress(int32_t layerId, int32_t moduleId, int32_t sectorId, int32_t rowId, int32_t columnId)
Return address from system ID, layer, module, sector, column and row IDs.
int32_t GetAddressModule() const
Getter module address in the experiment.
static const int32_t fgkTypOffset
Definition CbmTrdDigi.h:292
void SetAsic(eCbmTrdAsicType ty=eCbmTrdAsicType::kSPADIC)
CbmTrdDigi()
Default constructor.
void SetTriggerType(const eTriggerType triggerType)
Set digi trigger type.
void SetAddress(const int32_t a)
Module address setter for digi.
static std::pair< eTriggerType, bool > GetTriggerPair(const int32_t triggerValue)
Get the trigger combination, i.e. St or Nt and is multihit or not (true/false)
int32_t GetTriggerType() const
Channel trigger type. SPADIC specific see CbmTrdTriggerType.
Definition CbmTrdDigi.h:163
static const int32_t fgkTrgOffset
Definition CbmTrdDigi.h:291
static const double fgClk[static_cast< size_t >(eCbmTrdAsicType::kNTypes)+1]
clock length in ns for acquisition
Definition CbmTrdDigi.h:41
static const int32_t fgkRoOffset
Definition CbmTrdDigi.h:286
void SetFlag(const int32_t iflag, bool set=true)
Generic flag status setter.
int32_t Module() const
Definition CbmTrdDigi.h:188
double GetChargeError() const
Charge error parametrisation. SPADIC specific see GetErrorClass()
void SetModule(const int32_t a)
Definition CbmTrdDigi.h:261
bool IsPileUp() const
Query digi pile-up (FASP only)
Definition CbmTrdDigi.h:184
std::string ToString() const
String representation of a TRD digi. Account for digi type and specific information.
int32_t Layer() const
Definition CbmTrdDigi.h:187
void SetChannel(const int32_t a)
Definition CbmTrdDigi.h:251
int32_t GetAddressChannel() const
Getter read-out id.
uint32_t fInfo
Definition CbmTrdDigi.h:267
bool IsFlagged(const int32_t iflag) const
Query flag status (generic)
bool IsMasked() const
Query digi mask (FASP only)
Definition CbmTrdDigi.h:182
static float Clk(eCbmTrdAsicType ty)
DAQ clock accessor for each ASIC.
Definition CbmTrdDigi.h:109
static const int32_t fgkFlgOffset
Definition CbmTrdDigi.h:290
void SetErrorClass(const int32_t n)
Set digi error class (SPADIC only)
Definition CbmTrdDigi.h:231
eCbmTrdAsicType GetType() const
Channel FEE SPADIC/FASP according to CbmTrdAsicType.
Definition CbmTrdDigi.h:173
void AddCharge(CbmTrdDigi *sd, double f)
Charge addition in case of pile-up (FASP simulation only)
int32_t GetErrorClass() const
Channel status. SPADIC specific see LUT.
Definition CbmTrdDigi.h:133
uint32_t fCharge
Definition CbmTrdDigi.h:268
void SetTimeOffset(int8_t t)
Set time offset of rectangular to tilt pads for FASP (clk)
double GetTime() const
Getter for physical time [ns]. Accounts for clock representation of each ASIC. In SPADIC case physica...
Definition CbmTrdDigi.h:153
uint64_t fTime
Definition CbmTrdDigi.h:270
double GetCharge() const
Common purpose charge getter.
void SetCharge(float c)
Charge setter for SPADIC ASIC.
void SetTime(double t)
Set global digi time (ns)
static const float fgPrecission[static_cast< size_t >(eCbmTrdAsicType::kNTypes)+1]
Nr. of digits stored for ASIC.
Definition CbmTrdDigi.h:42
void SetLayer(const int32_t a)
Definition CbmTrdDigi.h:256