71 const int lane = pc.inputs().get<
int>(
"lane");
72 if (lane >= mInputLanes) {
73 LOGP(error,
"Received data from lane {} which is >= than the specified number of expected lanes of {}!", lane, mInputLanes);
77 const auto tsTmp = pc.inputs().get<std::vector<long>>(
"tsccdb");
78 if (tsTmp.front() == 0) {
79 LOGP(warning,
"Received dummy data with empty timestamp");
82 mCCDBBuffer[lane] = tsTmp;
83 if (mProcessedTimeStamp > mCCDBBuffer[lane].front()) {
84 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());
86 mProcessedTimeStamp = mCCDBBuffer[lane].front();
90 mIntervalsBuffer[lane] = pc.inputs().get<std::vector<unsigned int>>(
"intervals");
94 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
95 const int side = dataHeader->subSpecification;
96 mIDCOneBuffer[lane][
side].mIDCOne = pc.inputs().get<std::vector<float>>(
ref);
97 LOGP(info,
"Received {} 1D-IDCs for side {}", mIDCOneBuffer[lane][
side].mIDCOne.size(),
side);
99 if (mProcessSACs && mIntervalsBuffer[lane].
empty()) {
100 const auto nValues = mIDCOneBuffer[lane][
side].mIDCOne.size();
101 const int nIntervals = nValues / mIntervalsSACs;
102 const int nFirstInterval = nValues % mIntervalsSACs;
103 if (nFirstInterval == 0) {
104 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals, mIntervalsSACs);
106 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals + 1, mIntervalsSACs);
107 mIntervalsBuffer[lane].front() = nFirstInterval;
113 if (!mProcessSACs && !mDisableScaler) {
114 const long startTS = mCCDBBuffer[lane].front();
117 scaler.
timestamp[1] = mCCDBBuffer[lane].back();
119 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
120 const int side = dataHeader->subSpecification;
121 const float idc0mean = pc.inputs().get<
float>(
ref);
122 LOGP(info,
"Received {} IDC0 mean for side {}", idc0mean,
side);
127 if (vecIDC.size() > 0) {
128 const float mean = std::reduce(vecIDC.begin(), vecIDC.end()) /
static_cast<float>(vecIDC.size());
129 LOGP(info,
"normalizing by {}", mean);
130 if (std::abs(mean) > 0.001) {
131 std::transform(vecIDC.begin(), vecIDC.end(), vecIDC.begin(), [&mean](
auto val) { return val / mean; });
136 std::transform(scaler.
idc1[
side].begin(), scaler.
idc1[
side].end(), scaler.
idc1[
side].begin(), [&idc0mean](
auto idc) { return idc * idc0mean; });
139 const int lenA = scaler.
idc1[0].size();
140 const int lenC = scaler.
idc1[1].size();
143 LOGP(warning,
"Received IDCs have different length! A-side length: {} and C-side length: {}", lenA, lenC);
145 const int maxLen = std::max(lenA, lenC);
146 scaler.
idc1[0].resize(maxLen);
147 scaler.
idc1[1].resize(maxLen);
151 makeTPCScaler(pc.outputs(),
false);
155 if (lane == mExpectedInputLane) {
156 const int nSides = mIDCOneBuffer[lane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[lane][
Side::C].mIDCOne.empty();
158 for (
int iProcessLaneTmp = 0; iProcessLaneTmp < mInputLanes; ++iProcessLaneTmp) {
159 const int nSidesCurrLane = mIDCOneBuffer[mExpectedInputLane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[mExpectedInputLane][
Side::C].mIDCOne.empty();
160 if (nSidesCurrLane != nSides) {
164 for (
int iSide = 0; iSide <
SIDES; ++iSide) {
166 if (mIDCOneBuffer[mExpectedInputLane][
side].mIDCOne.empty()) {
169 LOGP(info,
"Processing input lane: {} for Side: {}", mExpectedInputLane, iSide);
172 mIDCFourierTransform[
side].setIDCs(std::move(mIDCOneBuffer[mExpectedInputLane][
side]), mIntervalsBuffer[mExpectedInputLane]);
173 mIDCFourierTransform[
side].calcFourierCoefficients(mIntervalsBuffer[mExpectedInputLane].
size());
178 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
182 coeffSAC.
mCoeff[
side] = mIDCFourierTransform[
side].getFourierCoefficients();
186 LOGP(info,
"dumping FT to file");
191 sendOutput(pc.outputs(),
side);
202 mExpectedInputLane = ++mExpectedInputLane % mInputLanes;