Go to the documentation of this file.00001
00018
00019 #include "EventFilter/L1GlobalTriggerRawToDigi/interface/L1GlobalTriggerRecordProducer.h"
00020
00021
00022 #include <iostream>
00023
00024 #include <boost/cstdint.hpp>
00025
00026
00027 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
00028 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerRecord.h"
00029
00030 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00031 #include "FWCore/Utilities/interface/InputTag.h"
00032
00033 #include "FWCore/Framework/interface/EventSetup.h"
00034 #include "FWCore/Framework/interface/ESHandle.h"
00035
00036 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00037 #include "FWCore/MessageLogger/interface/MessageDrop.h"
00038
00039 #include "CondFormats/L1TObjects/interface/L1GtTriggerMask.h"
00040 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskAlgoTrigRcd.h"
00041 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskTechTrigRcd.h"
00042
00043
00044 L1GlobalTriggerRecordProducer::L1GlobalTriggerRecordProducer(const edm::ParameterSet& parSet)
00045 {
00046
00047 produces<L1GlobalTriggerRecord>();
00048
00049
00050 m_l1GtReadoutRecordTag =
00051 parSet.getParameter<edm::InputTag>("L1GtReadoutRecordTag");
00052
00053 LogDebug("L1GlobalTriggerRecordProducer")
00054 << "\nInput tag for L1 GT DAQ record: "
00055 << m_l1GtReadoutRecordTag
00056 << std::endl;
00057
00058
00059
00060 m_l1GtTmAlgoCacheID = 0ULL;
00061 m_l1GtTmTechCacheID = 0ULL;
00062
00063 }
00064
00065
00066 L1GlobalTriggerRecordProducer::~L1GlobalTriggerRecordProducer()
00067 {
00068
00069
00070
00071 }
00072
00073
00074
00075
00076 void L1GlobalTriggerRecordProducer::beginJob()
00077 {
00078
00079 }
00080
00081
00082 void L1GlobalTriggerRecordProducer::produce(edm::Event& iEvent, const edm::EventSetup& evSetup)
00083 {
00084
00085
00086 std::auto_ptr<L1GlobalTriggerRecord> gtRecord(new L1GlobalTriggerRecord());
00087
00088
00089 edm::Handle<L1GlobalTriggerReadoutRecord> gtReadoutRecord;
00090 iEvent.getByLabel(m_l1GtReadoutRecordTag, gtReadoutRecord);
00091
00092 if (!gtReadoutRecord.isValid()) {
00093
00094 LogDebug("L1GlobalTriggerRecordProducer")
00095 << "\n\n Error: no L1GlobalTriggerReadoutRecord found with input tag "
00096 << m_l1GtReadoutRecordTag
00097 << "\n Returning empty L1GlobalTriggerRecord.\n\n"
00098 << std::endl;
00099
00100 iEvent.put( gtRecord );
00101 return;
00102 }
00103
00104
00105 boost::uint16_t gtFinalOR = gtReadoutRecord->finalOR();
00106 int physicsDaqPartition = 0;
00107 bool gtDecision = static_cast<bool> (gtFinalOR & (1 << physicsDaqPartition));
00108
00109 DecisionWord algoDecisionWord = gtReadoutRecord->decisionWord();
00110 TechnicalTriggerWord techDecisionWord = gtReadoutRecord->technicalTriggerWord();
00111
00112
00113
00114
00115 unsigned long long l1GtTmAlgoCacheID =
00116 evSetup.get<L1GtTriggerMaskAlgoTrigRcd>().cacheIdentifier();
00117
00118 if (m_l1GtTmAlgoCacheID != l1GtTmAlgoCacheID) {
00119
00120 edm::ESHandle< L1GtTriggerMask > l1GtTmAlgo;
00121 evSetup.get< L1GtTriggerMaskAlgoTrigRcd >().get( l1GtTmAlgo );
00122 m_l1GtTmAlgo = l1GtTmAlgo.product();
00123
00124 m_triggerMaskAlgoTrig = m_l1GtTmAlgo->gtTriggerMask();
00125
00126 m_l1GtTmAlgoCacheID = l1GtTmAlgoCacheID;
00127
00128 }
00129
00130
00131 unsigned long long l1GtTmTechCacheID =
00132 evSetup.get<L1GtTriggerMaskTechTrigRcd>().cacheIdentifier();
00133
00134 if (m_l1GtTmTechCacheID != l1GtTmTechCacheID) {
00135
00136 edm::ESHandle< L1GtTriggerMask > l1GtTmTech;
00137 evSetup.get< L1GtTriggerMaskTechTrigRcd >().get( l1GtTmTech );
00138 m_l1GtTmTech = l1GtTmTech.product();
00139
00140 m_triggerMaskTechTrig = m_l1GtTmTech->gtTriggerMask();
00141
00142 m_l1GtTmTechCacheID = l1GtTmTechCacheID;
00143
00144 }
00145
00148 gtRecord->setDecisionWordBeforeMask(algoDecisionWord);
00149 gtRecord->setTechnicalTriggerWordBeforeMask(techDecisionWord);
00150
00151
00152
00153 int iDaq = 0;
00154
00155
00156
00157 int iBit = -1;
00158
00159 for (std::vector<bool>::iterator
00160 itBit = algoDecisionWord.begin(); itBit != algoDecisionWord.end(); ++itBit) {
00161
00162 iBit++;
00163
00164 int triggerMaskAlgoTrigBit = m_triggerMaskAlgoTrig[iBit] & (1 << iDaq);
00165
00166
00167
00168
00169
00170
00171 if (triggerMaskAlgoTrigBit) {
00172 *itBit = false;
00173
00174
00175
00176
00177 }
00178 }
00179
00180
00181
00182 iBit = -1;
00183
00184 for (std::vector<bool>::iterator
00185 itBit = techDecisionWord.begin(); itBit != techDecisionWord.end(); ++itBit) {
00186
00187 iBit++;
00188
00189 int triggerMaskTechTrigBit = m_triggerMaskTechTrig[iBit] & (1 << iDaq);
00190
00191
00192
00193
00194
00195
00196 if (triggerMaskTechTrigBit) {
00197 *itBit = false;
00198
00199
00200
00201
00202 }
00203 }
00204
00205
00206
00207
00208
00209
00210 gtRecord->setDecision(gtDecision);
00211 gtRecord->setDecisionWord(algoDecisionWord);
00212 gtRecord->setTechnicalTriggerWord(techDecisionWord);
00213
00214
00215 unsigned int pfIndexTech =
00216 static_cast<unsigned int> ((gtReadoutRecord->gtFdlWord()).gtPrescaleFactorIndexTech());
00217 unsigned int pfIndexAlgo =
00218 static_cast<unsigned int> ((gtReadoutRecord->gtFdlWord()).gtPrescaleFactorIndexAlgo());
00219
00220 gtRecord->setGtPrescaleFactorIndexTech(pfIndexTech);
00221 gtRecord->setGtPrescaleFactorIndexAlgo(pfIndexAlgo);
00222
00223 if ( edm::isDebugEnabled() ) {
00224 std::ostringstream myCoutStream;
00225 gtRecord->print(myCoutStream);
00226 LogTrace("L1GlobalTriggerRecordProducer")
00227 << "\n The following L1 GT record was produced.\n"
00228 << myCoutStream.str() << "\n"
00229 << std::endl;
00230 }
00231
00232
00233 iEvent.put( gtRecord );
00234
00235 }
00236
00237
00238 void L1GlobalTriggerRecordProducer::endJob()
00239 {
00240
00241
00242 }
00243
00244
00245
00246