54 LOG(
debug) <<
"[EMCALCellConverter - run] called";
56 mCalibHandler->checkUpdates(ctx);
60 timeshift =
int(timeshift / 100) * 100;
63 mOutputLabels.
clear();
64 mOutputTriggers.clear();
65 auto digitsAll = ctx.
inputs().
get<gsl::span<o2::emcal::Digit>>(
"digits");
66 auto triggers = ctx.
inputs().
get<gsl::span<o2::emcal::TriggerRecord>>(
"triggers");
67 std::unique_ptr<const o2::dataformats::MCTruthContainer<o2::emcal::MCLabel>> truthcont =
nullptr;
72 LOG(
debug) <<
"[EMCALCellConverter - run] Received " << digitsAll.size() <<
" digits from " << triggers.size() <<
" trigger ...";
73 int currentstart = mOutputCells.size(), ncellsTrigger = 0;
74 for (
const auto& trg : triggers) {
75 if (!trg.getNumberOfObjects()) {
76 mOutputTriggers.emplace_back(trg.getBCData(), trg.getTriggerBits(), currentstart, ncellsTrigger);
82 gsl::span<const o2::emcal::Digit>
digits(digitsAll.data() + trg.getFirstEntry(), trg.getNumberOfObjects());
83 std::vector<gsl::span<const o2::emcal::MCLabel>> mcLabels;
86 for (
int digitIndex = trg.getFirstEntry(); digitIndex < (trg.getFirstEntry() + trg.getNumberOfObjects()); digitIndex++) {
87 mcLabels.push_back(truthcont->getLabels(digitIndex));
93 if (srucont.mSRUid == 21 || srucont.mSRUid == 22 || srucont.mSRUid == 36 || srucont.mSRUid == 39) {
97 for (
const auto& [tower, channelData] : srucont.mChannelsData) {
103 fitResults = mRawFitter->evaluate(channelData.mChannelsBunchesHG);
106 if (fitResults.
getAmp() > o2::emcal::constants::OVERFLOWCUT) {
107 fitResults = mRawFitter->evaluate(channelData.mChannelsBunchesLG);
108 fitResults.
setAmp(fitResults.
getAmp() * o2::emcal::constants::EMCAL_HGLGFACTOR);
114 if (fitResults.
getAmp() < 0) {
117 if (fitResults.
getTime() < 0) {
120 mOutputCells.emplace_back(tower, fitResults.
getAmp() * o2::emcal::constants::EMCAL_ADCENERGY, fitResults.
getTime() - timeshift - 25 * bcmod4, channelType);
126 if (channelData.mChannelLabelsHG.size() == 0) {
132 for (
const auto&
label : channelData.mChannelLabelsHG[bunchindex]) {
138 if (channelData.mChannelLabelsLG.size() == 0) {
144 for (
const auto&
label : channelData.mChannelLabelsLG[bunchindex]) {
159 mOutputTriggers.emplace_back(trg.getBCData(), trg.getTriggerBits(), currentstart, ncellsTrigger);
160 currentstart = mOutputCells.size();
163 LOG(
debug) <<
"[EMCALCellConverter - run] Writing " << mOutputCells.size() <<
" cells ...";
189 std::vector<o2::emcal::SRUBunchContainer> sruBunchContainer;
190 std::vector<o2::emcal::DigitContainerPerSRU> sruDigitContainer;
192 for (
auto iddl = 0; iddl < 40; iddl++) {
194 srucontBunch.
mSRUid = iddl;
195 sruBunchContainer.push_back(srucontBunch);
198 srucontDigits.
mSRUid = iddl;
199 sruDigitContainer.push_back(srucontDigits);
202 std::vector<const o2::emcal::Digit*>* bunchDigits;
203 std::vector<gsl::span<const o2::emcal::MCLabel>>* bunchLabels;
208 for (
const auto& dig :
digits) {
209 auto tower = dig.getTower();
210 if (tower != lasttower) {
213 std::cout <<
"Wrong cell ID " << tower << std::endl;
216 auto onlineindices = mGeometry->
getOnlineID(tower);
217 int sruID = std::get<0>(onlineindices);
219 auto towerdata = sruDigitContainer[sruID].mChannelsDigits.find(tower);
220 if (towerdata == sruDigitContainer[sruID].mChannelsDigits.end()) {
221 sruDigitContainer[sruID].mChannelsDigits[tower] = {dig.getType(), std::vector<const o2::emcal::Digit*>(o2::emcal::constants::EMCAL_MAXTIMEBINS), std::vector<gsl::span<const o2::emcal::MCLabel>>()};
222 bunchDigits = &(sruDigitContainer[sruID].mChannelsDigits[tower].mChannelDigits);
223 memset(bunchDigits->data(), 0,
sizeof(
o2::emcal::Digit*) * o2::emcal::constants::EMCAL_MAXTIMEBINS);
225 bunchDigits = &(towerdata->second.mChannelDigits);
232 auto timesample =
int(dig.getTimeStamp() / emcal::constants::EMCAL_TIMESAMPLE);
233 if (timesample >= o2::emcal::constants::EMCAL_MAXTIMEBINS) {
234 LOG(error) <<
"Digit time sample " << timesample <<
" outside range [0," << o2::emcal::constants::EMCAL_MAXTIMEBINS <<
"]";
237 (*bunchDigits)[timesample] = &dig;
241 for (
const auto& [dig, labels] : boost::combine(
digits, mcLabels)) {
242 auto tower = dig.getTower();
243 if (tower != lasttower) {
246 std::cout <<
"Wrong cell ID " << tower << std::endl;
249 auto onlineindices = mGeometry->
getOnlineID(tower);
250 int sruID = std::get<0>(onlineindices);
252 auto towerdata = sruDigitContainer[sruID].mChannelsDigits.find(tower);
253 if (towerdata == sruDigitContainer[sruID].mChannelsDigits.end()) {
254 sruDigitContainer[sruID].mChannelsDigits[tower] = {dig.getType(), std::vector<const o2::emcal::Digit*>(o2::emcal::constants::EMCAL_MAXTIMEBINS), mPropagateMC ? std::vector<gsl::span<const o2::emcal::MCLabel>>(o2::emcal::constants::EMCAL_MAXTIMEBINS) : std::vector<gsl::span<const o2::emcal::MCLabel>>()};
255 bunchDigits = &(sruDigitContainer[sruID].mChannelsDigits[tower].mChannelDigits);
256 memset(bunchDigits->data(), 0,
sizeof(
o2::emcal::Digit*) * o2::emcal::constants::EMCAL_MAXTIMEBINS);
258 bunchLabels = &(sruDigitContainer[sruID].mChannelsDigits[tower].mChannelLabels);
259 memset(bunchLabels->data(), 0,
sizeof(gsl::span<const o2::emcal::MCLabel>) * o2::emcal::constants::EMCAL_MAXTIMEBINS);
262 bunchDigits = &(towerdata->second.mChannelDigits);
264 bunchLabels = &(towerdata->second.mChannelLabels);
272 auto timesample =
int(dig.getTimeStamp() / emcal::constants::EMCAL_TIMESAMPLE);
273 if (timesample >= o2::emcal::constants::EMCAL_MAXTIMEBINS) {
274 LOG(error) <<
"Digit time sample " << timesample <<
" outside range [0," << o2::emcal::constants::EMCAL_MAXTIMEBINS <<
"]";
277 (*bunchDigits)[timesample] = &dig;
279 (*bunchLabels)[timesample] = labels;
284 for (
auto srucont : sruDigitContainer) {
286 if (srucont.mSRUid == 21 || srucont.mSRUid == 22 || srucont.mSRUid == 36 || srucont.mSRUid == 39) {
290 for (
const auto& [tower, channelDigits] : srucont.mChannelsDigits) {
292 std::vector<o2::emcal::Bunch> rawbunchesHG;
293 std::vector<o2::emcal::Bunch> rawbunchesLG;
294 std::vector<std::vector<o2::emcal::MCLabel>> rawLabelsHG;
295 std::vector<std::vector<o2::emcal::MCLabel>> rawLabelsLG;
297 bool saturatedBunch =
false;
301 rawbunchesHG.emplace_back(bunch.mADCs.size(), bunch.mStarttime);
302 for (
auto adc : bunch.mADCs) {
303 rawbunchesHG.back().addADC(
adc);
304 if (
adc > o2::emcal::constants::LG_SUPPRESSION_CUT) {
305 saturatedBunch =
true;
309 rawLabelsHG.push_back(bunch.mLabels);
314 if (saturatedBunch) {
316 rawbunchesLG.emplace_back(bunch.mADCs.size(), bunch.mStarttime);
317 for (
auto adc : bunch.mADCs) {
318 rawbunchesLG.back().addADC(
adc);
321 rawLabelsLG.push_back(bunch.mLabels);
326 sruBunchContainer[srucont.mSRUid].mChannelsData[tower] = {channelDigits.mChanType, rawbunchesHG, rawbunchesLG, rawLabelsHG, rawLabelsLG};
330 return sruBunchContainer;
335 std::vector<AltroBunch>
result;
337 bool bunchStarted =
false;
340 for (itime = channelDigits.size() - 1; itime >= 0; itime--) {
341 auto dig = channelDigits[itime];
342 gsl::span<const o2::emcal::MCLabel> labels;
344 labels = mcLabels[itime];
350 if (currentBunch.
mADCs.size() >= 3) {
352 result.push_back(currentBunch);
354 bunchStarted =
false;
359 int adc = dig->getAmplitudeADC(channelType);
366 if (currentBunch.
mADCs.size() >= 3) {
368 result.push_back(currentBunch);
370 bunchStarted =
false;
379 currentBunch.
mADCs.emplace_back(
adc);
381 std::vector<o2::emcal::MCLabel> vectorLabels;
382 for (
auto&
label : labels) {
383 vectorLabels.push_back(
label);
385 currentBunch.
mEnergyLabels.insert(std::pair<
int, std::vector<o2::emcal::MCLabel>>(
adc, vectorLabels));
390 if (currentBunch.
mADCs.size() >= 3) {
391 result.push_back(currentBunch);
403 for (
auto& altroBunch : channelBunches) {
404 std::vector<o2::emcal::MCLabel> mcLabels;
405 std::map<uint64_t, std::vector<o2::emcal::MCLabel>> LabelsPerSource;
406 double totalEnergy = 0;
407 for (
auto& [energy, Labels] : altroBunch.mEnergyLabels) {
408 for (
auto& trueLabel : Labels) {
411 LabelsPerSource[newLabel.
getRawValue()].push_back(newLabel);
413 totalEnergy += energy;
416 for (
auto& [trackID, labels] : LabelsPerSource) {
418 for (
int ilabel = 0; ilabel < labels.size(); ilabel++) {
419 auto& trueLabel = labels[ilabel];
426 mcLabels.push_back(newLabel);
429 std::sort(mcLabels.begin(), mcLabels.end(), [](
o2::emcal::MCLabel label1,
o2::emcal::MCLabel label2) { return label1.getAmplitudeFraction() > label2.getAmplitudeFraction(); });
431 altroBunch.mLabels = mcLabels;
434 altroBunch.mEnergyLabels.clear();
459 std::vector<o2::framework::InputSpec> inputs;
460 std::vector<o2::framework::OutputSpec> outputs;
462 inputs.emplace_back(
"triggers",
"EMC",
"DIGITSTRGR", inputSubspec, o2::framework::Lifetime::Timeframe);
463 outputs.emplace_back(
"EMC",
"CELLS", outputSubspec, o2::framework::Lifetime::Timeframe);
464 outputs.emplace_back(
"EMC",
"CELLSTRGR", outputSubspec, o2::framework::Lifetime::Timeframe);
466 inputs.emplace_back(
"digitsmctr",
"EMC",
"DIGITSMCTR", inputSubspec, o2::framework::Lifetime::Timeframe);
467 outputs.emplace_back(
"EMC",
"CELLSMCTR", outputSubspec, o2::framework::Lifetime::Timeframe);
469 auto calibhandler = std::make_shared<o2::emcal::CalibLoader>();
470 calibhandler->enableRecoParams(
true);
471 calibhandler->defineInputSpecs(inputs);
475 o2::framework::adaptFromTask<o2::emcal::reco_workflow::CellConverterSpec>(propagateMC, inputSubspec, outputSubspec, calibhandler),
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.