File indexing completed on 2024-04-06 12:06:48
0001 #include "DataFormats/Common/interface/Handle.h"
0002 #include "DataFormats/OnlineMetaData/interface/DCSRecord.h"
0003 #include "DataFormats/Scalers/interface/DcsStatus.h"
0004 #include "FWCore/Framework/interface/stream/EDFilter.h"
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/Framework/interface/Event.h"
0010
0011 class DetStatus : public edm::stream::EDFilter<> {
0012 public:
0013 DetStatus(const edm::ParameterSet&);
0014 ~DetStatus() override;
0015
0016 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0017
0018 private:
0019 bool filter(edm::Event&, edm::EventSetup const&) override;
0020
0021 bool verbose_;
0022 bool applyfilter_;
0023 bool AndOr_;
0024 std::vector<std::string> DetNames_;
0025 std::bitset<DcsStatus::nPartitions> requestedPartitions_;
0026 unsigned int DetMap_;
0027 edm::EDGetTokenT<DcsStatusCollection> scalersToken_;
0028 edm::EDGetTokenT<DCSRecord> dcsRecordToken_;
0029
0030 bool checkForDCSStatus(const DcsStatusCollection& dcsStatus);
0031 bool checkForDCSRecord(const DCSRecord& dcsRecod);
0032 };
0033
0034 using namespace std;
0035
0036
0037
0038
0039 DetStatus::DetStatus(const edm::ParameterSet& pset) {
0040 verbose_ = pset.getUntrackedParameter<bool>("DebugOn", false);
0041 AndOr_ = pset.getParameter<bool>("AndOr");
0042 applyfilter_ = pset.getParameter<bool>("ApplyFilter");
0043 DetNames_ = pset.getParameter<std::vector<std::string>>("DetectorType");
0044
0045
0046 DetMap_ = 0;
0047
0048 for (unsigned int detreq = 0; detreq < DetNames_.size(); detreq++) {
0049 for (unsigned int detlist = 0; detlist < DcsStatus::nPartitions; detlist++) {
0050 if (DetNames_[detreq] == DcsStatus::partitionName[detlist]) {
0051
0052
0053
0054 requestedPartitions_.set(detlist, true);
0055
0056
0057 DetMap_ |= (1 << DcsStatus::partitionList[detlist]);
0058
0059 if (verbose_) {
0060 edm::LogInfo("DetStatus") << "DCSStatus filter: asked partition " << DcsStatus::partitionName[detlist]
0061 << " bit " << DcsStatus::partitionList[detlist] << std::endl;
0062 }
0063 }
0064 }
0065 }
0066 scalersToken_ = consumes<DcsStatusCollection>(edm::InputTag("scalersRawToDigi"));
0067 dcsRecordToken_ = consumes<DCSRecord>(edm::InputTag("onlineMetaDataDigis"));
0068 }
0069
0070
0071
0072
0073 DetStatus::~DetStatus() = default;
0074
0075
0076 bool DetStatus::checkForDCSStatus(const DcsStatusCollection& dcsStatus)
0077
0078 {
0079 if (verbose_) {
0080 edm::LogInfo("DetStatus") << "Using FED#735 for reading DCS bits" << std::endl;
0081 }
0082
0083 bool accepted = false;
0084 unsigned int curr_dcs = (dcsStatus)[0].ready();
0085 if (verbose_) {
0086 edm::LogVerbatim("DetStatus") << "curr_dcs = " << curr_dcs << std::endl;
0087 }
0088
0089 if (AndOr_)
0090 accepted = ((DetMap_ & curr_dcs) == DetMap_);
0091 else
0092 accepted = ((DetMap_ & curr_dcs) != 0);
0093
0094 if (verbose_) {
0095 edm::LogInfo("DetStatus") << "DCSStatus filter: requested map: " << DetMap_ << " dcs in event: " << curr_dcs
0096 << " filter: " << accepted << "( AndOr: " << AndOr_ << ")" << std::endl;
0097 edm::LogVerbatim("DetStatus") << "Partitions ON: ";
0098 for (unsigned int detlist = 0; detlist < DcsStatus::nPartitions; detlist++) {
0099 if ((dcsStatus)[0].ready(DcsStatus::partitionList[detlist])) {
0100 edm::LogVerbatim("DetStatus") << " " << DcsStatus::partitionName[detlist];
0101 }
0102 }
0103 edm::LogVerbatim("DetStatus") << std::endl;
0104 }
0105 return accepted;
0106 }
0107
0108
0109 bool DetStatus::checkForDCSRecord(const DCSRecord& dcsRecord)
0110
0111 {
0112 bool accepted = false;
0113
0114 if (verbose_) {
0115 edm::LogInfo("DetStatus") << "Using softFED#1022 for reading DCS bits" << std::endl;
0116 }
0117
0118 for (unsigned int detlist = 0; detlist < DcsStatus::nPartitions; detlist++) {
0119 if (verbose_)
0120 edm::LogInfo("DetStatus") << "testing " << DcsStatus::partitionName[detlist];
0121 if (requestedPartitions_.test(detlist)) {
0122 if (verbose_)
0123 edm::LogInfo("DetStatus") << " " << DcsStatus::partitionName[detlist] << "in the requested list" << std::endl;
0124 if (AndOr_) {
0125 accepted = dcsRecord.highVoltageReady(detlist);
0126 if (!accepted)
0127 break;
0128 } else {
0129 accepted = (accepted || dcsRecord.highVoltageReady(detlist));
0130 }
0131 }
0132 }
0133
0134 if (verbose_) {
0135 edm::LogInfo("DetStatus") << "DCSStatus filter: " << accepted << " ( AndOr: " << AndOr_ << ")" << std::endl;
0136 edm::LogVerbatim("DetStatus") << "Partitions ON: ";
0137 for (unsigned int detlist = 0; detlist < DcsStatus::nPartitions; detlist++) {
0138 if ((dcsRecord.highVoltageReady(detlist))) {
0139 edm::LogVerbatim("DetStatus") << " " << DcsStatus::partitionName[detlist];
0140 }
0141 }
0142 edm::LogVerbatim("DetStatus") << std::endl;
0143 }
0144
0145 return accepted;
0146 }
0147
0148
0149 bool DetStatus::filter(edm::Event& evt, edm::EventSetup const& es)
0150
0151 {
0152 bool accepted = false;
0153
0154
0155
0156
0157
0158 edm::Handle<DcsStatusCollection> dcsStatus;
0159 evt.getByToken(scalersToken_, dcsStatus);
0160 edm::Handle<DCSRecord> dcsRecord;
0161 evt.getByToken(dcsRecordToken_, dcsRecord);
0162
0163
0164 if (dcsStatus.isValid() && !dcsStatus->empty()) {
0165 accepted = checkForDCSStatus(*dcsStatus);
0166 } else if (dcsRecord.isValid()) {
0167 if (evt.eventAuxiliary().isRealData()) {
0168
0169 accepted = checkForDCSRecord(*dcsRecord);
0170 } else {
0171
0172 accepted = true;
0173 }
0174 } else {
0175 edm::LogError("DetStatus")
0176 << "Error! can't get the product, neither DCSRecord, nor scalersRawToDigi: accept in any case!";
0177 accepted = true;
0178 }
0179
0180 if (!applyfilter_) {
0181 accepted = true;
0182 }
0183
0184 return accepted;
0185 }
0186
0187
0188 void DetStatus::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0189 edm::ParameterSetDescription desc;
0190 desc.addUntracked<bool>("DebugOn", false);
0191 desc.add<bool>("AndOr", true);
0192 desc.add<bool>("ApplyFilter", true);
0193 desc.add<std::vector<std::string>>("DetectorType", {});
0194 descriptions.add("detStatus", desc);
0195 }
0196
0197 #include "FWCore/Framework/interface/MakerMacros.h"
0198 DEFINE_FWK_MODULE(DetStatus);