74 const int lane = pc.inputs().get<
int>(
"lane");
75 if (lane >= mInputLanes) {
76 LOGP(error,
"Received data from lane {} which is >= than the specified number of expected lanes of {}!", lane, mInputLanes);
80 const auto tsTmp = pc.inputs().get<std::vector<long>>(
"tsccdb");
81 if (tsTmp.front() == 0) {
82 LOGP(warning,
"Received dummy data with empty timestamp");
85 mCCDBBuffer[lane] = tsTmp;
86 if (mProcessedTimeStamp > mCCDBBuffer[lane].front()) {
87 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());
89 mProcessedTimeStamp = mCCDBBuffer[lane].front();
93 mIntervalsBuffer[lane] = pc.inputs().get<std::vector<unsigned int>>(
"intervals");
97 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
98 const int side = dataHeader->subSpecification;
99 mIDCOneBuffer[lane][
side].mIDCOne = pc.inputs().get<std::vector<float>>(
ref);
100 LOGP(info,
"Received {} 1D-IDCs for side {}", mIDCOneBuffer[lane][
side].mIDCOne.size(),
side);
102 if (mProcessSACs && mIntervalsBuffer[lane].
empty()) {
103 const auto nValues = mIDCOneBuffer[lane][
side].mIDCOne.size();
104 const int nIntervals = nValues / mIntervalsSACs;
105 const int nFirstInterval = nValues % mIntervalsSACs;
106 if (nFirstInterval == 0) {
107 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals, mIntervalsSACs);
109 mIntervalsBuffer[lane] = std::vector<unsigned int>(nIntervals + 1, mIntervalsSACs);
110 mIntervalsBuffer[lane].front() = nFirstInterval;
116 if (!mProcessSACs && !mDisableScaler) {
117 const long startTS = mCCDBBuffer[lane].front();
120 scaler.
timestamp[1] = mCCDBBuffer[lane].back();
122 auto const* dataHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
123 const int side = dataHeader->subSpecification;
124 const float idc0mean = pc.inputs().get<
float>(
ref);
125 LOGP(info,
"Received {} IDC0 mean for side {}", idc0mean,
side);
130 if (vecIDC.size() > 0) {
131 const float mean = std::reduce(vecIDC.begin(), vecIDC.end()) /
static_cast<float>(vecIDC.size());
132 LOGP(info,
"normalizing by {}", mean);
133 if (std::abs(mean) > 0.001) {
134 std::transform(vecIDC.begin(), vecIDC.end(), vecIDC.begin(), [&mean](
auto val) { return val / mean; });
139 std::transform(scaler.
idc1[
side].begin(), scaler.
idc1[
side].end(), scaler.
idc1[
side].begin(), [&idc0mean](
auto idc) { return idc * idc0mean; });
142 const int lenA = scaler.
idc1[0].size();
143 const int lenC = scaler.
idc1[1].size();
146 LOGP(warning,
"Received IDCs have different length! A-side length: {} and C-side length: {}", lenA, lenC);
148 const int maxLen = std::max(lenA, lenC);
149 scaler.
idc1[0].resize(maxLen);
150 scaler.
idc1[1].resize(maxLen);
154 makeTPCScaler(pc.outputs(),
false);
158 if (lane == mExpectedInputLane) {
159 const int nSides = mIDCOneBuffer[lane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[lane][
Side::C].mIDCOne.empty();
161 for (
int iProcessLaneTmp = 0; iProcessLaneTmp < mInputLanes; ++iProcessLaneTmp) {
162 const int nSidesCurrLane = mIDCOneBuffer[mExpectedInputLane][
Side::A].mIDCOne.empty() + mIDCOneBuffer[mExpectedInputLane][
Side::C].mIDCOne.empty();
163 if (nSidesCurrLane != nSides) {
167 for (
int iSide = 0; iSide <
SIDES; ++iSide) {
169 if (mIDCOneBuffer[mExpectedInputLane][
side].mIDCOne.empty()) {
172 LOGP(info,
"Processing input lane: {} for Side: {}", mExpectedInputLane, iSide);
175 mIDCFourierTransform[
side].setIDCs(std::move(mIDCOneBuffer[mExpectedInputLane][
side]), mIntervalsBuffer[mExpectedInputLane]);
176 mIDCFourierTransform[
side].calcFourierCoefficients(mIntervalsBuffer[mExpectedInputLane].
size());
179 if (mEnableFFTCCDB) {
182 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfo.getPath(), ccdbInfo.getFileName(), imageFFT->size(), ccdbInfo.getStartValidityTimestamp(), ccdbInfo.getEndValidityTimestamp());
187 coeffSAC.
mCoeff[
side] = mIDCFourierTransform[
side].getFourierCoefficients();
191 LOGP(info,
"dumping FT to file");
196 sendOutput(pc.outputs(),
side);
200 if (mProcessSACs && mEnableFFTCCDB) {
207 mExpectedInputLane = ++mExpectedInputLane % mInputLanes;