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.