File indexing completed on 2024-04-06 12:12:20
0001
0002 #include "FWCore/Framework/interface/one/OutputModule.h"
0003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0004
0005 #include "DataFormats/Common/interface/Handle.h"
0006 #include "DataFormats/Common/interface/TriggerResults.h"
0007 #include "DataFormats/Provenance/interface/ModuleDescription.h"
0008 #include "FWCore/Framework/interface/EventForOutput.h"
0009 #include "FWCore/Framework/interface/LuminosityBlockForOutput.h"
0010 #include "FWCore/Framework/interface/MakerMacros.h"
0011 #include "FWCore/Framework/interface/RunForOutput.h"
0012 #include "FWCore/ServiceRegistry/interface/ModuleCallingContext.h"
0013
0014 #include <cassert>
0015 #include <string>
0016 #include <iostream>
0017 #include <algorithm>
0018 #include <numeric>
0019 #include <iterator>
0020
0021 using namespace edm;
0022
0023 using Trig = detail::TriggerResultsBasedEventSelector::handle_t;
0024
0025 namespace {
0026
0027 void printBits(unsigned char c) {
0028
0029
0030 for (int i = 7; i >= 0; --i) {
0031 int bit = ((c >> i) & 1);
0032 std::cout << " " << bit;
0033 }
0034 }
0035
0036 void packIntoString(std::vector<unsigned char> const& source, std::vector<unsigned char>& package) {
0037 unsigned int packInOneByte = 4;
0038 unsigned int sizeOfPackage = 1 + ((source.size() - 1) / packInOneByte);
0039 if (source.size() == 0)
0040 sizeOfPackage = 0;
0041
0042 package.resize(sizeOfPackage);
0043 memset(&package[0], 0x00, sizeOfPackage);
0044
0045 for (unsigned int i = 0; i != source.size(); ++i) {
0046 unsigned int whichByte = i / packInOneByte;
0047 unsigned int indxWithinByte = i % packInOneByte;
0048 package[whichByte] = package[whichByte] | (source[i] << (indxWithinByte * 2));
0049 }
0050
0051
0052 std::cout << std::endl;
0053 }
0054
0055 }
0056 namespace edmtest {
0057
0058 class TestOutputModule : public edm::one::OutputModule<> {
0059 public:
0060 explicit TestOutputModule(edm::ParameterSet const&);
0061 virtual ~TestOutputModule();
0062
0063 private:
0064 Trig getTriggerResults(EDGetTokenT<TriggerResults> const& token, EventForOutput const& e) const;
0065
0066 virtual void write(edm::EventForOutput const& e) override;
0067 virtual void writeLuminosityBlock(edm::LuminosityBlockForOutput const&) override;
0068 virtual void writeRun(edm::RunForOutput const&) override;
0069 virtual void endJob() override;
0070
0071 std::string name_;
0072 int bitMask_;
0073 std::vector<unsigned char> hltbits_;
0074 bool expectTriggerResults_;
0075 edm::EDGetTokenT<edm::TriggerResults> resultsToken_;
0076 };
0077
0078
0079
0080 TestOutputModule::TestOutputModule(edm::ParameterSet const& ps)
0081 : edm::one::OutputModuleBase(ps),
0082 edm::one::OutputModule<>(ps),
0083 name_(ps.getParameter<std::string>("name")),
0084 bitMask_(ps.getParameter<int>("bitMask")),
0085 hltbits_(0),
0086 expectTriggerResults_(ps.getUntrackedParameter<bool>("expectTriggerResults", true)),
0087 resultsToken_(consumes(edm::InputTag("TriggerResults"))) {}
0088
0089 TestOutputModule::~TestOutputModule() {}
0090
0091 Trig TestOutputModule::getTriggerResults(EDGetTokenT<TriggerResults> const& token,
0092 EventForOutput const& event) const {
0093 return event.getHandle(token);
0094 }
0095
0096 void TestOutputModule::write(edm::EventForOutput const& e) {
0097 assert(e.moduleCallingContext()->moduleDescription()->moduleLabel() == description().moduleLabel());
0098
0099 Trig prod;
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 if (!expectTriggerResults_) {
0115 try {
0116 prod = getTriggerResults(resultsToken_, e);
0117
0118 *prod;
0119 } catch (const cms::Exception&) {
0120
0121 return;
0122 }
0123 std::cerr << "\nTestOutputModule::write\n"
0124 << "Expected there to be no TriggerResults object but we found one" << std::endl;
0125 abort();
0126 }
0127
0128
0129
0130
0131 prod = getTriggerResults(resultsToken_, e);
0132
0133 std::vector<unsigned char> vHltState;
0134
0135 std::vector<std::string> hlts = getAllTriggerNames();
0136 unsigned int hltSize = hlts.size();
0137
0138 for (unsigned int i = 0; i != hltSize; ++i) {
0139 vHltState.push_back(((prod->at(i)).state()));
0140 }
0141
0142
0143 packIntoString(vHltState, hltbits_);
0144
0145
0146 std::cout << "Size of hltbits:" << hltbits_.size() << std::endl;
0147
0148 char* intp = (char*)&bitMask_;
0149 bool matched = false;
0150
0151 for (int i = hltbits_.size() - 1; i != -1; --i) {
0152 std::cout << std::endl << "Current Bits Mask byte:";
0153 printBits(hltbits_[i]);
0154 unsigned char tmp = static_cast<unsigned char>(*(intp + i));
0155 std::cout << std::endl << "Original Byte:";
0156 printBits(tmp);
0157 std::cout << std::endl;
0158
0159 if (tmp == hltbits_[i])
0160 matched = true;
0161 }
0162 std::cout << "\n";
0163
0164 if (!matched && hltSize > 0) {
0165 std::cerr << "\ncfg bitMask is different from event..aborting." << std::endl;
0166
0167 abort();
0168 } else
0169 std::cout << "\nSUCCESS: Found Matching Bits" << std::endl;
0170 }
0171
0172 void TestOutputModule::writeLuminosityBlock(edm::LuminosityBlockForOutput const& lb) {
0173 assert(lb.moduleCallingContext()->moduleDescription()->moduleLabel() == description().moduleLabel());
0174 }
0175
0176 void TestOutputModule::writeRun(edm::RunForOutput const& r) {
0177 assert(r.moduleCallingContext()->moduleDescription()->moduleLabel() == description().moduleLabel());
0178 }
0179
0180 void TestOutputModule::endJob() {}
0181 }
0182 using edmtest::TestOutputModule;
0183
0184 DEFINE_FWK_MODULE(TestOutputModule);