32  mCellAmplitude = std::unique_ptr<TH2>(
new TH2F(
"mCellAmplitude", 
"Cell amplitude", 800, 0., 40., 17664, -0.5, 17663.5));
 
   34  mCellTime = std::unique_ptr<TH2>(
new TH2F(
"mCellTime", 
"Cell time", 800, -200, 600, 17664, -0.5, 17663.5));
 
   36  mCellTimeLG = std::unique_ptr<TH2>(
new TH2F(
"mCellTimeLG", 
"Cell time (low gain)", 800, -200, 600, 17664, -0.5, 17663.5));
 
   38  mCellTimeHG = std::unique_ptr<TH2>(
new TH2F(
"mCellTimeHG", 
"Cell time (high gain)", 800, -200, 600, 17664, -0.5, 17663.5));
 
   40  mNevents = std::unique_ptr<TH1>(
new TH1F(
"mNevents", 
"Number of events", 1, 0.5, 1.5));
 
   41  if (mMakeCellIDTimeEnergy) {
 
   43    std::array<int, 3> arrNBins = {17664, 100, 100}; 
 
   44    std::array<double, 3> arrMin = {-0.5, -50, 0};
 
   45    std::array<double, 3> arrMax = {17663.5, 50., 50};
 
   46    mCellTimeEnergy = std::unique_ptr<THnSparseF>(
new THnSparseF(
"CellIDvsTimevsEnergy", 
"CellIDvsTimevsEnergy", arrNBins.size(), arrNBins.data(), arrMin.data(), arrMax.data()));
 
 
   52  LOG(info) << 
"Handling new Calibration objects";
 
   53  mCalibrationHandler->finalizeCCDB(matcher, obj);
 
   56    LOG(info) << 
"EMCal CalibParams updated";
 
   63    mSelectedClassMasks.clear();
 
   65    std::string delimiter = 
":";
 
   67    std::vector<std::string> vSelMasks;
 
   68    while ((
pos = strSelClassMasks.find(delimiter)) != std::string::npos) {
 
   69      vSelMasks.push_back(strSelClassMasks.substr(0, 
pos));
 
   70      strSelClassMasks.erase(0, 
pos + delimiter.length());
 
   72    vSelMasks.push_back(strSelClassMasks);
 
   76    for (
auto& cls : ctpconf->getCTPClasses()) {
 
   77      LOG(
debug) << 
"CTP class: " << cls.name << 
"\t " << cls.classMask;
 
   79      if (std::find(vSelMasks.begin(), vSelMasks.end(), cls.name) != vSelMasks.end()) {
 
   80        mSelectedClassMasks.push_back(cls.classMask);
 
   81        LOG(info) << 
"Setting selected class mask " << cls.name << 
" to bit " << cls.classMask;
 
 
   98  auto triggerrecords = pc.
inputs().
get<gsl::span<o2::emcal::TriggerRecord>>(
"triggerrecord");
 
  101  if (mRejectL0Triggers) {
 
  106  std::optional<ctpDigitsType> ctpDigits;
 
  107  if (mRejectL0Triggers) {
 
  111  mCalibrationHandler->checkUpdates(pc);
 
  112  updateCalibObjects();
 
  114  LOG(
debug) << 
"[EMCALOfflineCalib - run] received " << 
cells.size() << 
" cells from " << triggerrecords.size() << 
" triggers ...";
 
  115  if (triggerrecords.size()) {
 
  116    for (
const auto& trg : triggerrecords) {
 
  117      if (!trg.getNumberOfObjects()) {
 
  118        LOG(
debug) << 
"[EMCALOfflineCalib - run] Trigger does not contain cells, skipping ...";
 
  123      if (mRejectCalibTriggers) {
 
  126          LOG(
debug) << 
"skipping triggered events due to wrong trigger (no Physics trigger)";
 
  132      uint64_t classMaskCTP = 0;
 
  133      if (mRejectL0Triggers) {
 
  134        bool acceptEvent = 
false;
 
  136        int64_t bcEMC = trg.getBCData().toLong();
 
  137        for (
auto& ctpDigit : *ctpDigits) {
 
  138          int64_t bcCTP = ctpDigit.intRecord.toLong();
 
  139          LOG(
debug) << 
"bcEMC " << bcEMC << 
"   bcCTP " << bcCTP;
 
  140          if (bcCTP == bcEMC) {
 
  142            classMaskCTP = ctpDigit.CTPClassMask.to_ulong();
 
  144            for (
const uint64_t& selectedClassMask : mSelectedClassMasks) {
 
  145              if ((classMaskCTP & selectedClassMask) != 0) {
 
  146                LOG(
debug) << 
"trigger " << selectedClassMask << 
" found! accepting event";
 
  160      LOG(
debug) << 
"[EMCALOfflineCalib - run] Trigger has " << trg.getNumberOfObjects() << 
" cells  ..." << std::endl;
 
  161      gsl::span<const o2::emcal::Cell> objectsTrigger(
cells.data() + trg.getFirstEntry(), trg.getNumberOfObjects());
 
  162      for (
const auto& 
c : objectsTrigger) {
 
  163        LOG(
debug) << 
"[EMCALOfflineSpec - run] Channel: " << 
c.getTower();
 
  164        LOG(
debug) << 
"[EMCALOfflineSpec - run] Energy: " << 
c.getEnergy();
 
  165        LOG(
debug) << 
"[EMCALOfflineSpec - run] Time: " << 
c.getTimeStamp();
 
  166        LOG(
debug) << 
"[EMCALOfflineSpec - run] IsLowGain: " << 
c.getLowGain();
 
  167        float cellE = 
c.getEnergy();
 
  168        if (mGainCalibFactors && mCalibrationHandler->hasGainCalib()) {
 
  171          LOG(
debug) << 
"[EMCALOfflineSpec - run] corrected Energy: " << cellE;
 
  173        mCellAmplitude->Fill(cellE, 
c.getTower());
 
  175          mCellTime->Fill(
c.getTimeStamp(), 
c.getTower());
 
  176          if (
c.getLowGain()) {
 
  177            mCellTimeLG->Fill(
c.getTimeStamp(), 
c.getTower());
 
  179            mCellTimeHG->Fill(
c.getTimeStamp(), 
c.getTower());
 
  181          if (mMakeCellIDTimeEnergy) {
 
  182            mCellTimeEnergy->Fill(
c.getTower(), 
c.getTimeStamp(), cellE);
 
 
  210  std::vector<o2::framework::InputSpec>
 
  214  if (rejectL0Trigger) {
 
  218  auto calibhandler = std::make_shared<o2::emcal::CalibLoader>();
 
  219  calibhandler->enableGainCalib(enableGainCalib);
 
  220  calibhandler->defineInputSpecs(inputs);
 
  225                                          o2::framework::adaptFromTask<o2::emcal::OfflineCalibSpec>(makeCellIDTimeEnergy, rejectCalibTriggers, rejectL0Trigger, calibhandler)};
 
 
InputRecord & inputs()
The inputs associated with this processing context.
o2::framework::DataProcessorSpec getEmcalOfflineCalibSpec(bool makeCellIDTimeEnergy, bool rejectCalibTriggers, bool rejectL0Trigger, uint32_t inputsubspec, bool enableGainCalib, bool ctpcfgperrun)
Creating offline calib spec.