Skip to content

Commit 4e89547

Browse files
sevdokimshahor02
authored andcommitted
CPV: add LM-L0 delay subtraction to RawToDigitConverterSpec
1 parent 8b4b032 commit 4e89547

9 files changed

Lines changed: 109 additions & 65 deletions

File tree

Detectors/CPV/calib/testWorkflow/GainCalibratorSpec.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,10 @@ DataProcessorSpec getCPVGainCalibratorSpec()
189189
inputs);
190190
std::vector<OutputSpec> outputs;
191191
// Length of data description ("CPV_Pedestals") must be < 16 characters.
192-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Gains"}, Lifetime::Sporadic);
193-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Gains"}, Lifetime::Sporadic);
194-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_GainCD"}, Lifetime::Sporadic);
195-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_GainCD"}, Lifetime::Sporadic);
192+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Gains", 0}, Lifetime::Sporadic);
193+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Gains", 0}, Lifetime::Sporadic);
194+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_GainCD", 0}, Lifetime::Sporadic);
195+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_GainCD", 0}, Lifetime::Sporadic);
196196

197197
return DataProcessorSpec{
198198
"cpv-gain-calibration",

Detectors/CPV/calib/testWorkflow/NoiseCalibratorSpec.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ DataProcessorSpec getCPVNoiseCalibratorSpec()
183183
inputs);
184184
std::vector<OutputSpec> outputs;
185185
// Length of data description ("CPV_Pedestals") must be < 16 characters.
186-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_BadMap"}, Lifetime::Sporadic);
187-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_BadMap"}, Lifetime::Sporadic);
186+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_BadMap", 0}, Lifetime::Sporadic);
187+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_BadMap", 0}, Lifetime::Sporadic);
188188

