File indexing completed on 2024-04-06 12:06:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021
0022
0023 #include "FWCore/Framework/interface/Frameworkfwd.h"
0024 #include "FWCore/Framework/interface/stream/EDProducer.h"
0025
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/Run.h"
0028 #include "FWCore/Framework/interface/MakerMacros.h"
0029
0030 #include "FWCore/Framework/interface/ESHandle.h"
0031 #include "FWCore/Framework/interface/ESWatcher.h"
0032 #include "FWCore/Framework/interface/EventSetup.h"
0033
0034 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0035
0036 #include "FWCore/Utilities/interface/InputTag.h"
0037
0038 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0039 #include "FWCore/Utilities/interface/Exception.h"
0040
0041 #include <map>
0042 #include <vector>
0043 #include <utility>
0044 #include <string>
0045 #include <iostream>
0046
0047 #include "CondFormats/SiStripObjects/interface/SiStripConfObject.h"
0048 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
0049
0050 #include "DataFormats/Scalers/interface/Level1TriggerScalers.h"
0051 #include "DataFormats/TCDS/interface/TCDSRecord.h"
0052 #include "DPGAnalysis/SiStripTools/interface/APVCyclePhaseCollection.h"
0053
0054
0055
0056
0057
0058 class APVCyclePhaseProducerFromL1TS : public edm::stream::EDProducer<> {
0059 public:
0060 explicit APVCyclePhaseProducerFromL1TS(const edm::ParameterSet&);
0061 ~APVCyclePhaseProducerFromL1TS() override;
0062
0063 private:
0064 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0065 void produce(edm::Event&, const edm::EventSetup&) override;
0066
0067 bool isBadRun(const unsigned int) const;
0068 void printConfiguration(std::stringstream& ss) const;
0069
0070
0071
0072 const bool m_ignoreDB;
0073 edm::ESWatcher<SiStripConfObjectRcd> m_eswatcher;
0074 edm::EDGetTokenT<Level1TriggerScalersCollection> _l1tscollectionToken;
0075 edm::EDGetTokenT<TCDSRecord> _tcdsRecordToken;
0076 edm::ESGetToken<SiStripConfObject, SiStripConfObjectRcd> _confObjectToken;
0077 edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> _tTopoToken;
0078 std::vector<std::string> _defpartnames;
0079 std::vector<int> _defphases;
0080 bool _useEC0;
0081 int _magicOffset;
0082 bool m_badRun;
0083 const bool _forceSCAL;
0084
0085 std::vector<std::pair<unsigned int, unsigned int> > m_badruns;
0086
0087 long long _lastResync;
0088 long long _lastHardReset;
0089 long long _lastStart;
0090 long long _lastEventCounter0;
0091 long long _lastOrbitCounter0;
0092 long long _lastTestEnable;
0093 };
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 APVCyclePhaseProducerFromL1TS::APVCyclePhaseProducerFromL1TS(const edm::ParameterSet& iConfig)
0107 : m_ignoreDB(iConfig.getUntrackedParameter<bool>("ignoreDB", false)),
0108 m_eswatcher(),
0109 _l1tscollectionToken(
0110 consumes<Level1TriggerScalersCollection>(iConfig.getParameter<edm::InputTag>("l1TSCollection"))),
0111 _tcdsRecordToken(consumes<TCDSRecord>(iConfig.getParameter<edm::InputTag>("tcdsRecordLabel"))),
0112 _confObjectToken((!m_ignoreDB)
0113 ? decltype(_confObjectToken){esConsumes<edm::Transition::BeginRun>(edm::ESInputTag{
0114 "", iConfig.getUntrackedParameter<std::string>("recordLabel", "apvphaseoffsets")})}
0115 : decltype(_confObjectToken){}),
0116 _tTopoToken((!m_ignoreDB) ? decltype(_tTopoToken){esConsumes<edm::Transition::BeginRun>()}
0117 : decltype(_tTopoToken){}),
0118 _defpartnames(iConfig.getParameter<std::vector<std::string> >("defaultPartitionNames")),
0119 _defphases(iConfig.getParameter<std::vector<int> >("defaultPhases")),
0120 _useEC0(iConfig.getUntrackedParameter<bool>("useEC0", false)),
0121 _magicOffset(iConfig.getUntrackedParameter<int>("magicOffset", 8)),
0122 m_badRun(false),
0123 _forceSCAL(iConfig.getParameter<bool>("forceSCAL")),
0124 m_badruns(),
0125 _lastResync(-1),
0126 _lastHardReset(-1),
0127 _lastStart(-1),
0128 _lastEventCounter0(-1),
0129 _lastOrbitCounter0(-1),
0130 _lastTestEnable(-1) {
0131 std::stringstream ss;
0132 printConfiguration(ss);
0133 edm::LogInfo("ConfigurationAtConstruction") << ss.str();
0134
0135 produces<APVCyclePhaseCollection, edm::InEvent>();
0136
0137 m_badruns.push_back(std::pair<unsigned int, unsigned int>(0, 131767));
0138 m_badruns.push_back(std::pair<unsigned int, unsigned int>(193150, 193733));
0139
0140
0141 }
0142
0143 APVCyclePhaseProducerFromL1TS::~APVCyclePhaseProducerFromL1TS() {
0144
0145
0146 }
0147
0148
0149
0150
0151
0152
0153 void APVCyclePhaseProducerFromL1TS::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup)
0154
0155 {
0156
0157
0158 if (!m_ignoreDB && m_eswatcher.check(iSetup)) {
0159 const auto& confObj = iSetup.getData(_confObjectToken);
0160
0161 std::stringstream summary;
0162 confObj.printDebug(summary, &iSetup.getData(_tTopoToken));
0163 LogDebug("SiStripConfObjectSummary") << summary.str();
0164
0165 _defpartnames = confObj.get<std::vector<std::string> >("defaultPartitionNames");
0166 _defphases = confObj.get<std::vector<int> >("defaultPhases");
0167 _useEC0 = confObj.get<bool>("useEC0");
0168 m_badRun = confObj.get<bool>("badRun");
0169 _magicOffset = confObj.get<int>("magicOffset");
0170
0171 std::stringstream ss;
0172 printConfiguration(ss);
0173 edm::LogInfo("UpdatedConfiguration") << ss.str();
0174 }
0175
0176 if (isBadRun(iRun.run())) {
0177 LogDebug("UnreliableMissingL1TriggerScalers") << "In this run L1TriggerScalers is missing or unreliable for phase "
0178 "determination: invlid phase will be returned";
0179 }
0180 }
0181
0182 void APVCyclePhaseProducerFromL1TS::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0183 using namespace edm;
0184
0185 std::unique_ptr<APVCyclePhaseCollection> apvphases(new APVCyclePhaseCollection());
0186
0187 std::vector<int> phases(_defphases.size(), APVCyclePhaseCollection::invalid);
0188
0189 const std::vector<std::string>& partnames = _defpartnames;
0190
0191 int phasechange = 0;
0192
0193 Handle<Level1TriggerScalersCollection> l1ts;
0194 iEvent.getByToken(_l1tscollectionToken, l1ts);
0195 Handle<TCDSRecord> tcds_pIn;
0196 iEvent.getByToken(_tcdsRecordToken, tcds_pIn);
0197 bool useTCDS(tcds_pIn.isValid() && !_forceSCAL);
0198 const auto* tcdsRecord = useTCDS ? tcds_pIn.product() : nullptr;
0199
0200
0201 long long orbitoffset = 0;
0202
0203 if (useTCDS && iEvent.eventAuxiliary().isRealData()) {
0204
0205 if (tcdsRecord->getLastResync() != 0) {
0206 orbitoffset =
0207 _useEC0 ? tcdsRecord->getLastEventCounter0() + _magicOffset : tcdsRecord->getLastResync() + _magicOffset;
0208 }
0209
0210 if (_lastResync != tcdsRecord->getLastResync()) {
0211 _lastResync = tcdsRecord->getLastResync();
0212 LogDebug("TTCSignalReceived") << "New Resync at orbit " << _lastResync;
0213 }
0214 if (_lastHardReset != tcdsRecord->getLastHardReset()) {
0215 _lastHardReset = tcdsRecord->getLastHardReset();
0216 LogDebug("TTCSignalReceived") << "New HardReset at orbit " << _lastHardReset;
0217 }
0218 if (_lastTestEnable != tcdsRecord->getLastTestEnable()) {
0219 _lastTestEnable = tcdsRecord->getLastTestEnable();
0220
0221 }
0222 if (_lastOrbitCounter0 != tcdsRecord->getLastOrbitCounter0()) {
0223 _lastOrbitCounter0 = tcdsRecord->getLastOrbitCounter0();
0224 LogDebug("TTCSignalReceived") << "New OrbitCounter0 at orbit " << _lastOrbitCounter0;
0225 }
0226 if (_lastEventCounter0 != tcdsRecord->getLastEventCounter0()) {
0227 _lastEventCounter0 = tcdsRecord->getLastEventCounter0();
0228 LogDebug("TTCSignalReceived") << "New EventCounter0 at orbit " << _lastEventCounter0;
0229 }
0230 if (_lastStart != tcdsRecord->getLastStart()) {
0231 _lastStart = tcdsRecord->getLastStart();
0232 LogDebug("TTCSignalReceived") << "New Start at orbit " << _lastStart;
0233 }
0234
0235 if (!isBadRun(iEvent.run())) {
0236 phasechange = ((long long)(orbitoffset * 3564)) % 70;
0237
0238 for (unsigned int ipart = 0; ipart < phases.size(); ++ipart) {
0239 phases[ipart] = (_defphases[ipart] + phasechange) % 70;
0240 }
0241 }
0242
0243 } else {
0244 if (!l1ts->empty()) {
0245 if ((*l1ts)[0].lastResync() != 0) {
0246 orbitoffset = _useEC0 ? (*l1ts)[0].lastEventCounter0() + _magicOffset : (*l1ts)[0].lastResync() + _magicOffset;
0247 }
0248
0249 if (_lastResync != (*l1ts)[0].lastResync()) {
0250 _lastResync = (*l1ts)[0].lastResync();
0251 LogDebug("TTCSignalReceived") << "New Resync at orbit " << _lastResync;
0252 }
0253 if (_lastHardReset != (*l1ts)[0].lastHardReset()) {
0254 _lastHardReset = (*l1ts)[0].lastHardReset();
0255 LogDebug("TTCSignalReceived") << "New HardReset at orbit " << _lastHardReset;
0256 }
0257 if (_lastTestEnable != (*l1ts)[0].lastTestEnable()) {
0258 _lastTestEnable = (*l1ts)[0].lastTestEnable();
0259
0260 }
0261 if (_lastOrbitCounter0 != (*l1ts)[0].lastOrbitCounter0()) {
0262 _lastOrbitCounter0 = (*l1ts)[0].lastOrbitCounter0();
0263 LogDebug("TTCSignalReceived") << "New OrbitCounter0 at orbit " << _lastOrbitCounter0;
0264 }
0265 if (_lastEventCounter0 != (*l1ts)[0].lastEventCounter0()) {
0266 _lastEventCounter0 = (*l1ts)[0].lastEventCounter0();
0267 LogDebug("TTCSignalReceived") << "New EventCounter0 at orbit " << _lastEventCounter0;
0268 }
0269 if (_lastStart != (*l1ts)[0].lastStart()) {
0270 _lastStart = (*l1ts)[0].lastStart();
0271 LogDebug("TTCSignalReceived") << "New Start at orbit " << _lastStart;
0272 }
0273
0274 if (!isBadRun(iEvent.run())) {
0275 phasechange = ((long long)(orbitoffset * 3564)) % 70;
0276
0277 for (unsigned int ipart = 0; ipart < phases.size(); ++ipart) {
0278 phases[ipart] = (_defphases[ipart] + phasechange) % 70;
0279 }
0280 }
0281 }
0282 }
0283
0284 if (phases.size() < partnames.size()) {
0285
0286 throw cms::Exception("InvalidAPVCyclePhases")
0287 << " Inconsistent phases/partitions vector sizes: " << phases.size() << " " << partnames.size();
0288 }
0289
0290 for (unsigned int ipart = 0; ipart < partnames.size(); ++ipart) {
0291
0292
0293 apvphases->get()[partnames[ipart]] = phases[ipart];
0294
0295
0296 }
0297
0298 iEvent.put(std::move(apvphases));
0299 }
0300
0301 bool APVCyclePhaseProducerFromL1TS::isBadRun(const unsigned int run) const {
0302 for (std::vector<std::pair<unsigned int, unsigned int> >::const_iterator runpair = m_badruns.begin();
0303 runpair != m_badruns.end();
0304 ++runpair) {
0305 if (run >= runpair->first && run <= runpair->second)
0306 return true;
0307 }
0308
0309 return m_badRun;
0310 }
0311
0312 void APVCyclePhaseProducerFromL1TS::printConfiguration(std::stringstream& ss) const {
0313 ss << _defpartnames.size() << " default partition names: ";
0314 for (std::vector<std::string>::const_iterator part = _defpartnames.begin(); part != _defpartnames.end(); ++part) {
0315 ss << *part << " ";
0316 }
0317 ss << std::endl;
0318 ss << _defphases.size() << " default phases: ";
0319 for (std::vector<int>::const_iterator phase = _defphases.begin(); phase != _defphases.end(); ++phase) {
0320 ss << *phase << " ";
0321 }
0322 ss << std::endl;
0323 ss << " Magic offset: " << _magicOffset << std::endl;
0324 ss << " use ECO: " << _useEC0 << std::endl;
0325 ss << " bad run: " << m_badRun << std::endl;
0326 }
0327
0328 DEFINE_FWK_MODULE(APVCyclePhaseProducerFromL1TS);