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 mROFsWrtFirstRO = std::floor(float(nbc) / mParams.getROFrameLengthInBC(layer));
132 if (nbc < 0) {
133 mNewROFrame = 0;
134 } else {
135 mNewROFrame = nbc / mParams.getROFrameLengthInBC(layer);
136 }
137 LOG(debug) << " NewROFrame " << mNewROFrame << " nbc " << nbc << " ROFsWrtFirstRO " << mROFsWrtFirstRO;
138
139 // in continuous mode depends on starts of periodic readout frame
140 mCollisionTimeWrtROF += (nbc % mParams.getROFrameLengthInBC(layer)) * o2::constants::lhc::LHCBunchSpacingNS;
141 } else {
142 mNewROFrame = 0;
143 }
144
145 if (mNewROFrame < mROFrameMin) {
146 LOG(error) << "New ROFrame " << mNewROFrame << " (" << irt << ") precedes currently cashed " << mROFrameMin;
147 throw std::runtime_error("deduced ROFrame precedes already processed one");
148 }
149
150 if (mParams.isContinuous() && mROFrameMax < mNewROFrame) {
151 mROFrameMax = mNewROFrame - 1; // all frames up to this are finished
152 }
153}
154
155void Digitizer::fillOutputContainer(uint32_t frameLast, int layer)
156{
157 // fill output with digits from min.cached up to requested frame, generating the noise beforehand
158 frameLast = std::min(frameLast, mROFrameMax);
159 // make sure all buffers for extra digits are created up to the maxFrame
160 getExtraDigBuffer(mROFrameMax);
161
162 LOG(info) << "Filling IT3 digits output on layer " << layer << " for RO frames " << mROFrameMin << ":" << frameLast;
163
165
166 // we have to write chips in RO increasing order, therefore have to loop over the frames here
167 for (; mROFrameMin <= frameLast; mROFrameMin++) {
168 rcROF.setROFrame(mROFrameMin);
169 rcROF.setFirstEntry(mDigits->size()); // start of current ROF in digits
170
171 auto& extra = *(mExtraBuff.front().get());
172 for (size_t iChip{0}; iChip < mChips.size(); ++iChip) {
173 auto& chip = mChips[iChip];
174 if (chip.isDisabled() || (layer >= 0 && mGeometry->getLayer(chip.getChipIndex()) != layer)) {
175 continue;
176 }
177 chip.addNoise(mROFrameMin, mROFrameMin, &mParams);
178 auto& buffer = chip.getPreDigits();
179 if (buffer.empty()) {
180 continue;
181 }
182 auto itBeg = buffer.begin();
183 auto iter = itBeg;
184 ULong64_t maxKey = chip.getOrderingKey(mROFrameMin + 1, 0, 0) - 1; // fetch digits with key below that
185 for (; iter != buffer.end(); ++iter) {
186 if (iter->first > maxKey) {
187 break; // is the digit ROFrame from the key > the max requested frame
188 }
189 auto& preDig = iter->second; // preDigit
190 if (preDig.charge >= (chip.isIB() ? mParams.getIBChargeThreshold() : mParams.getChargeThreshold())) {
191 int digID = mDigits->size();
192 mDigits->emplace_back(chip.getChipIndex(), preDig.row, preDig.col, preDig.charge);
193 mMCLabels->addElement(digID, preDig.labelRef.label);
194 auto& nextRef = preDig.labelRef; // extra contributors are in extra array
195 while (nextRef.next >= 0) {
196 nextRef = extra[nextRef.next];
197 mMCLabels->addElement(digID, nextRef.label);
198 }
199 }
200 }
201 buffer.erase(itBeg, iter);
202 }
203 // finalize ROF record
204 rcROF.setNEntries(mDigits->size() - rcROF.getFirstEntry()); // number of digits
205 if (isContinuous()) {
206 rcROF.getBCData().setFromLong(mIRFirstSampledTF.toLong() + mROFrameMin * mParams.getROFrameLengthInBC(layer));
207 } else {
208 rcROF.getBCData() = mEventTime; // RS TODO do we need to add trigger delay?
209 }
210 if (mROFRecords != nullptr) {
211 mROFRecords->push_back(rcROF);
212 }
213 extra.clear(); // clear container for extra digits of the mROFrameMin ROFrame
214 // and move it as a new slot in the end
215 mExtraBuff.emplace_back(mExtraBuff.front().release());
216 mExtraBuff.pop_front();
217 }
218}
219
220void Digitizer::processHit(const o2::itsmft::Hit& hit, uint32_t& maxFr, int evID, int srcID, int lay)
221{
222 // convert single hit to digits
223 auto chipID = hit.GetDetectorID();
224 auto& chip = mChips[chipID];
225 if (chip.isDisabled()) {
226 return;
227 }
228 float timeInROF = hit.GetTime() * sec2ns;
229 if (timeInROF > 20e3) {
230 const int maxWarn = 10;
231 static int warnNo = 0;
232 if (warnNo < maxWarn) {
233 LOG(warning) << "Ignoring hit with time_in_event = " << timeInROF << " ns"
234 << ((++warnNo < maxWarn) ? "" : " (suppressing further warnings)");
235 }
236 return;
237 }
238 if (isContinuous()) {
239 timeInROF += mCollisionTimeWrtROF;
240 }
241 if (mROFsWrtFirstRO < -1 || (mROFsWrtFirstRO == -1 && timeInROF < 0)) {
242 // disregard this hit because it comes from an event before readout starts and it does not effect this RO
243 return;
244 }
245
246 // calculate RO Frame for this hit
247 if (timeInROF < 0) {
248 timeInROF = 0.;
249 }
250 float tTot = mParams.getSignalShape().getMaxDuration();
251 // frame of the hit signal start wrt event ROFrame
252 int roFrameRel = int(timeInROF * mParams.getROFrameLengthInv(lay));
253 // frame of the hit signal end wrt event ROFrame: in the triggered mode we read just 1 frame
254 uint32_t roFrameRelMax = mParams.isContinuous() ? (timeInROF + tTot) * mParams.getROFrameLengthInv(lay) : roFrameRel;
255 int nFrames = roFrameRelMax + 1 - roFrameRel;
256 uint32_t roFrameMax = mNewROFrame + roFrameRelMax;
257 maxFr = std::max(roFrameMax, maxFr); // if signal extends beyond current maxFrame, increase the latter
258
259 // here we start stepping in the depth of the sensor to generate charge diffision
260 const int layer = mGeometry->getLayer(chipID);
261 const auto& matrix = mGeometry->getMatrixL2G(chipID);
262 int nSteps = chip.isIB() ? mParams.getIBNSimSteps() : mParams.getNSimSteps();
263 float nStepsInv = chip.isIB() ? mParams.getIBNSimStepsInv() : mParams.getNSimStepsInv();
264 math_utils::Vector3D<float> xyzLocS, xyzLocE;
265 xyzLocS = matrix ^ (hit.GetPosStart()); // Global hit coordinates to local detector coordinates
266 xyzLocE = matrix ^ (hit.GetPos());
267 if (chip.isIB()) {
268 // transform the point on the curved surface to a flat one
269 float xFlatE{0.f}, yFlatE{0.f}, xFlatS{0.f}, yFlatS{0.f};
270 mIBSegmentations[layer].curvedToFlat(xyzLocS.X(), xyzLocS.Y(), xFlatS, yFlatS);
271 mIBSegmentations[layer].curvedToFlat(xyzLocE.X(), xyzLocE.Y(), xFlatE, yFlatE);
272 // update the local coordinates with the flattened ones
273 xyzLocS.SetXYZ(xFlatS, yFlatS, xyzLocS.Z());
274 xyzLocE.SetXYZ(xFlatE, yFlatE, xyzLocE.Z());
275 }
276
278 step -= xyzLocS;
279 step *= nStepsInv; // position increment at each step
280 // the electrons will be injected in the middle of each step
281 math_utils::Vector3D<float> stepH(step * 0.5);
282 xyzLocS += stepH; // Adjust start position to the middle of the first step
283 xyzLocE -= stepH; // Adjust end position to the middle of the last step
284 int rowS = -1, colS = -1, rowE = -1, colE = -1, nSkip = 0;
285 if (chip.isIB()) {
286 // get entrance pixel row and col
287 while (!mIBSegmentations[layer].localToDetector(xyzLocS.X(), xyzLocS.Z(), rowS, colS)) { // guard-ring ?
288 if (++nSkip >= nSteps) {
289 return; // did not enter to sensitive matrix
290 }
291 xyzLocS += step;
292 }
293 // get exit pixel row and col
294 while (!mIBSegmentations[layer].localToDetector(xyzLocE.X(), xyzLocE.Z(), rowE, colE)) { // guard-ring ?
295 if (++nSkip >= nSteps) {
296 return; // did not enter to sensitive matrix
297 }
298 xyzLocE -= step;
299 }
300 } else {
301 // get entrance pixel row and col
302 while (!SegmentationOB::localToDetector(xyzLocS.X(), xyzLocS.Z(), rowS, colS)) { // guard-ring ?
303 if (++nSkip >= nSteps) {
304 return; // did not enter to sensitive matrix
305 }
306 xyzLocS += step;
307 }
308 // get exit pixel row and col
309 while (!SegmentationOB::localToDetector(xyzLocE.X(), xyzLocE.Z(), rowE, colE)) { // guard-ring ?
310 if (++nSkip >= nSteps) {
311 return; // did not enter to sensitive matrix
312 }
313 xyzLocE -= step;
314 }
315 }
316
317 // estimate the limiting min/max row and col where the non-0 response is possible
318 if (rowS > rowE) {
319 std::swap(rowS, rowE);
320 }
321 if (colS > colE) {
322 std::swap(colS, colE);
323 }
324 rowS -= AlpideRespSimMat::NPix / 2;
325 rowE += AlpideRespSimMat::NPix / 2;
326 rowS = std::max(rowS, 0);
327
328 const int maxNrows{chip.isIB() ? SegmentationIB::NRows : SegmentationOB::NRows};
329 const int maxNcols{chip.isIB() ? SegmentationIB::NCols : SegmentationOB::NCols};
330
331 rowE = std::min(rowE, maxNrows - 1);
332 colS -= AlpideRespSimMat::NPix / 2;
333 colE += AlpideRespSimMat::NPix / 2;
334 colS = std::max(colS, 0);
335 colE = std::min(colE, maxNcols - 1);
336
337 int rowSpan = rowE - rowS + 1, colSpan = colE - colS + 1; // size of plaquet where some response is expected
338 float respMatrix[rowSpan][colSpan]; // response accumulated here
339 std::fill(&respMatrix[0][0], &respMatrix[0][0] + rowSpan * colSpan, 0.f);
340
341 float nElectrons = hit.GetEnergyLoss() * mParams.getEnergyToNElectrons(); // total number of deposited electrons
342 nElectrons *= nStepsInv; // N electrons injected per step
343 if (nSkip != 0) {
344 nSteps -= nSkip;
345 }
346 //
347 int rowPrev = -1, colPrev = -1, row, col;
348 float cRowPix = 0.f, cColPix = 0.f; // local coordinated of the current pixel center
349
350 // take into account that the AlpideSimResponse depth defintion has different min/max boundaries
351 // although the max should coincide with the surface of the epitaxial layer, which in the chip
352 // local coordinates has Y = +SensorLayerThickness/2
353 xyzLocS.SetY(xyzLocS.Y() + ((chip.isIB()) ? mSimRespIBShift : mSimRespOBShift));
354
355 // collect charge in evey pixel which might be affected by the hit
356 for (int iStep = nSteps; iStep--;) {
357 // Get the pixel ID
358 if (chip.isIB()) {
359 mIBSegmentations[layer].localToDetector(xyzLocS.X(), xyzLocS.Z(), row, col);
360 } else {
361 SegmentationOB::localToDetector(xyzLocS.X(), xyzLocS.Z(), row, col);
362 }
363 if (row != rowPrev || col != colPrev) { // update pixel and coordinates of its center
364 if (chip.isIB()) {
365 if (!mIBSegmentations[layer].detectorToLocal(row, col, cRowPix, cColPix)) {
366 continue;
367 }
368 } else if (!SegmentationOB::detectorToLocal(row, col, cRowPix, cColPix)) {
369 continue; // should not happen
370 }
371 rowPrev = row;
372 colPrev = col;
373 }
374 bool flipCol = false, flipRow = false;
375 // note that response needs coordinates along column row (locX) (locZ) then depth (locY)
376 float rowMax{}, colMax{};
377 const AlpideRespSimMat* rspmat{nullptr};
378 if (chip.isIB()) {
379 rowMax = 0.5f * SegmentationIB::PitchRow * mSimRespIBScaleX;
380 colMax = 0.5f * SegmentationIB::PitchCol * mSimRespIBScaleZ;
381 rspmat = mSimRespIB->getResponse(mSimRespIBScaleX * (xyzLocS.X() - cRowPix), mSimRespIBScaleZ * (xyzLocS.Z() - cColPix), xyzLocS.Y(), flipRow, flipCol, rowMax, colMax);
382 } else {
383 rowMax = 0.5f * SegmentationOB::PitchRow;
384 colMax = 0.5f * SegmentationOB::PitchCol;
385 rspmat = mSimRespOB->getResponse(xyzLocS.X() - cRowPix, xyzLocS.Z() - cColPix, xyzLocS.Y(), flipRow, flipCol, rowMax, colMax);
386 }
387
388 xyzLocS += step;
389 if (rspmat == nullptr) {
390 continue;
391 }
392
393 for (int irow = AlpideRespSimMat::NPix; irow--;) {
394 int rowDest = row + irow - AlpideRespSimMat::NPix / 2 - rowS; // destination row in the respMatrix
395 if (rowDest < 0 || rowDest >= rowSpan) {
396 continue;
397 }
398 for (int icol = AlpideRespSimMat::NPix; icol--;) {
399 int colDest = col + icol - AlpideRespSimMat::NPix / 2 - colS; // destination column in the respMatrix
400 if (colDest < 0 || colDest >= colSpan) {
401 continue;
402 }
403 respMatrix[rowDest][colDest] += rspmat->getValue(irow, icol, ((chip.isIB() && mSimRespIBOrientation) ? !flipRow : flipRow), flipCol);
404 }
405 }
406 }
407
408 // fire the pixels assuming Poisson(n_response_electrons)
409 o2::MCCompLabel lbl(hit.GetTrackID(), evID, srcID, false);
410 auto roFrameAbs = mNewROFrame + roFrameRel;
411 for (int irow = rowSpan; irow--;) {
412 uint16_t rowIS = irow + rowS;
413 for (int icol = colSpan; icol--;) {
414 float nEleResp = respMatrix[irow][icol];
415 if (nEleResp <= 1.e-36) {
416 continue;
417 }
418 int nEle = gRandom->Poisson(nElectrons * nEleResp); // total charge in given pixel
419 // ignore charge which have no chance to fire the pixel
420 if (nEle < (chip.isIB() ? mParams.getIBChargeThreshold() : mParams.getChargeThreshold())) {
421 continue;
422 }
423 uint16_t colIS = icol + colS;
424 registerDigits(chip, roFrameAbs, timeInROF, nFrames, rowIS, colIS, nEle, lbl, lay);
425 }
426 }
427}
428
429void Digitizer::registerDigits(o2::its3::ChipDigitsContainer& chip, uint32_t roFrame, float tInROF, int nROF,
430 uint16_t row, uint16_t col, int nEle, o2::MCCompLabel& lbl, int layer)
431{
432 // Register digits for given pixel, accounting for the possible signal contribution to
433 // multiple ROFrame. The signal starts at time tInROF wrt the start of provided roFrame
434 // In every ROFrame we check the collected signal during strobe
435
436 float tStrobe = mParams.getStrobeDelay(layer) - tInROF; // strobe start wrt signal start
437 for (int i = 0; i < nROF; i++) {
438 uint32_t roFr = roFrame + i;
439 int nEleROF = mParams.getSignalShape().getCollectedCharge(nEle, tStrobe, tStrobe + mParams.getStrobeLength(layer));
440 tStrobe += mParams.getROFrameLength(layer); // for the next ROF
441
442 // discard too small contributions, they have no chance to produce a digit
443 if (nEleROF < (chip.isIB() ? mParams.getIBChargeThreshold() : mParams.getChargeThreshold())) {
444 continue;
445 }
446 mEventROFrameMax = std::max(roFr, mEventROFrameMax);
447 mEventROFrameMin = std::min(roFr, mEventROFrameMin);
448 auto key = chip.getOrderingKey(roFr, row, col);
449 PreDigit* pd = chip.findDigit(key);
450 if (pd == nullptr) {
451 chip.addDigit(key, roFr, row, col, nEleROF, lbl);
452 } else { // there is already a digit at this slot, account as PreDigitExtra contribution
453 pd->charge += nEleROF;
454 if (pd->labelRef.label == lbl) { // don't store the same label twice
455 continue;
456 }
457 ExtraDig* extra = getExtraDigBuffer(roFr);
458 int& nxt = pd->labelRef.next;
459 bool skip = false;
460 while (nxt >= 0) {
461 if ((*extra)[nxt].label == lbl) { // don't store the same label twice
462 skip = true;
463 break;
464 }
465 nxt = (*extra)[nxt].next;
466 }
467 if (skip) {
468 continue;
469 }
470 // new predigit will be added in the end of the chain
471 nxt = extra->size();
472 extra->emplace_back(lbl);
473 }
474 }
475}
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