Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
#include "EventFilter/HcalRawToDigi/interface/HcalDataFrameFilter.h"
#include "CalibFormats/HcalObjects/interface/HcalCoderDb.h"
#include "CalibFormats/CaloObjects/interface/CaloSamples.h"
#include "CondFormats/HcalObjects/interface/HcalQIECoder.h"
#include "CondFormats/HcalObjects/interface/HcalQIEShape.h"

namespace HcalDataFrameFilter_impl {

  template <class DataFrame>
  bool check(const DataFrame& df, bool capcheck, bool dvercheck) {
    if (capcheck || dvercheck) {
      int lastcapid = 0, capid = 0;
      for (int i = 0; i < df.size(); i++) {
        capid = df[i].capid();
        if (capcheck && i != 0 && ((lastcapid + 1) % 4) != capid)
          return false;
        if (dvercheck && (df[i].er() || !df[i].dv()))
          return false;
        lastcapid = capid;
      }
    }
    return true;
  }

  template <>
  bool check<QIE10DataFrame>(const QIE10DataFrame& df, bool capcheck, bool linkerrcheck) {
    if (linkerrcheck && df.linkError())
      return false;
    if (capcheck) {
      for (int i = 0; i < df.samples(); i++) {
        if (!df[i].ok())
          return false;
      }
    }
    return true;
  }

  template <>
  bool check<QIE11DataFrame>(const QIE11DataFrame& df, bool capcheck, bool linkerrcheck) {
    if (linkerrcheck && df.linkError())
      return false;
    if (capcheck && df.capidError())
      return false;
    return true;
  }

  template <class DataFrame>
  double energySum(const DataFrame& df, int fs, int ls, const HcalDbService* conditions = nullptr) {
    double es = 0;
    for (int i = fs; i <= ls && i <= df.size(); i++)
      es += df[i].nominal_fC();
    return es;
  }

  template <>
  double energySum<QIE11DataFrame>(const QIE11DataFrame& df, int fs, int ls, const HcalDbService* conditions) {
    const HcalQIECoder* channelCoder = conditions->getHcalCoder(df.id());
    const HcalQIEShape* shape = conditions->getHcalShape(channelCoder);
    CaloSamples tool;
    HcalCoderDb coder(*channelCoder, *shape);
    coder.adc2fC(df, tool);
    double es = 0;
    for (int i = fs; i <= ls && i <= (int)df.samples(); i++)
      es += tool[i];
    return es;
  }

}  // namespace HcalDataFrameFilter_impl

HcalDataFrameFilter::HcalDataFrameFilter(
    bool requireCapid, bool requireDVER, bool energyFilter, int firstSample, int lastSample, double minAmpl)
    : requireCapid_(requireCapid),
      requireDVER_(requireDVER),
      energyFilter_(energyFilter),
      firstSample_(firstSample),
      lastSample_(lastSample),
      minimumAmplitude_(minAmpl),
      conditions_(nullptr) {}

void HcalDataFrameFilter::setConditions(const HcalDbService* conditions) { conditions_ = conditions; }

HBHEDigiCollection HcalDataFrameFilter::filter(const HBHEDigiCollection& incol, HcalUnpackerReport& r) {
  HBHEDigiCollection output;
  for (HBHEDigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    if (!HcalDataFrameFilter_impl::check(*i, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    else if (!energyFilter_ || minimumAmplitude_ < HcalDataFrameFilter_impl::energySum(*i, firstSample_, lastSample_))
      output.push_back(*i);
  }
  return output;
}

HODigiCollection HcalDataFrameFilter::filter(const HODigiCollection& incol, HcalUnpackerReport& r) {
  HODigiCollection output;
  for (HODigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    if (!HcalDataFrameFilter_impl::check(*i, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    else if (!energyFilter_ || minimumAmplitude_ < HcalDataFrameFilter_impl::energySum(*i, firstSample_, lastSample_))
      output.push_back(*i);
  }
  return output;
}

HcalCalibDigiCollection HcalDataFrameFilter::filter(const HcalCalibDigiCollection& incol, HcalUnpackerReport& r) {
  HcalCalibDigiCollection output;
  for (HcalCalibDigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    if (!HcalDataFrameFilter_impl::check(*i, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    else if (!energyFilter_ || minimumAmplitude_ < HcalDataFrameFilter_impl::energySum(*i, firstSample_, lastSample_))
      output.push_back(*i);
  }
  return output;
}

HFDigiCollection HcalDataFrameFilter::filter(const HFDigiCollection& incol, HcalUnpackerReport& r) {
  HFDigiCollection output;
  for (HFDigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    if (!HcalDataFrameFilter_impl::check(*i, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    else if (!energyFilter_ || minimumAmplitude_ < HcalDataFrameFilter_impl::energySum(*i, firstSample_, lastSample_))
      output.push_back(*i);
  }
  return output;
}

ZDCDigiCollection HcalDataFrameFilter::filter(const ZDCDigiCollection& incol, HcalUnpackerReport& r) {
  ZDCDigiCollection output;
  for (ZDCDigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    if (!HcalDataFrameFilter_impl::check(*i, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    else if (!energyFilter_ || minimumAmplitude_ < HcalDataFrameFilter_impl::energySum(*i, firstSample_, lastSample_))
      output.push_back(*i);
  }
  return output;
}

QIE10DigiCollection HcalDataFrameFilter::filter(const QIE10DigiCollection& incol, HcalUnpackerReport& r) {
  QIE10DigiCollection output(incol.samples());
  for (QIE10DigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    QIE10DataFrame df(*i);
    if (!HcalDataFrameFilter_impl::check(df, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    // Never exclude QIE10 digis as their absence would be
    // treated as a digi with zero charged deposited in that channel
    output.push_back(df);
  }
  return output;
}

QIE11DigiCollection HcalDataFrameFilter::filter(const QIE11DigiCollection& incol, HcalUnpackerReport& r) {
  QIE11DigiCollection output(incol.samples());
  for (QIE11DigiCollection::const_iterator i = incol.begin(); i != incol.end(); i++) {
    QIE11DataFrame df(*i);
    if (!HcalDataFrameFilter_impl::check(df, requireCapid_, requireDVER_))
      r.countBadQualityDigi(i->id());
    else if (!energyFilter_ ||
             minimumAmplitude_ < HcalDataFrameFilter_impl::energySum(df, firstSample_, lastSample_, conditions_))
      output.push_back(df);
  }
  return output;
}

bool HcalDataFrameFilter::active() const { return requireCapid_ | requireDVER_ | energyFilter_; }