241 unsigned revo9cnt = 0;
245 revo9cnt = gRandom->Integer(11520);
249 double SSTfrac = (revo9cnt % 6) / 6.0;
252 int offsetWindows =
m_feSetting->getWindowShift(revo9cnt);
256 int SSTcnt = revo9cnt / 6;
257 int refWindow = SSTcnt * 2;
258 const auto& writeDepths =
m_feSetting->getWriteDepths();
259 if (writeDepths.empty()) {
260 B2ERROR(
"TOPDigitzer: vector of write depths is empty. No digitization possible");
263 int lastDepth = writeDepths.back();
265 for (
auto depth : writeDepths) {
267 if (SSTcnt < 0)
break;
269 refWindow = SSTcnt * 2;
272 unsigned storageDepth = lastDepth * 2;
276 int lookBackWindows =
m_feSetting->getLookbackWindows();
279 int window = refWindow - lookBackWindows;
280 if (window < 0) window += storageDepth;
288 double timeMax = geo->getSignalShape().getTMax() +
295 double electronicEfficiency = geo->getNominalTDC().getEfficiency();
298 std::map<unsigned, TimeDigitizer> pixels;
299 typedef std::map<unsigned, TimeDigitizer>::iterator
Iterator;
306 if (gRandom->Rndm() > electronicEfficiency)
continue;
309 double x = simHit.getX();
310 double y = simHit.getY();
311 int pmtID = simHit.getPmtID();
312 int moduleID = simHit.getModuleID();
313 if (not geo->isModuleIDValid(moduleID))
continue;
314 int pixelID = geo->getModule(moduleID).getPMTArray().getPixelID(x, y, pmtID);
315 if (pixelID == 0)
continue;
318 double time = simHit.getTime() + startTimeJitter;
321 time += tts.generateTTS();
325 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
328 if (time + timeOffset.value < timeMin + timeOffset.timeShift)
continue;
329 if (time + timeOffset.value > timeMax + timeOffset.timeShift)
continue;
333 auto hitType = TimeDigitizer::c_Hit;
336 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
338 if (not digitizer.isValid())
continue;
339 unsigned id = digitizer.getUniqueID();
340 Iterator it = pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer)).first;
341 it->second.addTimeOfHit(time, pulseHeight, hitType, &simHit);
347 auto moduleID = simCalPulses.getModuleID();
348 auto pixelID = simCalPulses.getPixelID();
349 auto pulseHeight = simCalPulses.getAmplitude();
350 auto time = simCalPulses.getTime();
351 auto hitType = TimeDigitizer::c_CalPulse;
354 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
357 if (time + timeOffset.value < timeMin + timeOffset.timeShift)
continue;
358 if (time + timeOffset.value > timeMax + timeOffset.timeShift)
continue;
361 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
363 if (not digitizer.isValid())
continue;
364 unsigned id = digitizer.getUniqueID();
365 Iterator it = pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer)).first;
366 it->second.addTimeOfHit(time, pulseHeight, hitType);
372 int numModules = geo->getNumModules();
373 for (
int moduleID = 1; moduleID <= numModules; moduleID++) {
374 int numPixels = geo->getModule(moduleID).getPMTArray().getNumPixels();
376 for (
int i = 0; i < numHits; i++) {
377 int pixelID = int(gRandom->Rndm() * numPixels) + 1;
378 double time = (timeMax - timeMin) * gRandom->Rndm() + timeMin;
380 auto hitType = TimeDigitizer::c_Hit;
381 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
382 time += timeOffset.timeShift;
383 time -= timeOffset.value;
384 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
386 if (not digitizer.isValid())
continue;
387 unsigned id = digitizer.getUniqueID();
388 Iterator it = pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer)).first;
389 it->second.addTimeOfHit(time, pulseHeight, hitType);
397 int numModules = geo->getNumModules();
398 for (
int moduleID = 1; moduleID <= numModules; moduleID++) {
399 int numPixels = geo->getModule(moduleID).getPMTArray().getNumPixels();
400 for (
int pixelID = 1; pixelID <= numPixels; pixelID++) {
401 auto timeOffset =
getTimeOffset(trgTimeOffset, moduleID, pixelID);
402 TimeDigitizer digitizer(moduleID, pixelID, timeOffset.value, timeOffset.error,
404 if (not digitizer.isValid())
continue;
405 unsigned id = digitizer.getUniqueID();
406 pixels.insert(pair<unsigned, TimeDigitizer>(
id, digitizer));
414 for (
auto& pixel : pixels) {
415 auto& digitizer = pixel.second;
416 const auto* sampleTimes =
m_timebases->getSampleTimes(digitizer.getScrodID(),
417 digitizer.getChannel());
418 if (not sampleTimes)
continue;
419 if (sampleTimes->isCalibrated()) digitizer.setSampleTimes(sampleTimes);
426 for (
auto& pixel : pixels) {
427 auto& digitizer = pixel.second;
428 auto moduleID = digitizer.getModuleID();
429 auto channel = digitizer.getChannel();
430 auto rmsNoise =
m_noises->getNoise(moduleID, channel);
432 digitizer.setNoise(rmsNoise);
439 for (
auto& pixel : pixels) {
440 const auto& digitizer = pixel.second;
443 threshold =
m_thresholds->getThr(digitizer.getModuleID(), digitizer.getChannel());
458 rawDigit.setRevo9Counter(revo9cnt);
459 rawDigit.setPhase(phase);
460 rawDigit.setLastWriteAddr(refWindow);
461 rawDigit.setLookBackWindows(lookBackWindows);
462 rawDigit.setOfflineFlag();
466 waveform.setRevo9Counter(revo9cnt);
467 waveform.setOffsetWindows(offsetWindows);
474 if (
m_channelT0->isCalibrated(digit.getModuleID(), digit.getChannel())) {
475 digit.addStatus(TOPDigit::c_ChannelT0Calibrated);
477 if (
m_moduleT0->isCalibrated(digit.getModuleID())) {
478 digit.addStatus(TOPDigit::c_ModuleT0Calibrated);
481 digit.addStatus(TOPDigit::c_CommonT0Calibrated);
490 digit.setHitQuality(TOPDigit::c_Junk);