72 const int lane = pc.inputs().get<
int>(
"lane");
73 if (lane >= mInputLanes) {
74 LOGP(error,
"Received data from lane {} which is >= than the specified number of expected lanes of {}!", lane, mInputLanes);
78 const auto tsTmp = pc.inputs().get<std::vector<long>>(
"tsccdb");
79 if (tsTmp.front() == 0) {
80 LOGP(warning,
"Received dummy data with empty timestamp");
83 mCCDBBuffer[lane] = tsTmp;
84 if (mProcessedTimeStamp > mCCDBBuffer[lane].front()) {
85 LOGP(warning,
"Already received data from a later time stamp {} then the currently received time stamp {}! (This might not be an issue)", mProcessedTimeStamp, mCCDBBuffer[lane].front());
87 mProcessedTimeStamp = mCCDBBuffer[lane].front();
91 mIntervalsBuffer[lane] = pc.inputs().get<std::vector<unsigned int>>(
"intervals");
95 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
96 const int side = dataHeader->subSpecification;
97 mIDCOneBuffer[lane][
side].mIDCOne = pc.inputs().get<std::vector<float>>(
ref);
98 LOGP(info,
"Received {} 1D-IDCs for side {}", mIDCOneBuffer[lane][
side].mIDCOne.size(),
side);
100 if (mProcessSACs && mIntervalsBuffer[lane].
empty()) {
101 const auto nValues = mIDCOneBuffer[lane][
side].mIDCOne.size();
102 const int nIntervals = nValues / mIntervalsSACs;
103 const int nFirstInterval = nValues % mIntervalsSACs;
104 if (nFirstInterval == 0) {
105 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals, mIntervalsSACs);
107 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals + 1, mIntervalsSACs);
108 mIntervalsBuffer[lane].front() = nFirstInterval;
114 if (!mProcessSACs && !mDisableScaler) {
115 const long startTS = mCCDBBuffer[lane].front();
118 scaler.
timestamp[1] = mCCDBBuffer[lane].back();
120 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
121 const int side = dataHeader->subSpecification;
122 const float idc0mean = pc.inputs().get<
float>(
ref);
123 LOGP(info,
"Received {} IDC0 mean for side {}", idc0mean,
side);
128 if (vecIDC.size() > 0) {
129 const float mean = std::reduce(vecIDC.begin(), vecIDC.end()) /
static_cast<float>(vecIDC.size());
130 LOGP(info,
"normalizing by {}", mean);
131 if (std::abs(mean) > 0.001) {
132 std::transform(vecIDC.begin(), vecIDC.end(), vecIDC.begin(), [&mean](
auto val) { return val / mean; });
137 std::transform(scaler.
idc1[
side].begin(), scaler.
idc1[
side].end(), scaler.
idc1[
side].begin(), [&idc0mean](
auto idc) { return idc * idc0mean; });
140 const int lenA = scaler.
idc1[0].size();
141 const int lenC = scaler.
idc1[1].size();
144 LOGP(warning,
"Received IDCs have different length! A-side length: {} and C-side length: {}", lenA, lenC);
146 const int maxLen = std::max(lenA, lenC);
147 scaler.
idc1[0].resize(maxLen);
148 scaler.
idc1[1].resize(maxLen);
152 makeTPCScaler(pc.outputs(),
false);
156 if (lane == mExpectedInputLane) {
157 const int nSides = mIDCOneBuffer[lane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[lane][
Side::C].mIDCOne.empty();
159 for (
int iProcessLaneTmp = 0; iProcessLaneTmp < mInputLanes; ++iProcessLaneTmp) {
160 const int nSidesCurrLane = mIDCOneBuffer[mExpectedInputLane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[mExpectedInputLane][
Side::C].mIDCOne.empty();
161 if (nSidesCurrLane != nSides) {
165 for (
int iSide = 0; iSide <
SIDES; ++iSide) {
167 if (mIDCOneBuffer[mExpectedInputLane][
side].mIDCOne.empty()) {
170 LOGP(info,
"Processing input lane: {} for Side: {}", mExpectedInputLane, iSide);
173 mIDCFourierTransform[
side].setIDCs(std::move(mIDCOneBuffer[mExpectedInputLane][
side]), mIntervalsBuffer[mExpectedInputLane]);
174 mIDCFourierTransform[
side].calcFourierCoefficients(mIntervalsBuffer[mExpectedInputLane].
size());
177 if (mEnableFFTCCDB) {
180 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
185 coeffSAC.
mCoeff[
side] = mIDCFourierTransform[
side].getFourierCoefficients();
189 LOGP(info,
"dumping FT to file");
194 sendOutput(pc.outputs(),
side);
198 if (mProcessSACs && mEnableFFTCCDB) {
205 mExpectedInputLane = ++mExpectedInputLane % mInputLanes;