CbmRoot
Loading...
Searching...
No Matches
CbmMvdDigi.cxx
Go to the documentation of this file.
1/* Copyright (C) 2008-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Christina Dritsa [committer], Florian Uhlig, Philipp Sitzmann */
4
5// -----------------------------------------------------------------------
6// ----- CbmMvdDigi source file -----
7// ----- Created 17/04/08 by C. Dritsa -----
8// -----------------------------------------------------------------------
9
10#include "CbmMvdDigi.h"
11
12#include <Logger.h> // for LOG, Logger
13
14#include <TObject.h> // for TObject
15
16#include <cmath>
17#include <limits>
18
19// ----- Default constructor -------------------------------------------
21 : TObject()
22 , fDigiTime(0.)
23 , fCharge(0.)
24 , fPixelSizeX(0.)
25 , fPixelSizeY(0.)
26 , fChannelNr(0)
27 , fFrameNumber(0)
28 , fRefId(-1)
29 , fAddress(0)
30 , fDigiFlag(-1)
31{
32}
33// -------------------------------------------------------------------------
34
35
36/*
37// ----- Constructor with parameters -----------------------------------
38CbmMvdDigi::CbmMvdDigi(int32_t iStation, int32_t iChannelNrX, int32_t iChannelNrY, float charge,
39 float pixelSizeX, float pixelSizeY)
40 : CbmDigi(kMVD, 0),
41 CbmMvdDetectorId(),
42 fCharge(charge),
43 fChannelNrX(iChannelNrX),
44 fChannelNrY(iChannelNrY),
45 fTrackID(-1),
46 fPointID(0),
47 fPixelSizeX(pixelSizeX),
48 fPixelSizeY(pixelSizeY),
49 fDetectorId(0),
50 fChannelNr(0),
51 fDigiTime(0.),
52 fFrameNumber(0),
53 fRefId(-1),
54 fDigiFlag(-1)
55{
56 // Check range for station
57 if ( ! ( iStation >= 0 && iStation <= 255 ) ) {
58 LOG(fatal) << "Illegal station number " << iStation;
59 }
60
61 fDetectorId = DetectorId(iStation);
62
63 fChannelNrY = iChannelNrY;
64 fCharge = charge;
65 fChannelNrX=iChannelNrX;
66 fChannelNrY=iChannelNrY;
67 fPixelSizeX=pixelSizeX;
68 fPixelSizeY=pixelSizeY;
69 fDigiFlag=-1;
70
71}
72// -------------------------------------------------------------------------
73*/
74
75// ----- Constructor with parameters --> used only due to error TODO include correct version -----------------------------------
76CbmMvdDigi::CbmMvdDigi(int32_t sensorNr, int32_t iChannelNrX, int32_t iChannelNrY, float charge, float pixelSizeX,
77 float pixelSizeY, double time, int32_t frame)
78 : TObject()
79 , fDigiTime(time)
80 , fCharge(charge)
81 , fPixelSizeX(pixelSizeX)
82 , fPixelSizeY(pixelSizeY)
83 , fChannelNr(0)
84 , fFrameNumber(frame)
85 , fRefId(-1)
86 , fAddress(CbmMvdAddress::GetAddressFromSensorNrAndPixelXY(sensorNr, iChannelNrY, iChannelNrX))
87 , fDigiFlag(-1)
88{
89 // Check range for sensorNr
90 if (!(sensorNr >= 0 && sensorNr <= 600)) {
91 LOG(fatal) << "Illegal sensor number " << sensorNr;
92 }
93}
94// -------------------------------------------------------------------------
95
96// ----- Conversion Constructor from CbmMvdRawDigi ---------------------
97CbmMvdDigi::CbmMvdDigi(const CbmMvdRawDigi& rhs, float pixelSizeX, float pixelSizeY)
98 : TObject()
99 , fCharge(10000) // Based on email by M. Deveaux, value high enough to be above threshold
100 , fPixelSizeX(pixelSizeX)
101 , fPixelSizeY(pixelSizeY)
102 , fChannelNr(0) // Deprecated
103 , fRefId(-1) // set only by consumers (ClusterFinder)
104 , fDigiFlag(-1)
105{
106 fAddress = rhs.GetAddress();
107 fFrameNumber = rhs.GetFrame();
108
109 if (std::numeric_limits<int32_t>::max() < rhs.GetFrame()) {
110 LOG(fatal) << "Frame number in Raw Digi (uint32) too large for MvdDigi field (int32): " << rhs.GetFrame()
111 << " (max allowed: " << std::numeric_limits<int32_t>::max() << ")";
112 }
113 fDigiTime = rhs.GetTime(); // !!!! Conversion from uint32_t to double, range/precision to check? !!!!
114}
115// -------------------------------------------------------------------------
116
117// ----- Conversion Constructor to CbmMvdRawDigi ---------------------
119{
125 if (rhs.GetTime() < 0) {
126 LOG(fatal) << " Cannot convert CbmMvdDigi to CbmMvdRawDigi as time negative (conversion to uint64_t "
127 << rhs.GetTime();
128 }
129
137 return CbmMvdRawDigi(rhs.GetAddress(),
138 static_cast<uint32_t>(rhs.GetTime()), // Convert double in ns to uint32_t rounded to the ns
139 rhs.GetFrameNumber());
140}
141// -------------------------------------------------------------------------
142
143int32_t CbmMvdDigi::GetAdcCharge(int32_t adcDynamic, int32_t adcOffset, int32_t adcBits) const
144{
156
157 int32_t adcCharge;
158
159 if (fCharge < adcOffset) { return 0; };
160
161
162 double stepSize;
163 // int32_t adcMax = adcOffset + adcDynamic;
164
165 stepSize = adcDynamic / pow(2, adcBits);
166 adcCharge = int((fCharge - adcOffset) / stepSize);
167
168
169 if (adcCharge > int(pow(2, adcBits) - 1)) { adcCharge = (int) pow(2, adcBits) - 1; }
170
171 if (gDebug > 0) { LOG(debug) << "CbmMvdDigi::GetAdcCharge() " << adcCharge; }
172
173 return adcCharge;
174}
175
176
177// -------------------------------------------------------------------------
178
ClassImp(CbmConverterManager)
Functions to encode or decode the address field of MVD data.
double GetTime() const
Definition CbmMvdDigi.h:89
float fPixelSizeX
Definition CbmMvdDigi.h:120
float fPixelSizeY
Definition CbmMvdDigi.h:121
int32_t GetFrameNumber() const
Definition CbmMvdDigi.h:90
int32_t fRefId
Definition CbmMvdDigi.h:124
static CbmMvdRawDigi ConvertToRawDigi(const CbmMvdDigi &rhs)
float fCharge
Definition CbmMvdDigi.h:117
int32_t fDigiFlag
Definition CbmMvdDigi.h:127
int32_t GetAdcCharge(int32_t adcDynamic, int32_t adcOffset, int32_t adcBits) const
int32_t GetAddress() const
Definition CbmMvdDigi.h:88
int32_t fChannelNr
Definition CbmMvdDigi.h:122
int32_t fFrameNumber
Definition CbmMvdDigi.h:123
double fDigiTime
Definition CbmMvdDigi.h:116
uint32_t fAddress
Definition CbmMvdDigi.h:125
uint32_t GetAddress() const
uint32_t GetFrame() const
uint64_t GetTime() const