00001
00017
00018 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtPatternGenerator.h"
00019
00020
00021 #include <memory>
00022 #include <iomanip>
00023 #include <fstream>
00024
00025
00026 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctCollections.h"
00027 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctHtMiss.h"
00028 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTCand.h"
00029 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuRegionalCand.h"
00030 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
00031 #include "DataFormats/L1GlobalTrigger/interface/L1GtFdlWord.h"
00032 #include "FWCore/Framework/interface/ESHandle.h"
00033 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00034 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtUtils.h"
00035 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtPatternMap.h"
00036 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtPatternWriter.h"
00037
00038
00039 L1GtPatternGenerator::L1GtPatternGenerator(const edm::ParameterSet& parSet)
00040 {
00041
00042 m_gctTag = parSet.getParameter<edm::InputTag>("GctInputTag");
00043 m_gmtTag = parSet.getParameter<edm::InputTag>("GmtInputTag");
00044 m_gtTag = parSet.getParameter<edm::InputTag>("GtInputTag");
00045 m_dtTag = parSet.getParameter<edm::InputTag>("DtInputTag");
00046 m_cscTag = parSet.getParameter<edm::InputTag>("CscInputTag");
00047 m_rpcbTag = parSet.getParameter<edm::InputTag>("RpcbInputTag");
00048 m_rpcfTag = parSet.getParameter<edm::InputTag>("RpcfInputTag");
00049
00050
00051 m_header = parSet.getParameter<std::string>("PatternFileHeader");
00052 m_footer = parSet.getParameter<std::string>("PatternFileFooter");
00053 m_columnNames = parSet.getParameter<std::vector<std::string> >("PatternFileColumns");
00054 m_columnLengths = parSet.getParameter<std::vector<uint32_t> >("PatternFileLengths");
00055 m_columnDefaults = parSet.getParameter<std::vector<uint32_t> >("PatternFileDefaultValues");
00056 m_fileName = parSet.getParameter<std::string>("PatternFileName");
00057 m_bx = parSet.getParameter<std::vector<int> >("bx");
00058 m_debug = parSet.getParameter<bool>("DebugOutput");
00059
00060
00061 if(m_columnLengths.size() != m_columnNames.size()) {
00062 edm::LogWarning("L1GtPatternGenerator")
00063 << "Length of PatternFileColumns does not match length of PatternFileLenghts, " <<
00064 m_columnNames.size() << " vs " << m_columnLengths.size() << std::endl;
00065 }
00066
00067 LogDebug("L1GtPatternGenerator")
00068 << "\nL1 GCT record: "
00069 << m_gctTag
00070 << "\nL1 GMT record: "
00071 << m_gmtTag
00072 << "\nL1 GT record: "
00073 << m_gtTag << std::endl;
00074 }
00075
00076
00077 L1GtPatternGenerator::~L1GtPatternGenerator()
00078 {}
00079
00080
00081
00098 template <class TRecord, typename TResult> static void extractRecordData(const edm::Event& iEvent,
00099 L1GtPatternMap& allPatterns,
00100 const std::string& label,
00101 const std::string& instance,
00102 TResult (TRecord::*rawFunctionPtr)() const,
00103 const std::string& prefix,
00104 uint32_t (*packingFunction)(uint32_t) = NULL)
00105 {
00106 uint32_t valueCount;
00107
00108
00109 edm::Handle<std::vector<TRecord> > handle;
00110 iEvent.getByLabel(label, instance, handle);
00111
00112 if(!handle.isValid()) {
00113 throw cms::Exception(__func__) << "Failed to extract record of type " << typeid(TRecord).name() <<
00114 " labeled " << label << ", instance " << instance;
00115 }
00116
00117 edm::EventNumber_t eventNr = iEvent.id().event();
00118
00119
00120 for(typename std::vector<TRecord>::const_iterator it = handle->begin(); it != handle->end(); ++it) {
00121 int bx = it->bx();
00122 L1GtPatternLine& line = allPatterns.getLine(eventNr, bx);
00123 uint32_t value = ((*it).*rawFunctionPtr)();
00124 if(packingFunction != NULL) {
00125 value = packingFunction(value);
00126 }
00127
00128 line.push(prefix, value);
00129 ++valueCount;
00130 }
00131 }
00132
00133
00134
00135 static std::vector<uint32_t> chopWords(const std::vector<bool>& aWord) {
00136 std::vector<uint32_t> result;
00137
00138 result.resize((aWord.size()+31)/32, 0);
00139
00140 for(unsigned i = 0 ; i < aWord.size(); ++i) {
00141 result[i/32] |= aWord[i] << (i%32);
00142 }
00143
00144 return result;
00145 }
00146
00150 static void extractGlobalTriggerWord(const std::vector<bool> input, L1GtPatternLine& line, const std::string& prefix)
00151 {
00152 std::vector<uint32_t> resultWords = chopWords(input);
00153
00154
00155
00156 for(unsigned i = resultWords.size() ; i > 0; --i) {
00157 line.push(prefix, resultWords[i-1]);
00158 }
00159 }
00160
00164 uint32_t L1GtPatternGenerator::packRegionalMuons(uint32_t rawData) {
00165 uint32_t invertMask = 0x0000FF00;
00166 uint32_t toKeep = rawData & (~invertMask);
00167 return toKeep | (~rawData & invertMask);
00168 }
00169
00170
00171
00172 void L1GtPatternGenerator::extractGlobalTriggerData(const edm::Event& iEvent, L1GtPatternMap& patterns) {
00173
00174
00175 edm::Handle<L1GlobalTriggerReadoutRecord> handle;
00176 iEvent.getByLabel(m_gtTag, handle);
00177
00178
00179 if(!handle.isValid()) {
00180 throw cms::Exception(__func__) << "Failed to extract GT readout record labeled "
00181 << m_gtTag.label() << ", instance " << m_gtTag.instance();
00182 }
00183
00184 edm::EventNumber_t eventNr = iEvent.id().event();
00185
00186
00187 const std::vector<L1GtFdlWord>& fdlWords = handle->gtFdlVector();
00188 for(std::vector<L1GtFdlWord>::const_iterator it = fdlWords.begin();
00189 it != fdlWords.end() ; ++it) {
00190
00191 int bx = it->bxInEvent();
00192
00193
00194 L1GtPatternLine& line = patterns.getLine(eventNr, bx);
00195
00196 extractGlobalTriggerWord(it->gtDecisionWord(), line, "gtDecision");
00197 extractGlobalTriggerWord(it->gtDecisionWordExtended(), line, "gtDecisionExt");
00198 extractGlobalTriggerWord(it->gtTechnicalTriggerWord(), line, "gtTechTrigger");
00199
00200 line.push("gtFinalOr", it->finalOR());
00201 }
00202 }
00203
00207 void L1GtPatternGenerator::packHfRecords(const std::string& resultName, L1GtPatternMap& allPatterns)
00208 {
00209
00210 for(L1GtPatternMap::LineMap::iterator it = allPatterns.begin();
00211 it != allPatterns.end(); ++it) {
00212
00213 uint32_t counts = it->second.get("hfBitCounts1");
00214 uint32_t sums = it->second.get("hfRingEtSums1");
00215
00216
00217
00218 uint32_t hfPsbValue = (counts & 0xFFF) |
00219
00220 (sums & 0x7) << 12 |
00221
00222 (sums >> 3) << 16;
00223
00224
00225
00226 it->second.push(resultName, hfPsbValue);
00227 }
00228 }
00229
00235 void L1GtPatternGenerator::analyze(const edm::Event& iEvent, const edm::EventSetup& evSetup)
00236 {
00237 L1GtPatternMap allPatterns;
00238
00239
00240 extractRecordData(iEvent, allPatterns, m_gmtTag.label(), m_gmtTag.instance(), &L1MuGMTCand::getDataWord, "gmtMuon");
00241
00242
00243 extractRecordData(iEvent, allPatterns, m_cscTag.label(), m_cscTag.instance(), &L1MuRegionalCand::getDataWord, "cscMuon", packRegionalMuons);
00244 extractRecordData(iEvent, allPatterns, m_dtTag.label(), m_dtTag.instance(), &L1MuRegionalCand::getDataWord, "dtMuon", packRegionalMuons);
00245 extractRecordData(iEvent, allPatterns, m_rpcfTag.label(), m_rpcfTag.instance(), &L1MuRegionalCand::getDataWord, "fwdMuon", packRegionalMuons);
00246 extractRecordData(iEvent, allPatterns, m_rpcbTag.label(), m_rpcbTag.instance(), &L1MuRegionalCand::getDataWord, "brlMuon", packRegionalMuons);
00247
00248
00249 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "nonIsoEm", &L1GctEmCand::raw, "gctEm");
00250 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "isoEm", &L1GctEmCand::raw, "gctIsoEm");
00251 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctEtMiss::et, "etMiss");
00252 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctEtMiss::phi, "etMissPhi");
00253 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctHtMiss::raw, "htMiss");
00254 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctEtHad::raw, "etHad");
00255 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctEtTotal::raw, "etTotal");
00256 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "cenJets", &L1GctJetCand::raw, "cenJet");
00257 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "forJets", &L1GctJetCand::raw, "forJet");
00258 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "tauJets", &L1GctJetCand::raw, "tauJet");
00259 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctHFBitCounts::raw, "hfBitCounts");
00260 extractRecordData(iEvent, allPatterns, m_gctTag.label(), "", &L1GctHFRingEtSums::raw, "hfRingEtSums");
00261
00262
00263
00264 packHfRecords("hfPsbValue", allPatterns);
00265
00266
00267 extractGlobalTriggerData(iEvent, allPatterns);
00268
00269
00270 m_writer->writePatterns(allPatterns);
00271 }
00272
00276 void L1GtPatternGenerator::beginJob()
00277 {
00278 m_fileStream.open(m_fileName.c_str());
00279
00280 if(!m_fileStream) {
00281 edm::LogError("L1GtPatternGenerator") << "Failed to open output file " << m_fileName;
00282 }
00283
00284 m_writer = std::auto_ptr<L1GtPatternWriter>(new L1GtPatternWriter(m_fileStream, m_header, m_footer, m_columnNames, m_columnLengths, m_columnDefaults, m_bx, m_debug));
00285 }
00286
00290 void L1GtPatternGenerator::endJob()
00291 {
00292 m_writer->close();
00293 m_fileStream.close();
00294 }