212 if (waveform and rawDigit.getStorageWindows().empty()) {
213 rawDigit.setStorageWindows(waveform->getStorageWindows());
221 std::vector<unsigned short> masks(64, 0xFFFF);
223 auto scrodID = eventDebug.getScrodID();
224 const auto* feemap = feMapper.getMap(scrodID);
226 B2WARNING(
"TOPRawDigitConverter: No front-end map available."
227 <<
LogVar(
"scrodID", scrodID));
230 auto moduleID = feemap->getModuleID();
231 auto boardstack = feemap->getBoardstackNumber();
232 unsigned bs = (moduleID - 1) * 4 + boardstack;
234 masks[bs] = eventDebug.getAsicMask();
236 B2ERROR(
"TOPRawDigitConverter: Invalid global boardstack number."
247 if (rawDigit.getErrorFlags() != 0)
continue;
251 auto scrodID = rawDigit.getScrodID();
252 const auto* feemap = feMapper.getMap(scrodID);
254 B2WARNING(
"TOPRawDigitConverter: No front-end map available."
255 <<
LogVar(
"scrodID", scrodID));
258 auto moduleID = feemap->getModuleID();
259 auto boardstack = feemap->getBoardstackNumber();
260 auto channel = chMapper.getChannel(boardstack,
261 rawDigit.getCarrierNumber(),
262 rawDigit.getASICNumber(),
263 rawDigit.getASICChannel());
264 auto pixelID = chMapper.getPixelID(channel);
268 double rawTimeLeading = rawDigit.getCFDLeadingTime();
269 double rawTimeFalling = rawDigit.getCFDFallingTime();
273 int window = rawDigit.getASICWindow();
277 double timeOffset = 0;
282 rawTimeLeading = rawDigit.correctTime(rawTimeLeading,
m_storageDepth);
283 rawTimeFalling = rawDigit.correctTime(rawTimeFalling,
m_storageDepth);
286 int lastWriteAddr = rawDigit.getLastWriteAddr();
287 int nback = lastWriteAddr - window;
289 int lookBackWindows =
m_feSetting->getLookbackWindows();
291 int nwin = lookBackWindows - nback;
302 int revo9cnt = rawDigit.getRevo9Counter();
303 int SSTcnt = revo9cnt / 6;
304 double SSTfrac = (revo9cnt % 6) / 6.0;
309 int refWindow = SSTcnt * 2;
310 const auto& writeDepths =
m_feSetting->getWriteDepths();
311 if (writeDepths.empty()) {
312 B2ERROR(
"TOPRawDigitConverter: vector of write depths is empty. Return!");
315 int lastDepth = writeDepths.back();
317 for (
auto depth : writeDepths) {
319 if (SSTcnt < 0)
break;
321 refWindow = SSTcnt * 2;
325 storageDepth = lastDepth * 2;
327 if (window >= storageDepth) {
328 B2WARNING(
"TOPRawDigitConverter: window number greater than storage depth."
329 <<
LogVar(
"window number", window)
330 <<
LogVar(
"storage depth", storageDepth)
331 <<
LogVar(
"refWindow", refWindow)
332 <<
LogVar(
"phase", phase));
337 int deltaWindow = window - refWindow;
338 if (deltaWindow > 0) deltaWindow -= storageDepth;
339 int lookBackWindows =
m_feSetting->getLookbackWindows();
343 int nwin = lookBackWindows + deltaWindow;
344 int startWindow = refWindow - lookBackWindows;
345 if (startWindow < 0) startWindow += storageDepth;
346 window = startWindow;
355 unsigned short statusBits = 0;
358 sampleTimes =
m_timebase->getSampleTimes(scrodID, channel % 128);
359 if (sampleTimes->isCalibrated()) {
360 statusBits |= TOPDigit::c_TimeBaseCalibrated;
364 double time = sampleTimes->getTime(window, rawTimeLeading) - timeOffset;
365 double width = sampleTimes->getDeltaTime(window, rawTimeFalling, rawTimeLeading);
368 double timeError = geo->getNominalTDC().getTimeJitter();
372 time -= geo->getNominalTDC().getOffset();
373 statusBits |= TOPDigit::c_OffsetSubtracted;
378 if (
m_noises->isCalibrated(moduleID, channel)) {
379 rmsNoise =
m_noises->getNoise(moduleID, channel);
381 double rawErr = rawDigit.getCFDLeadingTimeError(rmsNoise);
382 int sample =
static_cast<int>(rawTimeLeading);
383 if (rawTimeLeading < 0) sample--;
384 timeError = rawErr * sampleTimes->getTimeBin(window, sample);
387 auto pulseHeight = rawDigit.getValuePeak();
388 double timeErrorSq = timeError * timeError;
398 if (cal->isCalibrated(moduleID, channel)) {
399 time -= cal->getT0(moduleID, channel);
400 double err = cal->getT0Error(moduleID, channel);
401 timeErrorSq += err * err;
402 statusBits |= TOPDigit::c_ChannelT0Calibrated;
406 auto asic = channel / 8;
413 if (cal->isCalibrated(moduleID)) {
414 time -= cal->getT0(moduleID);
415 double err = cal->getT0Error(moduleID);
416 timeErrorSq += err * err;
417 statusBits |= TOPDigit::c_ModuleT0Calibrated;
422 if (cal->isCalibrated()) {
423 time -= cal->getT0();
424 double err = cal->getT0Error();
425 timeErrorSq += err * err;
426 statusBits |= TOPDigit::c_CommonT0Calibrated;
429 timeError =
sqrt(timeErrorSq);
434 auto* digit =
m_digits.appendNew(moduleID, pixelID, rawTimeLeading);
435 digit->setTime(time);
436 digit->setTimeError(timeError);
437 digit->setPulseHeight(rawDigit.getValuePeak());
438 digit->setIntegral(rawDigit.getIntegral());
439 digit->setPulseWidth(width);
440 digit->setChannel(channel);
441 digit->setFirstWindow(window);
442 digit->setStatus(statusBits);
445 if (not rawDigit.isFEValid() or rawDigit.isPedestalJump())
446 digit->setHitQuality(TOPDigit::c_Junk);
447 if (rawDigit.isAtWindowDiscontinuity(storageDepth))
448 digit->setHitQuality(TOPDigit::c_Junk);
452 digit->setHitQuality(TOPDigit::c_Junk);
458 if (calibrationChannel < 8) {
460 if (digit.getHitQuality() != TOPDigit::c_Good)
continue;
461 if (digit.getASICChannel() != calibrationChannel)
continue;
470 digit.setHitQuality(TOPDigit::c_CalPulse);