Project
Loading...
Searching...
No Matches
Digitizer.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
18#include "ITS3Base/ITS3Params.h"
19#include "MathUtils/Cartesian.h"
22#include "ITS3Base/SpecsV2.h"
23#include "Framework/Logger.h"
24
25#include <TRandom.h>
26#include <algorithm>
27#include <vector>
28#include <ranges>
29#include <numeric>
30
31using o2::itsmft::Hit;
36
37using namespace o2::its3;
38
40{
41 const int numOfChips = mGeometry->getNumberOfChips();
42 mChips.resize(numOfChips);
43 for (int i = numOfChips; i--;) {
44 mChips[i].setChipIndex(i);
45 if (mDeadChanMap != nullptr) {
46 mChips[i].disable(mDeadChanMap->isFullChipMasked(i));
47 mChips[i].setDeadChanMap(mDeadChanMap);
48 }
49 }
50
51 if (!mParams.hasResponseFunctions()) {
52 LOGP(fatal, "No response functions set!");
53 }
54 if (const auto& func = ITS3Params::Instance().chipResponseFunction; func == "Alpide") {
57 } else if (func == "APTS") {
58 mSimRespIBScaleX = constants::pixelarray::pixels::apts::pitchX / SegmentationIB::PitchRow;
59 mSimRespIBScaleZ = constants::pixelarray::pixels::apts::pitchZ / SegmentationIB::PitchCol;
60 mSimRespIBOrientation = true;
61 } else {
62 LOGP(fatal, "ResponseFunction '{}' not implemented!", func);
63 }
64 mSimRespIB = mParams.getIBSimResponse();
65 mSimRespOB = mParams.getOBSimResponse();
66 mSimRespIBShift = mSimRespIB->getDepthMax() - constants::silicon::thickness / 2.f;
67 mSimRespOBShift = mSimRespOB->getDepthMax() - SegmentationOB::SensorLayerThickness / 2.f;
68
69 mParams.print();
70 LOGP(info, "IB shift = {} ; OB shift = {}", mSimRespIBShift, mSimRespOBShift);
71 LOGP(info, "IB pixel scale on x = {} ; z = {}", mSimRespIBScaleX, mSimRespIBScaleZ);
72 LOGP(info, "IB response orientation: {}", mSimRespIBOrientation ? "flipped" : "normal");
74}
75
76void Digitizer::process(const std::vector<itsmft::Hit>* hits, int evID, int srcID, int layer)
77{
78 // digitize single event, the time must have been set beforehand
79
80 LOG(debug) << "Digitizing " << mGeometry->getName() << ":" << layer << " hits of entry " << evID << " from source "
81 << srcID << " at time " << mEventTime << " ROFrame = " << mNewROFrame << ")"
82 << " cont.mode: " << isContinuous()
83 << " Min/Max ROFrames " << mROFrameMin << "/" << mROFrameMax;
84
85 // is there something to flush ?
86 if (mNewROFrame > mROFrameMin) {
87 fillOutputContainer(mNewROFrame - 1, layer); // flush out all frame preceding the new one
88 }
89
90 int nHits = hits->size();
91 std::vector<int> hitIdx(nHits);
92 std::iota(std::begin(hitIdx), std::end(hitIdx), 0);
93 // sort hits to improve memory access
94 std::sort(hitIdx.begin(), hitIdx.end(),
95 [hits](auto lhs, auto rhs) {
96 return (*hits)[lhs].GetDetectorID() < (*hits)[rhs].GetDetectorID();
97 });
98 for (int i : hitIdx | std::views::filter([&](int idx) {
99 if (layer < 0) {
100 return true;
101 }
102 return mGeometry->getLayer((*hits)[idx].GetDetectorID()) == layer;
103 })) {
104 processHit((*hits)[i], mROFrameMax, evID, srcID, layer);
105 }
106 // in the triggered mode store digits after every MC event
107 // TODO: in the real triggered mode this will not be needed, this is actually for the
108 // single event processing only
109 if (!mParams.isContinuous()) {
110 fillOutputContainer(mROFrameMax, layer);
111 }
112}
113
115{
116 // assign event time in ns
117 mEventTime = irt;
118 if (!mParams.isContinuous()) {
119 mROFrameMin = 0; // in triggered mode reset the frame counters
120 mROFrameMax = 0;
121 }
122 // RO frame corresponding to provided time
123 mCollisionTimeWrtROF = mEventTime.timeInBCNS; // in triggered mode the ROF starts at BC (is there a delay?)
124 if (mParams.isContinuous()) {
125 auto nbc = mEventTime.differenceInBC(mIRFirstSampledTF);
126 if (mCollisionTimeWrtROF < 0 && nbc > 0) {
127 nbc--;
128 }
129 // we might get interactions to digitize from before
130 // the first sampled IR
131 if (nbc < 0) {
132 mNewROFrame = 0;
133 // this event is before the first RO
134 mIsBeforeFirstRO = true;
135 } else {
136 mNewROFrame = nbc / mParams.getROFrameLengthInBC(layer);
137 mIsBeforeFirstRO = false;
138 }
139 LOG(debug) << " NewROFrame " << mNewROFrame << " nbc " << nbc;
140
141 // in continuous mode depends on starts of periodic readout frame
142 mCollisionTimeWrtROF += (nbc % mParams.getROFrameLengthInBC(layer)) * o2::constants::lhc::LHCBunchSpacingNS;
143 } else {
144 mNewROFrame = 0;
145 }
146
147 if (mNewROFrame < mROFrameMin) {
148 LOG(error) << "New ROFrame " << mNewROFrame << " (" << irt << ") precedes currently cashed " << mROFrameMin;
149 throw std::runtime_error("deduced ROFrame precedes already processed one");
150 }
151
152 if (mParams.isContinuous() && mROFrameMax < mNewROFrame) {
153 mROFrameMax = mNewROFrame - 1; // all frames up to this are finished
154 }
155}
156
157void Digitizer::fillOutputContainer(uint32_t frameLast, int layer)
158{
159 // fill output with digits from min.cached up to requested frame, generating the noise beforehand
160 frameLast = std::min(frameLast, mROFrameMax);
161 // make sure all buffers for extra digits are created up to the maxFrame
162 getExtraDigBuffer(mROFrameMax);
163
164 LOG(info) << "Filling IT3 digits output on layer " << layer << " for RO frames " << mROFrameMin << ":" << frameLast;
165
167
168 // we have to write chips in RO increasing order, therefore have to loop over the frames here
169 for (; mROFrameMin <= frameLast; mROFrameMin++) {
170 rcROF.setROFrame(mROFrameMin);
171 rcROF.setFirstEntry(mDigits->size()); // start of current ROF in digits
172
173 auto& extra = *(mExtraBuff.front().get());
174 for (size_t iChip{0}; iChip < mChips.size(); ++iChip) {
175 auto& chip = mChips[iChip];
176 if (chip.isDisabled() || (layer >= 0 && mGeometry->getLayer(chip.getChipIndex()) != layer)) {
177 continue;
178 }
179 chip.addNoise(mROFrameMin, mROFrameMin, &mParams);
180 auto& buffer = chip.getPreDigits();
181 if (buffer.empty()) {
182 continue;
183 }
184 auto itBeg = buffer.begin();
185 auto iter = itBeg;
186 ULong64_t maxKey = chip.getOrderingKey(mROFrameMin + 1, 0, 0) - 1; // fetch digits with key below that
187 for (; iter != buffer.end(); ++iter) {
188 if (iter->first > maxKey) {
189 break; // is the digit ROFrame from the key > the max requested frame
190 }
191 auto& preDig = iter->second; // preDigit
192 if (preDig.charge >= (chip.isIB() ? mParams.getIBChargeThreshold() : mParams.getChargeThreshold())) {
193 int digID = mDigits->size();
194 mDigits->emplace_back(chip.getChipIndex(), preDig.row, preDig.col, preDig.charge);
195 mMCLabels->addElement(digID, preDig.labelRef.label);
196 auto& nextRef = preDig.labelRef; // extra contributors are in extra array
197 while (nextRef.next >= 0) {
198 nextRef = extra[nextRef.next];
199 mMCLabels->addElement(digID, nextRef.label);
200 }
201 }
202 }
203 buffer.erase(itBeg, iter);
204 }
205 // finalize ROF record
206 rcROF.setNEntries(mDigits->size() - rcROF.getFirstEntry()); // number of digits
207 if (isContinuous()) {
208 rcROF.getBCData().setFromLong(mIRFirstSampledTF.toLong() + mROFrameMin * mParams.getROFrameLengthInBC(layer));
209 } else {
210 rcROF.getBCData() = mEventTime; // RS TODO do we need to add trigger delay?
211 }
212 if (mROFRecords != nullptr) {
213 mROFRecords->push_back(rcROF);
214 }
215 extra.clear(); // clear container for extra digits of the mROFrameMin ROFrame
216 // and move it as a new slot in the end
217 mExtraBuff.emplace_back(mExtraBuff.front().release());
218 mExtraBuff.pop_front();
219 }
220}
221
222void Digitizer::processHit(const o2::itsmft::Hit& hit, uint32_t& maxFr, int evID, int srcID, int lay)
223{
224 // convert single hit to digits
225 auto chipID = hit.GetDetectorID();
226 auto& chip = mChips[chipID];
227 if (chip.isDisabled()) {
228 return;
229 }
230 float timeInROF = hit.GetTime() * sec2ns;
231 if (timeInROF > 20e3) {
232 const int maxWarn = 10;
233 static int warnNo = 0;
234 if (warnNo < maxWarn) {
235 LOG(warning) << "Ignoring hit with time_in_event = " << timeInROF << " ns"
236 << ((++warnNo < maxWarn) ? "" : " (suppressing further warnings)");
237 }
238 return;
239 }
240 if (isContinuous()) {
241 timeInROF += mCollisionTimeWrtROF;
242 }
243 if (mIsBeforeFirstRO && timeInROF < 0) {
244 // disregard this hit because it comes from an event before readout starts and it does not effect this RO
245 return;
246 }
247
248 // calculate RO Frame for this hit
249 if (timeInROF < 0) {
250 timeInROF = 0.;
251 }
252 float tTot = mParams.getSignalShape().getMaxDuration();
253 // frame of the hit signal start wrt event ROFrame
254 int roFrameRel = int(timeInROF * mParams.getROFrameLengthInv(lay));
255 // frame of the hit signal end wrt event ROFrame: in the triggered mode we read just 1 frame
256 uint32_t roFrameRelMax = mParams.isContinuous() ? (timeInROF + tTot) * mParams.getROFrameLengthInv(lay) : roFrameRel;
257 int nFrames = roFrameRelMax + 1 - roFrameRel;
258 uint32_t roFrameMax = mNewROFrame + roFrameRelMax;
259 maxFr = std::max(roFrameMax, maxFr); // if signal extends beyond current maxFrame, increase the latter
260
261 // here we start stepping in the depth of the sensor to generate charge diffision
262 const int layer = mGeometry->getLayer(chipID);
263 const auto& matrix = mGeometry->getMatrixL2G(chipID);
264 int nSteps = chip.isIB() ? mParams.getIBNSimSteps() : mParams.getNSimSteps();
265 float nStepsInv = chip.isIB() ? mParams.getIBNSimStepsInv() : mParams.getNSimStepsInv();
266 math_utils::Vector3D<float> xyzLocS, xyzLocE;
267 xyzLocS = matrix ^ (hit.GetPosStart()); // Global hit coordinates to local detector coordinates
268 xyzLocE = matrix ^ (hit.GetPos());
269 if (chip.isIB()) {
270 // transform the point on the curved surface to a flat one
271 float xFlatE{0.f}, yFlatE{0.f}, xFlatS{0.f}, yFlatS{0.f};
272 mIBSegmentations[layer].curvedToFlat(xyzLocS.X(), xyzLocS.Y(), xFlatS, yFlatS);
273 mIBSegmentations[layer].curvedToFlat(xyzLocE.X(), xyzLocE.Y(), xFlatE, yFlatE);
274 // update the local coordinates with the flattened ones
275 xyzLocS.SetXYZ(xFlatS, yFlatS, xyzLocS.Z());
276 xyzLocE.SetXYZ(xFlatE, yFlatE, xyzLocE.Z());
277 }
278
280 step -= xyzLocS;
281 step *= nStepsInv; // position increment at each step
282 // the electrons will be injected in the middle of each step
283 math_utils::Vector3D<float> stepH(step * 0.5);
284 xyzLocS += stepH; // Adjust start position to the middle of the first step
285 xyzLocE -= stepH; // Adjust end position to the middle of the last step
286 int rowS = -1, colS = -1, rowE = -1, colE = -1, nSkip = 0;
287 if (chip.isIB()) {
288 // get entrance pixel row and col
289 while (!mIBSegmentations[layer].localToDetector(xyzLocS.X(), xyzLocS.Z(), rowS, colS)) { // guard-ring ?
290 if (++nSkip >= nSteps) {
291 return; // did not enter to sensitive matrix
292 }
293 xyzLocS += step;
294 }
295 // get exit pixel row and col
296 while (!mIBSegmentations[layer].localToDetector(xyzLocE.X(), xyzLocE.Z(), rowE, colE)) { // guard-ring ?
297 if (++nSkip >= nSteps) {
298 return; // did not enter to sensitive matrix
299 }
300 xyzLocE -= step;
301 }
302 } else {
303 // get entrance pixel row and col
304 while (!SegmentationOB::localToDetector(xyzLocS.X(), xyzLocS.Z(), rowS, colS)) { // guard-ring ?
305 if (++nSkip >= nSteps) {
306 return; // did not enter to sensitive matrix
307 }
308 xyzLocS += step;
309 }
310 // get exit pixel row and col
311 while (!SegmentationOB::localToDetector(xyzLocE.X(), xyzLocE.Z(), rowE, colE)) { // guard-ring ?
312 if (++nSkip >= nSteps) {
313 return; // did not enter to sensitive matrix
314 }
315 xyzLocE -= step;
316 }
317 }
318
319 // estimate the limiting min/max row and col where the non-0 response is possible
320 if (rowS > rowE) {
321 std::swap(rowS, rowE);
322 }
323 if (colS > colE) {
324 std::swap(colS, colE);
325 }
326 rowS -= AlpideRespSimMat::NPix / 2;
327 rowE += AlpideRespSimMat::NPix / 2;
328 rowS = std::max(rowS, 0);
329
330 const int maxNrows{chip.isIB() ? SegmentationIB::NRows : SegmentationOB::NRows};
331 const int maxNcols{chip.isIB() ? SegmentationIB::NCols : SegmentationOB::NCols};
332
333 rowE = std::min(rowE, maxNrows - 1);
334 colS -= AlpideRespSimMat::NPix / 2;
335 colE += AlpideRespSimMat::NPix / 2;
336 colS = std::max(colS, 0);
337 colE = std::min(colE, maxNcols - 1);
338
339 int rowSpan = rowE - rowS + 1, colSpan = colE - colS + 1; // size of plaquet where some response is expected
340 float respMatrix[rowSpan][colSpan]; // response accumulated here
341 std::fill(&respMatrix[0][0], &respMatrix[0][0] + rowSpan * colSpan, 0.f);
342
343 float nElectrons = hit.GetEnergyLoss() * mParams.getEnergyToNElectrons(); // total number of deposited electrons
344 nElectrons *= nStepsInv; // N electrons injected per step
345 if (nSkip != 0) {
346 nSteps -= nSkip;
347 }
348 //
349 int rowPrev = -1, colPrev = -1, row, col;
350 float cRowPix = 0.f, cColPix = 0.f; // local coordinated of the current pixel center
351
352 // take into account that the AlpideSimResponse depth defintion has different min/max boundaries
353 // although the max should coincide with the surface of the epitaxial layer, which in the chip
354 // local coordinates has Y = +SensorLayerThickness/2
355 xyzLocS.SetY(xyzLocS.Y() + ((chip.isIB()) ? mSimRespIBShift : mSimRespOBShift));
356
357 // collect charge in evey pixel which might be affected by the hit
358 for (int iStep = nSteps; iStep--;) {
359 // Get the pixel ID
360 if (chip.isIB()) {
361 mIBSegmentations[layer].localToDetector(xyzLocS.X(), xyzLocS.Z(), row, col);
362 } else {
363 SegmentationOB::localToDetector(xyzLocS.X(), xyzLocS.Z(), row, col);
364 }
365 if (row != rowPrev || col != colPrev) { // update pixel and coordinates of its center
366 if (chip.isIB()) {
367 if (!mIBSegmentations[layer].detectorToLocal(row, col, cRowPix, cColPix)) {
368 continue;
369 }
370 } else if (!SegmentationOB::detectorToLocal(row, col, cRowPix, cColPix)) {
371 continue; // should not happen
372 }
373 rowPrev = row;
374 colPrev = col;
375 }
376 bool flipCol = false, flipRow = false;
377 // note that response needs coordinates along column row (locX) (locZ) then depth (locY)
378 float rowMax{}, colMax{};
379 const AlpideRespSimMat* rspmat{nullptr};
380 if (chip.isIB()) {
381 rowMax = 0.5f * SegmentationIB::PitchRow * mSimRespIBScaleX;
382 colMax = 0.5f * SegmentationIB::PitchCol * mSimRespIBScaleZ;
383 rspmat = mSimRespIB->getResponse(mSimRespIBScaleX * (xyzLocS.X() - cRowPix), mSimRespIBScaleZ * (xyzLocS.Z() - cColPix), xyzLocS.Y(), flipRow, flipCol, rowMax, colMax);
384 } else {
385 rowMax = 0.5f * SegmentationOB::PitchRow;
386 colMax = 0.5f * SegmentationOB::PitchCol;
387 rspmat = mSimRespOB->getResponse(xyzLocS.X() - cRowPix, xyzLocS.Z() - cColPix, xyzLocS.Y(), flipRow, flipCol, rowMax, colMax);
388 }
389
390 xyzLocS += step;
391 if (rspmat == nullptr) {
392 continue;
393 }
394
395 for (int irow = AlpideRespSimMat::NPix; irow--;) {
396 int rowDest = row + irow - AlpideRespSimMat::NPix / 2 - rowS; // destination row in the respMatrix
397 if (rowDest < 0 || rowDest >= rowSpan) {
398 continue;
399 }
400 for (int icol = AlpideRespSimMat::NPix; icol--;) {
401 int colDest = col + icol - AlpideRespSimMat::NPix / 2 - colS; // destination column in the respMatrix
402 if (colDest < 0 || colDest >= colSpan) {
403 continue;
404 }
405 respMatrix[rowDest][colDest] += rspmat->getValue(irow, icol, ((chip.isIB() && mSimRespIBOrientation) ? !flipRow : flipRow), flipCol);
406 }
407 }
408 }
409
410 // fire the pixels assuming Poisson(n_response_electrons)
411 o2::MCCompLabel lbl(hit.GetTrackID(), evID, srcID, false);
412 auto roFrameAbs = mNewROFrame + roFrameRel;
413 for (int irow = rowSpan; irow--;) {
414 uint16_t rowIS = irow + rowS;
415 for (int icol = colSpan; icol--;) {
416 float nEleResp = respMatrix[irow][icol];
417 if (nEleResp <= 1.e-36) {
418 continue;
419 }
420 int nEle = gRandom->Poisson(nElectrons * nEleResp); // total charge in given pixel
421 // ignore charge which have no chance to fire the pixel
422 if (nEle < (chip.isIB() ? mParams.getIBChargeThreshold() : mParams.getChargeThreshold())) {
423 continue;
424 }
425 uint16_t colIS = icol + colS;
426 registerDigits(chip, roFrameAbs, timeInROF, nFrames, rowIS, colIS, nEle, lbl, lay);
427 }
428 }
429}
430
431void Digitizer::registerDigits(o2::its3::ChipDigitsContainer& chip, uint32_t roFrame, float tInROF, int nROF,
432 uint16_t row, uint16_t col, int nEle, o2::MCCompLabel& lbl, int layer)
433{
434 // Register digits for given pixel, accounting for the possible signal contribution to
435 // multiple ROFrame. The signal starts at time tInROF wrt the start of provided roFrame
436 // In every ROFrame we check the collected signal during strobe
437
438 float tStrobe = mParams.getStrobeDelay(layer) - tInROF; // strobe start wrt signal start
439 for (int i = 0; i < nROF; i++) {
440 uint32_t roFr = roFrame + i;
441 int nEleROF = mParams.getSignalShape().getCollectedCharge(nEle, tStrobe, tStrobe + mParams.getStrobeLength(layer));
442 tStrobe += mParams.getROFrameLength(layer); // for the next ROF
443
444 // discard too small contributions, they have no chance to produce a digit
445 if (nEleROF < (chip.isIB() ? mParams.getIBChargeThreshold() : mParams.getChargeThreshold())) {
446 continue;
447 }
448 mEventROFrameMax = std::max(roFr, mEventROFrameMax);
449 mEventROFrameMin = std::min(roFr, mEventROFrameMin);
450 auto key = chip.getOrderingKey(roFr, row, col);
451 PreDigit* pd = chip.findDigit(key);
452 if (pd == nullptr) {
453 chip.addDigit(key, roFr, row, col, nEleROF, lbl);
454 } else { // there is already a digit at this slot, account as PreDigitExtra contribution
455 pd->charge += nEleROF;
456 if (pd->labelRef.label == lbl) { // don't store the same label twice
457 continue;
458 }
459 ExtraDig* extra = getExtraDigBuffer(roFr);
460 int& nxt = pd->labelRef.next;
461 bool skip = false;
462 while (nxt >= 0) {
463 if ((*extra)[nxt].label == lbl) { // don't store the same label twice
464 skip = true;
465 break;
466 }
467 nxt = (*extra)[nxt].next;
468 }
469 if (skip) {
470 continue;
471 }
472 // new predigit will be added in the end of the chain
473 nxt = extra->size();
474 extra->emplace_back(lbl);
475 }
476 }
477}
std::ostringstream debug
int32_t i
Definition of a container to keep Monte Carlo truth external to simulation objects.
uint32_t col
Definition RawData.h:4
Definition of the SegmentationAlpide class.
Definition of the ITS digitizer.
StringRef key
int GetTrackID() const
Definition BaseHits.h:30
V GetEnergyLoss() const
Definition BaseHits.h:103
math_utils::Point3D< T > GetPos() const
Definition BaseHits.h:67
E GetTime() const
Definition BaseHits.h:71
unsigned short GetDetectorID() const
Definition BaseHits.h:73
void addElement(uint32_t dataindex, TruthElement const &element, bool noElement=false)
const char * getName() const
const Mat3D & getMatrixL2G(int sensID) const
o2::its3::ChipSimResponse * getIBSimResponse() const
Definition DigiParams.h:51
bool hasResponseFunctions() const
Definition DigiParams.h:54
float getIBNSimStepsInv() const
Definition DigiParams.h:41
const o2::itsmft::AlpideSimResponse * getOBSimResponse() const
Definition DigiParams.h:48
int getIBChargeThreshold() const
Definition DigiParams.h:37
int getIBNSimSteps() const
Definition DigiParams.h:40
void print() const final
void fillOutputContainer(uint32_t maxFrame=0xffffffff, int layer=-1)
bool isContinuous() const
Definition Digitizer.h:66
void process(const std::vector< itsmft::Hit > *hits, int evID, int srcID, int layer)
Steer conversion of hits to digits.
Definition Digitizer.cxx:76
void setEventTime(const o2::InteractionTimeRecord &irt, int layer)
Segmentation and response for pixels in ITS3 upgrade.
static constexpr float PitchCol
static constexpr float PitchRow
int getLayer(int index) const final
Get chip layer, from 0.
float getCollectedCharge(float totalNEle, float tMin, float tMax) const
bool getResponse(float vRow, float vCol, float cDepth, AlpideRespSimMat &dest) const
void addDigit(ULong64_t key, UInt_t roframe, UShort_t row, UShort_t col, int charge, o2::MCCompLabel lbl)
o2::itsmft::PreDigit * findDigit(ULong64_t key)
static ULong64_t getOrderingKey(UInt_t roframe, UShort_t row, UShort_t col)
Get global ordering key made of readout frame, column and row.
float getStrobeDelay(int layer=-1) const
Definition DigiParams.h:64
float getROFrameLengthInv(int layer=-1) const
Definition DigiParams.h:61
const SignalShape & getSignalShape() const
Definition DigiParams.h:98
float getStrobeLength(int layer=-1) const
Definition DigiParams.h:67
float getEnergyToNElectrons() const
Definition DigiParams.h:87
int getROFrameLengthInBC(int layer=-1) const
Definition DigiParams.h:56
bool isContinuous() const
Definition DigiParams.h:54
int getChargeThreshold() const
Definition DigiParams.h:83
float getNSimStepsInv() const
Definition DigiParams.h:86
float getROFrameLength(int layer=-1) const
Definition DigiParams.h:60
int getNSimSteps() const
Definition DigiParams.h:85
Int_t getNumberOfChips() const
math_utils::Point3D< Float_t > GetPosStart() const
Definition Hit.h:60
bool isFullChipMasked(int chip) const
Definition NoiseMap.h:186
void setNEntries(int n)
Definition ROFRecord.h:48
const BCData & getBCData() const
Definition ROFRecord.h:58
void setFirstEntry(int idx)
Definition ROFRecord.h:47
int getFirstEntry() const
Definition ROFRecord.h:63
void setROFrame(ROFtype rof)
Definition ROFRecord.h:45
static constexpr float SensorLayerThickness
static bool localToDetector(float x, float z, int &iRow, int &iCol)
static constexpr float PitchCol
static constexpr float PitchRow
static bool detectorToLocal(L row, L col, T &xRow, T &zCol)
GLenum func
Definition glcorearb.h:778
GLuint buffer
Definition glcorearb.h:655
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
constexpr double LHCBunchSpacingNS
constexpr double thickness
Definition SpecsV2.h:124
value_T step
Definition TrackUtils.h:42
int64_t differenceInBC(const InteractionRecord &other) const
void setFromLong(int64_t l)
double timeInBCNS
time in NANOSECONDS relative to orbit/bc
int next
eventual next contribution to the same pixel
Definition PreDigit.h:36
o2::MCCompLabel label
hit label
Definition PreDigit.h:35
int charge
N electrons.
Definition PreDigit.h:46
PreDigitLabelRef labelRef
label and reference to the next one
Definition PreDigit.h:47
IR getFirstSampledTFIR() const
get TF and HB (abs) for this IR
Definition HBFUtils.h:74
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< int > row