diff --git a/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Chip.h b/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Chip.h index 1849907d6e071..a692fa2a5b8bc 100644 --- a/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Chip.h +++ b/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Chip.h @@ -78,7 +78,10 @@ class Chip /// Resize the vector of tdc states void resizeTDCStates(int const size) { mTDCStates.resize(size); } - std::vector>& getTDCStates() { return mTDCStates; } + std::vector>& getTDCStates() { return mTDCStates; } + + void resizeMaskStates(int const size) { mMaskStates.resize(size); } + std::vector& getMaskStates() { return mMaskStates; } void addDigit(UShort_t row, UShort_t col, Int_t charge, double time, ULong64_t bc, Int_t tdc, o2::MCCompLabel label); @@ -86,7 +89,8 @@ class Chip Int_t mChipIndex = -1; ///< Chip ID bool mDisabled = false; ///< Flag to indicate if the chip is disabled (e.g. due to dead channels) std::map mDigits; ///< Map of fired digits, possibly in multiple frames - std::vector> mTDCStates; ///< Vector of the last times the TDC pairs went busy + std::vector> mTDCStates; ///< Vector of the last times the TDC pairs went busy + std::vector mMaskStates; ///< Vector of the last time the RO column was masked ClassDefNV(Chip, 1); }; diff --git a/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/DPLDigitizerParam.h b/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/DPLDigitizerParam.h index 48c873d86dc2f..520ac14265619 100644 --- a/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/DPLDigitizerParam.h +++ b/Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/DPLDigitizerParam.h @@ -47,7 +47,8 @@ struct DPLDigitizerParam : public o2::conf::ConfigurableParamHelper #include @@ -63,8 +64,14 @@ void Digitizer::init() // initialize the vector of TDC states mChips[i].resizeTDCStates(nReadOutCols); for (auto& tdcStates : mChips[i].getTDCStates()) { - tdcStates[0] = -999.f; - tdcStates[1] = -999.f; + for (int iT = 0; iT < 4; ++iT) { + tdcStates[iT] = -o2::constants::math::VeryBig; + } + } + // initialize the vector of mask states + mChips[i].resizeMaskStates(nReadOutCols); + for (auto& maskStates: mChips[i].getMaskStates()) { + maskStates = -o2::constants::math::VeryBig; } } @@ -497,6 +504,7 @@ void Digitizer::fillOutputContainer() auto& chipDigits = chip.getDigits(); auto& tdcStates = chip.getTDCStates(); + auto& maskStates = chip.getMaskStates(); for (const auto& [key, digit] : chipDigits) { @@ -506,15 +514,26 @@ void Digitizer::fillOutputContainer() const int colInGroup = digit.getColumn() / digitizerParams.nColsPerGroup; const double digitTime = digit.getTime(); - if (digitTime - tdcStates[colInGroup][0] < digitizerParams.tdcBusyTime && digitTime - tdcStates[colInGroup][1] < digitizerParams.tdcBusyTime) { - // TODO: improve labels treatment if multiple hits cross the same pixel during - continue; // both tdc pairs are busy - } else if (digitTime - tdcStates[colInGroup][0] > digitizerParams.tdcBusyTime) { - tdcStates[colInGroup][0] = digitTime; - } else if (digitTime - tdcStates[colInGroup][1] > digitizerParams.tdcBusyTime) { - tdcStates[colInGroup][1] = digitTime; + + if (digitTime - maskStates[colInGroup] < digitizerParams.maskWindow) { + continue; // the RO column is still masked } + int available = -1; + for (int iT{0}; iT < 4; ++iT) { + if (digitTime - tdcStates[colInGroup][iT] > digitizerParams.tdcBusyTime) { + available = iT; + break; + } + } + + if (available == -1) { + continue; // all tdc pairs are busy + } + + tdcStates[colInGroup][available] = digitTime; + maskStates[colInGroup] = digitTime; + int digitID = mDigits->size(); mDigits->emplace_back(digit.getChipIndex(), digit.getRow(), digit.getColumn(), digit.getCharge(), digit.getTime(), digit.getBc(), digit.getTdc()); if (mMCLabels) {