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
17#include "ITS3Base/ITS3Params.h"
18#include "MathUtils/Cartesian.h"
21#include "ITS3Base/SpecsV2.h"
22#include "Framework/Logger.h"
23
24#include <TRandom.h>
25#include <algorithm>
26#include <vector>
27#include <numeric>
28
29using o2::itsmft::Hit;
34
35using namespace o2::its3;
36
38{
39 const int numOfChips = mGeometry->getNumberOfChips();
40 mChips.resize(numOfChips);
41 for (int i = numOfChips; i--;) {
42 mChips[i].setChipIndex(i);
43 if (mDeadChanMap != nullptr) {
44 mChips[i].disable(mDeadChanMap->isFullChipMasked(i));
45 mChips[i].setDeadChanMap(mDeadChanMap);
46 }
47 }
48
49 if (!mParams.hasResponseFunctions()) {
50 auto loadSetResponseFunc = [&](const char* fileIB, const char* nameIB, const char* fileOB, const char* nameOB) {
51 LOGP(info, "Loading response function IB={}:{} ; OB={}:{}", nameIB, fileIB, nameOB, fileOB);
52 auto fIB = TFile::Open(fileIB, "READ");
53 if (!fIB || fIB->IsZombie() || !fIB->IsOpen()) {
54 LOGP(fatal, "Cannot open file {}", fileIB);
55 }
56 auto fOB = TFile::Open(fileOB, "READ");
57 if (!fOB || fOB->IsZombie() || !fOB->IsOpen()) {
58 LOGP(fatal, "Cannot open file {}", fileOB);
59 }
60 mParams.setIBSimResponse(mSimRespIB = fIB->Get<o2::its3::ChipSimResponse>(nameIB));
61 mParams.setOBSimResponse(mSimRespOB = fOB->Get<o2::itsmft::AlpideSimResponse>(nameOB));
62 fIB->Close();
63 fOB->Close();
64 };
65
66 if (const auto& func = ITS3Params::Instance().chipResponseFunction; func == "Alpide") {
67 constexpr const char* responseFile = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
68 loadSetResponseFunc(responseFile, "response0", responseFile, "response0");
71 } else if (func == "APTS") {
72 constexpr const char* responseFileIB = "$(O2_ROOT)/share/Detectors/Upgrades/ITS3/data/ITS3ChipResponseData/APTSResponseData.root";
73 constexpr const char* responseFileOB = "$(O2_ROOT)/share/Detectors/ITSMFT/data/AlpideResponseData/AlpideResponseData.root";
74 loadSetResponseFunc(responseFileIB, "response1", responseFileOB, "response0");
75 mSimRespIBScaleX = constants::pixelarray::pixels::apts::pitchX / SegmentationIB::PitchRow;
76 mSimRespIBScaleZ = constants::pixelarray::pixels::apts::pitchZ / SegmentationIB::PitchCol;
77 mSimRespIBOrientation = true;
78 } else {
79 LOGP(fatal, "ResponseFunction '{}' not implemented!", func);
80 }
81 mSimRespIBShift = mSimRespIB->getDepthMax() - constants::silicon::thickness / 2.f;
82 mSimRespOBShift = mSimRespOB->getDepthMax() - SegmentationOB::SensorLayerThickness / 2.f;
83 }
84
85 mParams.print();
86 LOGP(info, "IB shift = {} ; OB shift = {}", mSimRespIBShift, mSimRespOBShift);
87 LOGP(info, "IB pixel scale on x = {} ; z = {}", mSimRespIBScaleX, mSimRespIBScaleZ);
88 LOGP(info, "IB response orientation: {}", mSimRespIBOrientation ? "flipped" : "normal");
90}
91
92void Digitizer::process(const std::vector<itsmft::Hit>* hits, int evID, int srcID)
93{
94 // digitize single event, the time must have been set beforehand
95
96 LOG(info) << "Digitizing " << mGeometry->getName() << " hits of entry " << evID << " from source "
97 << srcID << " at time " << mEventTime << " ROFrame = " << mNewROFrame << ")"
98 << " cont.mode: " << isContinuous()
99 << " Min/Max ROFrames " << mROFrameMin << "/" << mROFrameMax;
100
101 // is there something to flush ?
102 if (mNewROFrame > mROFrameMin) {
103 fillOutputContainer(mNewROFrame - 1); // flush out all frame preceding the new one
104 }
105
106 int nHits = hits->size();
107 std::vector<int> hitIdx(nHits);
108 std::iota(std::begin(hitIdx), std::end(hitIdx), 0);
109 // sort hits to improve memory access
110 std::sort(hitIdx.begin(), hitIdx.end(),
111 [hits](auto lhs, auto rhs) {
112 return (*hits)[lhs].GetDetectorID() < (*hits)[rhs].GetDetectorID();
113 });
114 for (int i : hitIdx) {
115 processHit((*hits)[i], mROFrameMax, evID, srcID);
116 }
117 // in the triggered mode store digits after every MC event
118 // TODO: in the real triggered mode this will not be needed, this is actually for the
119 // single event processing only
120 if (!mParams.isContinuous()) {
121 fillOutputContainer(mROFrameMax);
122 }
123}
124
126{
127 // assign event time in ns
128 mEventTime = irt;
129 if (!mParams.isContinuous()) {
130 mROFrameMin = 0; // in triggered mode reset the frame counters
131 mROFrameMax = 0;
132 }
133 // RO frame corresponding to provided time
134 mCollisionTimeWrtROF = mEventTime.timeInBCNS; // in triggered mode the ROF starts at BC (is there a delay?)
135 if (mParams.isContinuous()) {
136 auto nbc = mEventTime.differenceInBC(mIRFirstSampledTF);
137 if (mCollisionTimeWrtROF < 0 && nbc > 0) {
138 nbc--;
139 }
140 mNewROFrame = nbc / mParams.getROFrameLengthInBC();
141 // in continuous mode depends on starts of periodic readout frame
142 mCollisionTimeWrtROF += (nbc % mParams.getROFrameLengthInBC()) * 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)
158{
159 // fill output with digits from min.cached up to requested frame, generating the noise beforehand
160 if (frameLast > mROFrameMax) {
161 frameLast = mROFrameMax;
162 }
163 // make sure all buffers for extra digits are created up to the maxFrame
164 getExtraDigBuffer(mROFrameMax);
165
166 LOG(info) << "Filling " << mGeometry->getName() << " digits output for RO frames " << mROFrameMin << ":"
167 << frameLast;
168
170
171 // we have to write chips in RO increasing order, therefore have to loop over the frames here
172 for (; mROFrameMin <= frameLast; mROFrameMin++) {
173 rcROF.setROFrame(mROFrameMin);
174 rcROF.setFirstEntry(mDigits->size()); // start of current ROF in digits
175
176 auto& extra = *(mExtraBuff.front().get());
177 for (size_t iChip{0}; iChip < mChips.size(); ++iChip) {
178 auto& chip = mChips[iChip];
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());
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)
223{
224 // convert single hit to digits
225 int 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 // calculate RO Frame for this hit
244 if (timeInROF < 0) {
245 timeInROF = 0.;
246 }
247 float tTot = mParams.getSignalShape().getMaxDuration();
248 // frame of the hit signal start wrt event ROFrame
249 int roFrameRel = int(timeInROF * mParams.getROFrameLengthInv());
250 // frame of the hit signal end wrt event ROFrame: in the triggered mode we read just 1 frame
251 uint32_t roFrameRelMax = mParams.isContinuous() ? (timeInROF + tTot) * mParams.getROFrameLengthInv() : roFrameRel;
252 int nFrames = roFrameRelMax + 1 - roFrameRel;
253 uint32_t roFrameMax = mNewROFrame + roFrameRelMax;
254 if (roFrameMax > maxFr) {
255 maxFr = roFrameMax; // if signal extends beyond current maxFrame, increase the latter
256 }
257
258 // here we start stepping in the depth of the sensor to generate charge diffision
259 int detID{hit.GetDetectorID()};
260 int layer = mGeometry->getLayer(detID);
261 const auto& matrix = mGeometry->getMatrixL2G(detID);
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);
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)
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() - 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());
440 tStrobe += mParams.getROFrameLength(); // 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 if (roFr > mEventROFrameMax) {
447 mEventROFrameMax = roFr;
448 }
449 if (roFr < mEventROFrameMin) {
450 mEventROFrameMin = roFr;
451 }
452 auto key = chip.getOrderingKey(roFr, row, col);
453 PreDigit* pd = chip.findDigit(key);
454 if (pd == nullptr) {
455 chip.addDigit(key, roFr, row, col, nEleROF, lbl);
456 } else { // there is already a digit at this slot, account as PreDigitExtra contribution
457 pd->charge += nEleROF;
458 if (pd->labelRef.label == lbl) { // don't store the same label twice
459 continue;
460 }
461 ExtraDig* extra = getExtraDigBuffer(roFr);
462 int& nxt = pd->labelRef.next;
463 bool skip = false;
464 while (nxt >= 0) {
465 if ((*extra)[nxt].label == lbl) { // don't store the same label twice
466 skip = true;
467 break;
468 }
469 nxt = (*extra)[nxt].next;
470 }
471 if (skip) {
472 continue;
473 }
474 // new predigit will be added in the end of the chain
475 nxt = extra->size();
476 extra->emplace_back(lbl);
477 }
478 }
479}
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
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
bool hasResponseFunctions() const
Definition DigiParams.h:54
void setOBSimResponse(const o2::itsmft::AlpideSimResponse *response)
Definition DigiParams.h:49
float getIBNSimStepsInv() const
Definition DigiParams.h:41
int getIBChargeThreshold() const
Definition DigiParams.h:37
int getIBNSimSteps() const
Definition DigiParams.h:40
void setIBSimResponse(o2::its3::ChipSimResponse *response)
void print() const final
bool isContinuous() const
Definition Digitizer.h:64
void setEventTime(const o2::InteractionTimeRecord &irt)
void process(const std::vector< itsmft::Hit > *hits, int evID, int srcID)
Steer conversion of hits to digits.
Definition Digitizer.cxx:92
void fillOutputContainer(uint32_t maxFrame=0xffffffff)
Segmentation and response for pixels in ITS3 upgrade.
static constexpr float PitchCol
static constexpr float PitchRow
int getLayer(int index) const
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 getROFrameLengthInv() const
Definition DigiParams.h:59
const SignalShape & getSignalShape() const
Definition DigiParams.h:96
float getEnergyToNElectrons() const
Definition DigiParams.h:85
int getROFrameLengthInBC() const
Definition DigiParams.h:54
float getStrobeDelay() const
Definition DigiParams.h:62
bool isContinuous() const
Definition DigiParams.h:52
int getChargeThreshold() const
Definition DigiParams.h:81
float getNSimStepsInv() const
Definition DigiParams.h:84
float getROFrameLength() const
Definition DigiParams.h:58
int getNSimSteps() const
Definition DigiParams.h:83
float getStrobeLength() const
Definition DigiParams.h:65
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:123
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