Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "TPCBase/CRU.h"
#include "DataFormatsTPC/Defs.h"
#include "TPCSimulation/DigitTime.h"
#include "TPCBase/CalDet.h"
#include "CommonUtils/DebugStreamer.h"
#include "TPCBase/ParameterDetector.h"
#include "TPCBase/ParameterElectronics.h"
Expand Down Expand Up @@ -78,6 +79,10 @@ class DigitContainer
/// Get the size of the container for one event
size_t size() const { return mTimeBins.size(); }

/// Fetch the calibration objects used by fillOutputContainer from the CDBInterface
/// Must be called after the CDBInterface is configured; fillOutputContainer calls it lazily otherwise
void updateCalibrations();

private:
TimeBin mFirstTimeBin = 0; ///< First time bin to consider
TimeBin mEffectiveTimeBin = 0; ///< Effective time bin of that digit
Expand All @@ -86,6 +91,10 @@ class DigitContainer
std::deque<DigitTime*> mTimeBins; ///< Time bin Container for the ADC value
std::unique_ptr<DigitTime::PrevDigitInfoArray> mPrevDigArr; ///< Keep track of ToT and ion tail cumul from last time bin
o2::utils::DebugStreamer mStreamer; ///< Debug streamer
const CalPad* mPadParams[3] = {nullptr, nullptr, nullptr}; //!< Ion tail fraction, ion tail slope and common mode k-values per pad
const CalDet<bool>* mDeadMap = nullptr; //!< Dead channel map
bool mCMCEnabled = false; //!< Common mode correction enabled in the FEE config (DigiMode Auto)
bool mCalibrationsUpdated = false; //!< Whether updateCalibrations was called

void reportSettings();
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class DigitTime
void fillOutputContainer(std::vector<Digit>& output, dataformats::MCTruthContainer<MCCompLabel>& mcTruth,
std::vector<CommonMode>& commonModeOutput, const Sector& sector, TimeBin timeBin,
PrevDigitInfoArray* prevTime = nullptr, Streamer* debugStream = nullptr,
const CalPad* itParams[2] = nullptr, const CalDet<bool>* deadMap = nullptr);
const CalPad* padParams[3] = nullptr, const CalDet<bool>* deadMap = nullptr);

private:
std::array<float, GEMSTACKSPERSECTOR> mCommonMode; ///< Common mode container - 4 GEM ROCs per sector
Expand Down
75 changes: 42 additions & 33 deletions Detectors/TPC/simulation/src/DigitContainer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,9 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
// Without this we might get crashes in the clusterization step.
static const int maxTimeBinForTimeFrame = o2::conf::DigiParams::Instance().maxOrbitsToDigitize != -1 ? ((o2::conf::DigiParams::Instance().maxOrbitsToDigitize * 3564 + 2 * 8 - 2) / 8) : -1;

auto& cdb = CDBInterface::instance();

// ion tail per pad parameters
const CalPad* padParams[3] = {nullptr, nullptr, nullptr};

if (eleParam.doIonTailPerPad) {
const auto& itSettings = IonTailSettings::Instance();
if (itSettings.padITCorrFile.size()) {
cdb.setFEEParamsFromFile(itSettings.padITCorrFile);
}
padParams[0] = &cdb.getITFraction();
padParams[1] = &cdb.getITExpLambda();
}
if (eleParam.doCommonModePerPad) {
padParams[2] = &cdb.getCMkValues();
if (!mCalibrationsUpdated) {
LOG(debug) << "TPC DigitContainer: calibrations not set up before the first flush, fetching them now";
updateCalibrations();
}

const bool needsPrevDigArray = eleParam.doIonTail || eleParam.doIonTailPerPad || eleParam.doSaturationTail;
Expand All @@ -68,17 +56,11 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
mPrevDigArr = std::make_unique<DigitTime::PrevDigitInfoArray>();
}

// dead channel map
const CalDet<bool>* deadMap = {nullptr};
if (eleParam.applyDeadMap) {
deadMap = &cdb.getDeadChannelMap();
}

static bool reportedSettings = false;
if (!reportedSettings) {
reportSettings();
if (deadMap) {
LOGP(info, "Using dead map with {} masked pads", deadMap->getSum<int>());
if (mDeadMap) {
LOGP(info, "Using dead map with {} masked pads", mDeadMap->getSum<int>());
}
reportedSettings = true;
}
Expand Down Expand Up @@ -109,35 +91,34 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
if (time) {
switch (digitizationMode) {
case DigitzationMode::FullMode: {
time->fillOutputContainer<DigitzationMode::FullMode>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::FullMode>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
break;
}
case DigitzationMode::ZeroSuppression: {
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
break;
}
case DigitzationMode::ZeroSuppressionCMCorr: {
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
break;
}
case DigitzationMode::SubtractPedestal: {
time->fillOutputContainer<DigitzationMode::SubtractPedestal>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::SubtractPedestal>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
break;
}
case DigitzationMode::NoSaturation: {
time->fillOutputContainer<DigitzationMode::NoSaturation>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::NoSaturation>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
break;
}
case DigitzationMode::PropagateADC: {
time->fillOutputContainer<DigitzationMode::PropagateADC>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::PropagateADC>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
break;
}
case DigitzationMode::Auto: {
const auto& feeConfig = cdb.getFEEConfig();
if (feeConfig.isCMCEnabled()) {
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
if (mCMCEnabled) {
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
} else {
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, padParams, deadMap);
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
}
break;
}
Expand All @@ -158,6 +139,34 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
}
}

void DigitContainer::updateCalibrations()
{
const auto& eleParam = ParameterElectronics::Instance();
auto& cdb = CDBInterface::instance();

// ion tail per pad parameters
mPadParams[0] = mPadParams[1] = mPadParams[2] = nullptr;
if (eleParam.doIonTailPerPad) {
const auto& itSettings = IonTailSettings::Instance();
if (itSettings.padITCorrFile.size()) {
cdb.setFEEParamsFromFile(itSettings.padITCorrFile);
}
mPadParams[0] = &cdb.getITFraction();
mPadParams[1] = &cdb.getITExpLambda();
}
if (eleParam.doCommonModePerPad) {
mPadParams[2] = &cdb.getCMkValues();
}

// dead channel map
mDeadMap = eleParam.applyDeadMap ? &cdb.getDeadChannelMap() : nullptr;

// common mode correction in the FEE, needed to resolve DigiMode Auto
mCMCEnabled = (eleParam.DigiMode == DigitzationMode::Auto) && cdb.getFEEConfig().isCMCEnabled();

mCalibrationsUpdated = true;
}

void DigitContainer::reportSettings()
{
auto& cdb = CDBInterface::instance();
Expand Down
2 changes: 2 additions & 0 deletions Detectors/TPC/simulation/src/Digitizer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ void Digitizer::init()
auto& electronTransport = ElectronTransport::instance();
electronTransport.updateParameters(mVDrift);
auto& sampaProcessing = SAMPAProcessing::instance();
// the calibration update may reload FEE parameters from file, so SAMPAProcessing picks up its pointers afterwards
mDigitContainer.updateCalibrations();
sampaProcessing.updateParameters(mVDrift);
}

Expand Down
Loading