77 const int lane = pc.inputs().get<
int>(
"lane");
78 if (lane >= mInputLanes) {
79 LOGP(error,
"Received data from lane {} which is >= than the specified number of expected lanes of {}!", lane, mInputLanes);
83 const auto tsTmp = pc.inputs().get<std::vector<long>>(
"tsccdb");
84 if (tsTmp.front() == 0) {
85 LOGP(warning,
"Received dummy data with empty timestamp");
88 mCCDBBuffer[lane] = tsTmp;
89 if (mProcessedTimeStamp > mCCDBBuffer[lane].front()) {
90 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());
92 mProcessedTimeStamp = mCCDBBuffer[lane].front();
96 mIntervalsBuffer[lane] = pc.inputs().get<std::vector<unsigned int>>(
"intervals");
100 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
101 const int side = dataHeader->subSpecification;
102 mIDCOneBuffer[lane][
side].mIDCOne = pc.inputs().get<std::vector<float>>(
ref);
103 LOGP(info,
"Received {} 1D-IDCs for side {}", mIDCOneBuffer[lane][
side].mIDCOne.size(),
side);
105 if (mProcessSACs && mIntervalsBuffer[lane].
empty()) {
106 const auto nValues = mIDCOneBuffer[lane][
side].mIDCOne.size();
107 const int nIntervals = nValues / mIntervalsSACs;
108 const int nFirstInterval = nValues % mIntervalsSACs;
109 if (nFirstInterval == 0) {
110 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals, mIntervalsSACs);
112 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals + 1, mIntervalsSACs);
113 mIntervalsBuffer[lane].front() = nFirstInterval;
119 if (!mProcessSACs && !mDisableScaler) {
120 const long startTS = mCCDBBuffer[lane].front();
123 scaler.
timestamp[1] = mCCDBBuffer[lane].back();
125 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
126 const int side = dataHeader->subSpecification;
127 const float idc0mean = pc.inputs().get<
float>(
ref);
128 LOGP(info,
"Received {} IDC0 mean for side {}", idc0mean,
side);
133 if (vecIDC.size() > 0) {
134 const float mean = std::reduce(vecIDC.begin(), vecIDC.end()) /
static_cast<float>(vecIDC.size());
135 LOGP(info,
"normalizing by {}", mean);
136 if (std::abs(mean) > 0.001) {
137 std::transform(vecIDC.begin(), vecIDC.end(), vecIDC.begin(), [&mean](
auto val) { return val / mean; });
142 std::transform(scaler.
idc1[
side].begin(), scaler.
idc1[
side].end(), scaler.
idc1[
side].begin(), [&idc0mean](
auto idc) { return idc * idc0mean; });
145 const int lenA = scaler.
idc1[0].size();
146 const int lenC = scaler.
idc1[1].size();
149 LOGP(warning,
"Received IDCs have different length! A-side length: {} and C-side length: {}", lenA, lenC);
151 const int maxLen = std::max(lenA, lenC);
152 scaler.
idc1[0].resize(maxLen);
153 scaler.
idc1[1].resize(maxLen);
157 makeTPCScaler(pc.outputs(),
false);
161 if (lane == mExpectedInputLane) {
162 const int nSides = mIDCOneBuffer[lane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[lane][
Side::C].mIDCOne.empty();
164 for (
int iProcessLaneTmp = 0; iProcessLaneTmp < mInputLanes; ++iProcessLaneTmp) {
165 const int nSidesCurrLane = mIDCOneBuffer[mExpectedInputLane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[mExpectedInputLane][
Side::C].mIDCOne.empty();
166 if (nSidesCurrLane != nSides) {
170 for (
int iSide = 0; iSide <
SIDES; ++iSide) {
172 if (mIDCOneBuffer[mExpectedInputLane][
side].mIDCOne.empty()) {
175 LOGP(info,
"Processing input lane: {} for Side: {}", mExpectedInputLane, iSide);
178 mIDCFourierTransform[
side].setIDCs(std::move(mIDCOneBuffer[mExpectedInputLane][
side]), mIntervalsBuffer[mExpectedInputLane]);
179 mIDCFourierTransform[
side].calcFourierCoefficients(mIntervalsBuffer[mExpectedInputLane].
size());
182 if (mEnableFFTCCDB) {
185 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
190 coeffSAC.
mCoeff[
side] = mIDCFourierTransform[
side].getFourierCoefficients();
194 LOGP(info,
"dumping FT to file");
199 sendOutput(pc.outputs(),
side);
203 if (mProcessSACs && mEnableFFTCCDB) {
210 mExpectedInputLane = ++mExpectedInputLane % mInputLanes;