244 unsigned revo9cnt = 0;
248 revo9cnt = gRandom->Integer(11520);
252 double SSTfrac = (revo9cnt % 6) / 6.0;
255 int offsetWindows =
m_feSetting->getWindowShift(revo9cnt);
259 int SSTcnt = revo9cnt / 6;
260 int refWindow = SSTcnt * 2;
261 const auto& writeDepths =
m_feSetting->getWriteDepths();
262 if (writeDepths.empty()) {
263 B2ERROR(
"TOPDigitzer: vector of write depths is empty. No digitization possible");
266 int lastDepth = writeDepths.back();
268 for (
auto depth : writeDepths) {
270 if (SSTcnt < 0)
break;
272 refWindow = SSTcnt * 2;
275 unsigned storageDepth = lastDepth * 2;
279 int lookBackWindows =
m_feSetting->getLookbackWindows();
282 int window = refWindow - lookBackWindows;
283 if (window < 0) window += storageDepth;
291 double timeMax = geo->getSignalShape().getTMax() +
298 double electronicEfficiency = geo->getNominalTDC().getEfficiency();
301 std::map<unsigned, TimeDigitizer> pixels;
302 typedef std::map<unsigned, TimeDigitizer>::iterator
Iterator;
309 if (gRandom->Rndm() > electronicEfficiency)
continue;
312 double x = simHit.getX();
313 double y = simHit.getY();
314 int pmtID = simHit.getPmtID();
315 int moduleID = simHit.getModuleID();
316 if (not geo->isModuleIDValid(moduleID))
continue;
317 int pixelID = geo->getModule(moduleID).getPMTArray().getPixelID(x, y, pmtID);
318 if (pixelID == 0)
continue;
321 double time = simHit.getTime() + startTimeJitter;
324 time += tts.generateTTS();
328 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID,
true);
331 if (time + timeOffset.value < timeMin + timeOffset.timeShift)
continue;
332 if (time + timeOffset.value > timeMax + timeOffset.timeShift)
continue;
336 auto hitType = TimeDigitizer::c_Hit;
339 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
341 if (not digitizer.isValid())
continue;
342 unsigned id = digitizer.getUniqueID();
343 Iterator it = pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer)).first;
344 it->second.addTimeOfHit(time, pulseHeight, hitType, &simHit);
350 auto moduleID = simCalPulses.getModuleID();
351 auto pixelID = simCalPulses.getPixelID();
352 auto pulseHeight = simCalPulses.getAmplitude();
353 auto time = simCalPulses.getTime();
354 auto hitType = TimeDigitizer::c_CalPulse;
357 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
360 if (time + timeOffset.value < timeMin + timeOffset.timeShift)
continue;
361 if (time + timeOffset.value > timeMax + timeOffset.timeShift)
continue;
364 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
366 if (not digitizer.isValid())
continue;
367 unsigned id = digitizer.getUniqueID();
368 Iterator it = pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer)).first;
369 it->second.addTimeOfHit(time, pulseHeight, hitType);
375 int numModules = geo->getNumModules();
376 for (
int moduleID = 1; moduleID <= numModules; moduleID++) {
377 int numPixels = geo->getModule(moduleID).getPMTArray().getNumPixels();
379 for (
int i = 0; i < numHits; i++) {
380 int pixelID = int(gRandom->Rndm() * numPixels) + 1;
381 double time = (timeMax - timeMin) * gRandom->Rndm() + timeMin;
383 auto hitType = TimeDigitizer::c_Hit;
384 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
385 time += timeOffset.timeShift;
386 time -= timeOffset.value;
387 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
389 if (not digitizer.isValid())
continue;
390 unsigned id = digitizer.getUniqueID();
391 Iterator it = pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer)).first;
392 it->second.addTimeOfHit(time, pulseHeight, hitType);
400 int numModules = geo->getNumModules();
401 for (
int moduleID = 1; moduleID <= numModules; moduleID++) {
402 int numPixels = geo->getModule(moduleID).getPMTArray().getNumPixels();
403 for (
int pixelID = 1; pixelID <= numPixels; pixelID++) {
404 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
405 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
407 if (not digitizer.isValid())
continue;
408 unsigned id = digitizer.getUniqueID();
409 pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer));
417 for (
auto& pixel : pixels) {
418 auto& digitizer = pixel.second;
419 const auto* sampleTimes =
m_timebases->getSampleTimes(digitizer.getScrodID(),
420 digitizer.getChannel());
421 if (not sampleTimes)
continue;
422 if (sampleTimes->isCalibrated()) digitizer.setSampleTimes(sampleTimes);
429 for (
auto& pixel : pixels) {
430 auto& digitizer = pixel.second;
431 auto moduleID = digitizer.getModuleID();
432 auto channel = digitizer.getChannel();
433 auto rmsNoise =
m_noises->getNoise(moduleID, channel);
435 digitizer.setNoise(rmsNoise);
442 for (
const auto& pixel : pixels) {
443 const auto& digitizer = pixel.second;
446 threshold =
m_thresholds->getThr(digitizer.getModuleID(), digitizer.getChannel());
461 rawDigit.setRevo9Counter(revo9cnt);
462 rawDigit.setPhase(phase);
463 rawDigit.setLastWriteAddr(refWindow);
464 rawDigit.setLookBackWindows(lookBackWindows);
465 rawDigit.setOfflineFlag();
469 waveform.setRevo9Counter(revo9cnt);
470 waveform.setOffsetWindows(offsetWindows);
477 if (
m_channelT0->isCalibrated(digit.getModuleID(), digit.getChannel())) {
478 digit.addStatus(TOPDigit::c_ChannelT0Calibrated);
480 if (
m_moduleT0->isCalibrated(digit.getModuleID())) {
481 digit.addStatus(TOPDigit::c_ModuleT0Calibrated);
484 digit.addStatus(TOPDigit::c_CommonT0Calibrated);
493 digit.setHitQuality(TOPDigit::c_Junk);