189189
return DataProcessorSpec{
190190
"cpv-noise-calibration",

Detectors/CPV/calib/testWorkflow/PedestalCalibratorSpec.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -171,16 +171,18 @@ DataProcessorSpec getCPVPedestalCalibratorSpec()
171171

172172
std::vector<OutputSpec> outputs;
173173
// Length of data description ("CPV_Pedestals") must be < 16 characters.
174-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Pedestals"}, Lifetime::Sporadic);
175-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Pedestals"}, Lifetime::Sporadic);
176-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_FEEThrs"}, Lifetime::Sporadic);
177-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_FEEThrs"}, Lifetime::Sporadic);
178-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_PedEffs"}, Lifetime::Sporadic);
179-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_PedEffs"}, Lifetime::Sporadic);
180-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_DeadChnls"}, Lifetime::Sporadic);
181-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_DeadChnls"}, Lifetime::Sporadic);
182-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_HighThrs"}, Lifetime::Sporadic);
183-
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_HighThrs"}, Lifetime::Sporadic);
174+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Pedestals", 0}, Lifetime::Sporadic);
175+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Pedestals", 0}, Lifetime::Sporadic);
176+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_FEEThrs", 0}, Lifetime::Sporadic);
177+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_FEEThrs", 0}, Lifetime::Sporadic);
178+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_FEEThrs", 1}, Lifetime::Sporadic);
179+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_FEEThrs", 1}, Lifetime::Sporadic);
180+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_PedEffs", 0}, Lifetime::Sporadic);
181+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_PedEffs", 0}, Lifetime::Sporadic);
182+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_DeadChnls", 0}, Lifetime::Sporadic);
183+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_DeadChnls", 0}, Lifetime::Sporadic);
184+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_HighThrs", 0}, Lifetime::Sporadic);
185+
outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_HighThrs", 0}, Lifetime::Sporadic);
184186
std::vector<InputSpec> inputs{{"digits", "CPV", "DIGITS"},
185187
{"trigrecs", "CPV", "DIGITTRIGREC"}};
186188
inputs.emplace_back("calibparams", "CPV", "CPV_CalibPars", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/CPVCalibParams"));

Detectors/CPV/simulation/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ o2_add_library(CPVSimulation
1616
src/RawWriter.cxx
1717
PUBLIC_LINK_LIBRARIES O2::DetectorsBase
1818
O2::DataFormatsCPV
19+
O2::DataFormatsCTP
1920
O2::CPVBase
2021
O2::CCDB
2122
O2::SimConfig

Detectors/CPV/simulation/include/CPVSimulation/RawWriter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct padCharge {
6464
padCharge(short a, short b) : charge(a),
6565
pad(b)
6666
{
67-
} //for std::vector::emplace_back functionality
67+
} // for std::vector::emplace_back functionality
6868
};
6969

7070
class RawWriter
@@ -100,7 +100,7 @@ class RawWriter
100100
CalibParams* mCalibParams = nullptr; ///< CPV calibration
101101
Pedestals* mPedestals = nullptr; ///< CPV pedestals
102102
BadChannelMap* mBadMap = nullptr; ///< CPV bad channel map
103-
103+
int64_t mLM_L0_delay = 15; ///< LM-L0 delay
104104
std::vector<char> mPayload[kNGBTLinks]; ///< Preformatted payload for every link to be written
105105
gsl::span<o2::cpv::Digit> mDigits; ///< Digits input vector - must be in digitized format
106106
std::unique_ptr<o2::raw::RawFileWriter> mRawWriter; ///< Raw writer

Detectors/CPV/simulation/src/RawWriter.cxx

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "CPVBase/Geometry.h"
2222
#include "CCDB/CCDBTimeStampUtils.h"
2323
#include "CCDB/BasicCCDBManager.h"
24+
#include "DataFormatsCTP/TriggerOffsetsParam.h"
25+
#include "DetectorsRaw/HBFUtils.h"
2426

2527
using namespace o2::cpv;
2628

@@ -40,7 +42,11 @@ void RawWriter::init()
4042
mRawWriter->registerLink(link.feeId, link.cruId, link.linkId, link.endPointId, rawFileName.data());
4143
}
4244

45+
// Lm-L0 delay
46+
mLM_L0_delay = o2::ctp::TriggerOffsetsParam::Instance().LM_L0;
47+
4348
// CCDB setup
49+
const auto& hbfutils = o2::raw::HBFUtils::Instance();
4450
LOG(info) << "CCDB Url: " << mCcdbUrl;
4551
auto& ccdbMgr = o2::ccdb::BasicCCDBManager::instance();
4652
ccdbMgr.setURL(mCcdbUrl);
@@ -59,8 +65,9 @@ void RawWriter::init()
5965
LOG(info) << "Successfully initializated BasicCCDBManager with caching option";
6066

6167
// read calibration from ccdb (for now do it only at the beginning of dataprocessing)
62-
// TODO: setup timestam according to anchors
63-
ccdbMgr.setTimestamp(o2::ccdb::getCurrentTimestamp());
68+
// setup timestam according to anchors
69+
ccdbMgr.setTimestamp(hbfutils.startTime);
70+
LOG(info) << "Using time stamp " << ccdbMgr.getTimestamp();
6471

6572
LOG(info) << "CCDB: Reading o2::cpv::CalibParams from CPV/Calib/Gains";
6673
mCalibParams = ccdbMgr.get<o2::cpv::CalibParams>("CPV/Calib/Gains");
@@ -94,16 +101,16 @@ void RawWriter::digitsToRaw(gsl::span<o2::cpv::Digit> digitsbranch, gsl::span<o2
94101
return;
95102
}
96103

97-
// process digits which belong to same orbit
104+
// process digits which belong to same orbit (taking into account )
98105
int iFirstTrgInCurrentOrbit = 0;
99-
unsigned int currentOrbit = triggerbranch[0].getBCData().orbit;
106+
unsigned int currentOrbit = triggerbranch[iFirstTrgInCurrentOrbit].getBCData().orbit;
100107
int nTrgsInCurrentOrbit = 1;
101108
for (unsigned int iTrg = 1; iTrg < triggerbranch.size(); iTrg++) {
102-
if (triggerbranch[iTrg].getBCData().orbit != currentOrbit) { // if orbit changed, write previous orbit to file
109+
if ((triggerbranch[iTrg].getBCData() + mLM_L0_delay).orbit != currentOrbit) { // if orbit changed, write previous orbit to file
103110
processOrbit(digitsbranch, triggerbranch.subspan(iFirstTrgInCurrentOrbit, nTrgsInCurrentOrbit));
104111
iFirstTrgInCurrentOrbit = iTrg; // orbit changed
105112
nTrgsInCurrentOrbit = 1;
106-
currentOrbit = triggerbranch[iTrg].getBCData().orbit;
113+
currentOrbit = (triggerbranch[iTrg].getBCData() + mLM_L0_delay).orbit;
107114
} else {
108115
nTrgsInCurrentOrbit++;
109116
}
@@ -129,9 +136,11 @@ bool RawWriter::processOrbit(const gsl::span<o2::cpv::Digit> digitsbranch, const
129136
int gbtWordCounterBeforeCPVTrailer[kNGBTLinks] = {0, 0, 0};
130137
bool isHeaderClosedWithTrailer[kNGBTLinks] = {false, false, false};
131138
for (auto& trg : trgs) {
139+
o2::InteractionRecord currentIR = trg.getBCData();
140+
currentIR += mLM_L0_delay;
132141
LOG(debug) << "RawWriter::processOrbit() : "
133-
<< "I start to process trigger record (orbit = " << trg.getBCData().orbit
134-
<< ", BC = " << trg.getBCData().bc << ")";
142+
<< "I start to process trigger record (orbit = " << currentIR.orbit
143+
<< ", BC = " << currentIR.bc << ")";
135144
LOG(debug) << "First entry = " << trg.getFirstEntry() << ", Number of objects = " << trg.getNumberOfObjects();
136145

137146
// Clear array which is used to store digits
@@ -166,22 +175,22 @@ bool RawWriter::processOrbit(const gsl::span<o2::cpv::Digit> digitsbranch, const
166175
gbtWordCounterBeforeCPVTrailer[iLink] = 0;
167176
if (nMaxGbtWordsPerPage - gbtWordCounter[iLink] < 3) { // otherwise flush already prepared data to file
168177
LOG(debug) << "RawWriter::processOrbit() : before header: adding preformatted dma page of size " << mPayload[iLink].size();
169-
mRawWriter->addData(links[iLink].feeId, links[iLink].cruId, links[iLink].linkId, links[iLink].endPointId, trg.getBCData(),
178+
mRawWriter->addData(links[iLink].feeId, links[iLink].cruId, links[iLink].linkId, links[iLink].endPointId, currentIR,
170179
gsl::span<char>(mPayload[iLink].data(), mPayload[iLink].size()), preformatted);
171180
mPayload[iLink].clear();
172181
gbtWordCounter[iLink] = 0;
173182
gbtWordCounterBeforeCPVTrailer[iLink] = 0;
174183
}
175184

176185
// first, header goes
177-
CpvHeader header(trg.getBCData(), false, false);
186+
CpvHeader header(currentIR, false, false);
178187
for (int i = 0; i < 16; i++) {
179188
mPayload[iLink].push_back(header.mBytes[i]);
180189
}
181190
isHeaderClosedWithTrailer[iLink] = false;
182191
LOG(debug) << "RawWriter::processOrbit() : "
183-
<< "I wrote cpv header for orbit = " << trg.getBCData().orbit
184-
<< " and BC = " << trg.getBCData().bc;
192+
<< "I wrote cpv header for orbit = " << currentIR.orbit
193+
<< " and BC = " << currentIR.bc;
185194

186195
gbtWordCounter[iLink]++;
187196
gbtWordCounterBeforeCPVTrailer[iLink]++;
@@ -211,21 +220,21 @@ bool RawWriter::processOrbit(const gsl::span<o2::cpv::Digit> digitsbranch, const
211220
}
212221
gbtWordCounter[iLink]++;
213222
gbtWordCounterBeforeCPVTrailer[iLink]++;
214-
if (nMaxGbtWordsPerPage - gbtWordCounter[iLink] == 1) { // the only space for trailer left on current page
215-
CpvTrailer tr(gbtWordCounterBeforeCPVTrailer[iLink], trg.getBCData().bc, nDigsToWriteLeft == 0); // add trailer and flush page to file
223+
if (nMaxGbtWordsPerPage - gbtWordCounter[iLink] == 1) { // the only space for trailer left on current page
224+
CpvTrailer tr(gbtWordCounterBeforeCPVTrailer[iLink], currentIR.bc, nDigsToWriteLeft == 0); // add trailer and flush page to file
216225
for (int i = 0; i < 16; i++) {
217226
mPayload[iLink].push_back(tr.mBytes[i]);
218227
}
219228
isHeaderClosedWithTrailer[iLink] = true;
220229
LOG(debug) << "RawWriter::processOrbit() : middle of payload: adding preformatted dma page of size " << mPayload[iLink].size();
221-
mRawWriter->addData(links[iLink].feeId, links[iLink].cruId, links[iLink].linkId, links[iLink].endPointId, trg.getBCData(),
230+
mRawWriter->addData(links[iLink].feeId, links[iLink].cruId, links[iLink].linkId, links[iLink].endPointId, currentIR,
222231
gsl::span<char>(mPayload[iLink].data(), mPayload[iLink].size()), preformatted);
223232

224233
mPayload[iLink].clear();
225234
gbtWordCounter[iLink] = 0;
226235
gbtWordCounterBeforeCPVTrailer[iLink] = 0;
227236
if (nDigsToWriteLeft) { // some digits left for writing
228-
CpvHeader newHeader(trg.getBCData(), false, true);
237+
CpvHeader newHeader(currentIR, false, true);
229238
for (int i = 0; i < 16; i++) { // so put a new header and continue
230239
mPayload[iLink].push_back(newHeader.mBytes[i]);
231240
}
@@ -251,14 +260,14 @@ bool RawWriter::processOrbit(const gsl::span<o2::cpv::Digit> digitsbranch, const
251260
}
252261
gbtWordCounter[iLink]++;
253262
gbtWordCounterBeforeCPVTrailer[iLink]++;
254-
if (nMaxGbtWordsPerPage - gbtWordCounter[iLink] == 1) { // the only space for trailer left on current page
255-
CpvTrailer tr(gbtWordCounterBeforeCPVTrailer[iLink], trg.getBCData().bc, nDigsToWriteLeft == 0); // add trailer and flush page to file
263+
if (nMaxGbtWordsPerPage - gbtWordCounter[iLink] == 1) { // the only space for trailer left on current page
264+
CpvTrailer tr(gbtWordCounterBeforeCPVTrailer[iLink], currentIR.bc, nDigsToWriteLeft == 0); // add trailer and flush page to file
256265
for (int i = 0; i < 16; i++) {
257266
mPayload[iLink].push_back(tr.mBytes[i]);
258267
}
259268
isHeaderClosedWithTrailer[iLink] = true;
260269
LOG(debug) << "RawWriter::processOrbit() : middle of payload (after filling empty words): adding preformatted dma page of size " << mPayload[iLink].size();
261-
mRawWriter->addData(links[iLink].feeId, links[iLink].cruId, links[iLink].linkId, links[iLink].endPointId, trg.getBCData(),
270+
mRawWriter->addData(links[iLink].feeId, links[iLink].cruId, links[iLink].linkId, links[iLink].endPointId, currentIR,
262271
gsl::span<char>(mPayload[iLink].data(), mPayload[iLink].size()), preformatted);
263272
mPayload[iLink].clear();
264273
gbtWordCounter[iLink] = 0;
@@ -275,7 +284,7 @@ bool RawWriter::processOrbit(const gsl::span<o2::cpv::Digit> digitsbranch, const
275284
}
276285
} // end of ccId cycle
277286
if (!isHeaderClosedWithTrailer[iLink]) {
278-
CpvTrailer tr(gbtWordCounterBeforeCPVTrailer[iLink], trg.getBCData().bc, true);
287+
CpvTrailer tr(gbtWordCounterBeforeCPVTrailer[iLink], currentIR.bc, true);
279288
for (int i = 0; i < 16; i++) {
280289
mPayload[iLink].push_back(tr.mBytes[i]);
281290
}

Detectors/CPV/workflow/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ o2_add_library(CPVWorkflow
2020
src/EntropyDecoderSpec.cxx
2121
PUBLIC_LINK_LIBRARIES O2::Framework
2222
O2::DataFormatsCPV
23+
O2::DataFormatsCTP
2324
O2::DPLUtils
2425
O2::CPVBase
2526
O2::CPVSimulation

Detectors/CPV/workflow/include/CPVWorkflow/RawToDigitConverterSpec.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,16 @@ class RawToDigitConverterSpec : public framework::Task
6767
/// \brief simple check of HW address
6868
char CheckHWAddress(short ddl, short hwAddress, short& fee);
6969

70+
private:
71+
void updateTimeDependentParams(framework::ProcessingContext& ctx);
72+
7073
private:
7174
bool mIsUsingGainCalibration; ///< Use gain calibration from CCDB
7275
bool mIsUsingBadMap; ///< Use BadChannelMap to mask bad channels
7376
bool mIsPedestalData; ///< Do not subtract pedestals if true
77+
const o2::cpv::Pedestals* mPedestals = nullptr; ///< Pedestals from the CCDB
78+
const o2::cpv::BadChannelMap* mBadMap = nullptr; ///< Bad Channel Map from the CCDB
79+
const o2::cpv::CalibParams* mGains = nullptr; ///< Gains from the CCDB
7480
std::vector<Digit> mOutputDigits; ///< Container with output cells
7581
std::vector<TriggerRecord> mOutputTriggerRecords; ///< Container with output cells
7682
std::vector<RawDecoderError> mOutputHWErrors; ///< Errors occured in reading data

0 commit comments

Comments
 (0)