From 8a2fae044922b1901d50fe72a95ec389b74b278b Mon Sep 17 00:00:00 2001 From: Luca Guzzi Date: Mon, 17 Feb 2025 11:05:35 +0100 Subject: [PATCH] move online beam spot arbitration to the edproducer --- ...LCARECOPromptCalibProdSiPixelAliHLT_cff.py | 6 +- .../DataProcessing/python/RecoTLR.py | 5 - .../python/DigiToRaw_Repack_cff.py | 5 - DQM/BeamMonitor/plugins/OnlineBeamMonitor.cc | 122 +++++++------ DQM/BeamMonitor/plugins/OnlineBeamMonitor.h | 7 +- .../python/AlcaBeamMonitorHeavyIons_cff.py | 5 - DQM/BeamMonitor/python/AlcaBeamMonitor_cff.py | 5 - .../test/Online_BeamMonitor_file.py | 31 +--- DQM/BeamMonitor/test/testOnlineBeamMonitor.sh | 2 +- .../clients/beam_dqm_sourceclient-live_cfg.py | 7 - .../beamhlt_dqm_sourceclient-live_cfg.py | 4 - ...nebeammonitor_dqm_sourceclient-live_cfg.py | 5 +- .../pixel_dqm_sourceclient-live_cfg.py | 7 - ...istrip_approx_dqm_sourceclient-live_cfg.py | 7 - .../sistrip_dqm_sourceclient-live_cfg.py | 7 - .../hltOnlineBeamSpotESProducer_cfi.py | 7 - .../modules/hltOnlineBeamSpot_cfi.py | 5 +- .../Configuration/python/HLT_75e33_cff.py | 1 - .../python/HLT_75e33_timing_cff.py | 1 - .../python/customizeHLTforCMSSW.py | 23 ++- .../plugins/BeamSpotOnlineProducer.cc | 160 +++++++++++++----- .../python/BeamSpotOnline_cfi.py | 2 +- .../BeamSpotProducer/python/BeamSpot_cfi.py | 8 - 23 files changed, 210 insertions(+), 222 deletions(-) delete mode 100644 HLTrigger/Configuration/python/HLT_75e33/eventsetup/hltOnlineBeamSpotESProducer_cfi.py diff --git a/Alignment/CommonAlignmentProducer/python/ALCARECOPromptCalibProdSiPixelAliHLT_cff.py b/Alignment/CommonAlignmentProducer/python/ALCARECOPromptCalibProdSiPixelAliHLT_cff.py index a5dbfab1d52e2..311dcf2e4aeae 100644 --- a/Alignment/CommonAlignmentProducer/python/ALCARECOPromptCalibProdSiPixelAliHLT_cff.py +++ b/Alignment/CommonAlignmentProducer/python/ALCARECOPromptCalibProdSiPixelAliHLT_cff.py @@ -13,10 +13,8 @@ # Ingredient: onlineBeamSpot import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi -onlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() - -import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod -BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone( +onlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone( + useBSOnlineRecords = True, timeThreshold = 999999 # for express allow >48h old payloads for replays. DO NOT CHANGE ) diff --git a/Configuration/DataProcessing/python/RecoTLR.py b/Configuration/DataProcessing/python/RecoTLR.py index 9d85cfea56cb1..72ebfff196e24 100644 --- a/Configuration/DataProcessing/python/RecoTLR.py +++ b/Configuration/DataProcessing/python/RecoTLR.py @@ -4,11 +4,6 @@ # common utilities ############################################################################## def _swapOfflineBSwithOnline(process): - import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod - process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone( - timeThreshold = 999999 # for express allow >48h old payloads for replays. DO NOT CHANGE - ) - from RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi import onlineBeamSpotProducer process.offlineBeamSpot = onlineBeamSpotProducer.clone() return process diff --git a/Configuration/StandardSequences/python/DigiToRaw_Repack_cff.py b/Configuration/StandardSequences/python/DigiToRaw_Repack_cff.py index 12d6c75978d38..a712ecaf6fc06 100644 --- a/Configuration/StandardSequences/python/DigiToRaw_Repack_cff.py +++ b/Configuration/StandardSequences/python/DigiToRaw_Repack_cff.py @@ -84,10 +84,5 @@ scalersInputTag = cms.InputTag( "rawDataRepacker" ) ) -import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod -BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone( - timeThreshold = 999999 # to allow using old runs in tests -) - DigiToApproxClusterRawTask = cms.Task(hltSiStripRawToDigi,siStripZeroSuppressionHLT,hltScalersRawToDigi,hltBeamSpotProducer,siStripClustersHLT,hltSiStripClusters2ApproxClusters,rawPrimeDataRepacker) DigiToApproxClusterRaw = cms.Sequence(DigiToApproxClusterRawTask) diff --git a/DQM/BeamMonitor/plugins/OnlineBeamMonitor.cc b/DQM/BeamMonitor/plugins/OnlineBeamMonitor.cc index 4e1b0fb709ac9..2494c3a3915f9 100644 --- a/DQM/BeamMonitor/plugins/OnlineBeamMonitor.cc +++ b/DQM/BeamMonitor/plugins/OnlineBeamMonitor.cc @@ -28,13 +28,14 @@ using namespace reco; //---------------------------------------------------------------------------------------------------------------------- OnlineBeamMonitor::OnlineBeamMonitor(const ParameterSet& ps) : monitorName_(ps.getUntrackedParameter("MonitorName")), - bsTransientToken_(esConsumes()), - bsHLTToken_(esConsumes()), - bsLegacyToken_(esConsumes()), + bsOnlineToken_(consumes(ps.getUntrackedParameter("OnlineBeamSpotLabel"))), + bsHLTToken_(esConsumes()), + bsLegacyToken_(esConsumes()), numberOfValuesToSave_(0), appendRunTxt_(ps.getUntrackedParameter("AppendRunToFileName")), writeDIPTxt_(ps.getUntrackedParameter("WriteDIPAscii")), - outputDIPTxt_(ps.getUntrackedParameter("DIPFileName")) { + outputDIPTxt_(ps.getUntrackedParameter("DIPFileName")), + shouldReadEvent_(true) { if (!monitorName_.empty()) monitorName_ = monitorName_ + "/"; @@ -57,7 +58,7 @@ OnlineBeamMonitor::OnlineBeamMonitor(const ParameterSet& ps) histoByCategoryNames_.insert(pair("lumi", "Lumibased BeamSpotHLT")); histoByCategoryNames_.insert(pair("lumi", "Lumibased BeamSpotLegacy")); - histoByCategoryNames_.insert(pair("lumi", "Lumibased BeamSpotTransient")); + histoByCategoryNames_.insert(pair("lumi", "Lumibased BeamSpotOnline")); for (const auto& itV : varNamesV_) { for (const auto& itM : histoByCategoryNames_) { @@ -69,6 +70,7 @@ OnlineBeamMonitor::OnlineBeamMonitor(const ParameterSet& ps) void OnlineBeamMonitor::fillDescriptions(edm::ConfigurationDescriptions& iDesc) { edm::ParameterSetDescription ps; ps.addUntracked("MonitorName", "YourSubsystemName"); + ps.addUntracked("OnlineBeamSpotLabel", edm::InputTag("hltOnlineBeamSpot")); ps.addUntracked("AppendRunToFileName", false); ps.addUntracked("WriteDIPAscii", true); ps.addUntracked("DIPFileName", "BeamFitResultsForDIP.txt"); @@ -175,13 +177,17 @@ std::function myStringFunctor std::shared_ptr OnlineBeamMonitor::globalBeginLuminosityBlock( const LuminosityBlock& iLumi, const EventSetup& iSetup) const { // Always create a beamspot group for each lumi weather we have results or not! Each Beamspot will be of unknown type! - auto beamSpotInfo = std::make_shared(); + return beamSpotInfo; +} +void OnlineBeamMonitor::fetchBeamSpotInformation(const Event& iEvent, const EventSetup& iSetup) { + auto const& iLumi = iEvent.getLuminosityBlock(); + auto beamSpotInfo = luminosityBlockCache(iLumi.index()); //Read BeamSpot from DB ESHandle bsHLTHandle; ESHandle bsLegacyHandle; - ESHandle bsTransientHandle; + ESHandle bsOnlineHandle; //int lastLumiHLT_ = 0; //int lastLumiLegacy_ = 0; std::string startTimeStamp_ = "0"; @@ -233,7 +239,8 @@ std::shared_ptr OnlineBeamMonitor::globalBeginL //LogInfo("OnlineBeamMonitor") // << *aSpot << std::endl; } else { - LogInfo("OnlineBeamMonitor") << "Database BeamSpot is not valid at lumi: " << iLumi.id().luminosityBlock(); + LogError("OnlineBeamMonitor") << "The database BeamSpot (hlt record) is not valid at lumi: " + << iLumi.id().luminosityBlock(); } if (auto bsLegacyHandle = iSetup.getHandle(bsLegacyToken_)) { auto const& spotDB = *bsLegacyHandle; @@ -274,36 +281,13 @@ std::shared_ptr OnlineBeamMonitor::globalBeginL //LogInfo("OnlineBeamMonitor") // << *aSpot << std::endl; } else { - LogInfo("OnlineBeamMonitor") << "Database BeamSpot is not valid at lumi: " << iLumi.id().luminosityBlock(); + LogError("OnlineBeamMonitor") << "The database BeamSpot (legacy record) is not valid at lumi: " + << iLumi.id().luminosityBlock(); } - if (auto bsTransientHandle = iSetup.getHandle(bsTransientToken_)) { - auto const& spotDB = *bsTransientHandle; - //std::cout << " from the DB " << spotDB << std::endl; - - // translate from BeamSpotObjects to reco::BeamSpot - BeamSpot::Point apoint(spotDB.x(), spotDB.y(), spotDB.z()); - - BeamSpot::CovarianceMatrix matrix; - for (int i = 0; i < 7; ++i) { - for (int j = 0; j < 7; ++j) { - matrix(i, j) = spotDB.covariance(i, j); - } - } - - beamSpotInfo->beamSpotsMap_["Transient"] = - BeamSpot(apoint, spotDB.sigmaZ(), spotDB.dxdz(), spotDB.dydz(), spotDB.beamWidthX(), matrix); + if (auto bsOnlineHandle = iEvent.getHandle(bsOnlineToken_)) { + auto const& spotOnline = *bsOnlineHandle; - BeamSpot* aSpot = &(beamSpotInfo->beamSpotsMap_["Transient"]); - - aSpot->setBeamWidthY(spotDB.beamWidthY()); - aSpot->setEmittanceX(spotDB.emittanceX()); - aSpot->setEmittanceY(spotDB.emittanceY()); - aSpot->setbetaStar(spotDB.betaStar()); - if (spotDB.beamType() == 2) { - aSpot->setType(reco::BeamSpot::Tracker); - } else { - aSpot->setType(reco::BeamSpot::Fake); - } + beamSpotInfo->beamSpotsMap_["Online"] = spotOnline; if (writeDIPTxt_) { std::ofstream outFile; @@ -318,16 +302,16 @@ std::shared_ptr OnlineBeamMonitor::globalBeginL } //int lastLumiAnalyzed_ = iLumi.id().luminosityBlock(); - if (beamSpotInfo->beamSpotsMap_.find("Transient") != beamSpotInfo->beamSpotsMap_.end()) { + if (beamSpotInfo->beamSpotsMap_.find("Online") != beamSpotInfo->beamSpotsMap_.end()) { if (beamSpotInfo->beamSpotsMap_.find("HLT") != beamSpotInfo->beamSpotsMap_.end() && - beamSpotInfo->beamSpotsMap_["Transient"].x0() == beamSpotInfo->beamSpotsMap_["HLT"].x0()) { + beamSpotInfo->beamSpotsMap_["Online"].x0() == beamSpotInfo->beamSpotsMap_["HLT"].x0()) { // lastLumiAnalyzed_ = lastLumiHLT_; startTimeStamp_ = startTimeStampHLT_; stopTimeStamp_ = stopTimeStampHLT_; lumiRange_ = lumiRangeHLT_; } else if (beamSpotInfo->beamSpotsMap_.find("Legacy") != beamSpotInfo->beamSpotsMap_.end() && - beamSpotInfo->beamSpotsMap_["Transient"].x0() == beamSpotInfo->beamSpotsMap_["Legacy"].x0()) { + beamSpotInfo->beamSpotsMap_["Online"].x0() == beamSpotInfo->beamSpotsMap_["Legacy"].x0()) { //lastLumiAnalyzed_ = lastLumiLegacy_; startTimeStamp_ = startTimeStampLegacy_; stopTimeStamp_ = stopTimeStampLegacy_; @@ -342,35 +326,35 @@ std::shared_ptr OnlineBeamMonitor::globalBeginL outFile << "EndTimeOfFit " << stopTimeStamp_ << " " << 0 << std::endl; //outFile << "LumiRange " << lumiRange_ << " - " << lastLumiAnalyzed_ << std::endl; outFile << "LumiRange " << lumiRange_ << std::endl; - outFile << "Type " << aSpot->type() << std::endl; - outFile << "X0 " << aSpot->x0() << std::endl; - outFile << "Y0 " << aSpot->y0() << std::endl; - outFile << "Z0 " << aSpot->z0() << std::endl; - outFile << "sigmaZ0 " << aSpot->sigmaZ() << std::endl; - outFile << "dxdz " << aSpot->dxdz() << std::endl; - outFile << "dydz " << aSpot->dydz() << std::endl; - outFile << "BeamWidthX " << aSpot->BeamWidthX() << std::endl; - outFile << "BeamWidthY " << aSpot->BeamWidthY() << std::endl; + outFile << "Type " << spotOnline.type() << std::endl; + outFile << "X0 " << spotOnline.x0() << std::endl; + outFile << "Y0 " << spotOnline.y0() << std::endl; + outFile << "Z0 " << spotOnline.z0() << std::endl; + outFile << "sigmaZ0 " << spotOnline.sigmaZ() << std::endl; + outFile << "dxdz " << spotOnline.dxdz() << std::endl; + outFile << "dydz " << spotOnline.dydz() << std::endl; + outFile << "BeamWidthX " << spotOnline.BeamWidthX() << std::endl; + outFile << "BeamWidthY " << spotOnline.BeamWidthY() << std::endl; for (int i = 0; i < 6; ++i) { outFile << "Cov(" << i << ",j) "; for (int j = 0; j < 7; ++j) { - outFile << aSpot->covariance(i, j) << " "; + outFile << spotOnline.covariance(i, j) << " "; } outFile << std::endl; } - outFile << "Cov(6,j) 0 0 0 0 0 0 " << aSpot->covariance(6, 6) << std::endl; - outFile << "EmittanceX " << aSpot->emittanceX() << std::endl; - outFile << "EmittanceY " << aSpot->emittanceY() << std::endl; - outFile << "BetaStar " << aSpot->betaStar() << std::endl; + outFile << "Cov(6,j) 0 0 0 0 0 0 " << spotOnline.covariance(6, 6) << std::endl; + outFile << "EmittanceX " << spotOnline.emittanceX() << std::endl; + outFile << "EmittanceY " << spotOnline.emittanceY() << std::endl; + outFile << "BetaStar " << spotOnline.betaStar() << std::endl; outFile.close(); } //LogInfo("OnlineBeamMonitor") - // << *aSpot << std::endl; + // << *spotOnline << std::endl; } else { - LogInfo("OnlineBeamMonitor") << "Database BeamSpot is not valid at lumi: " << iLumi.id().luminosityBlock(); + LogError("OnlineBeamMonitor") << "The online BeamSpot collection is not valid at lumi: " + << iLumi.id().luminosityBlock(); } - return beamSpotInfo; } //---------------------------------------------------------------------------------------------------------------------- @@ -379,13 +363,13 @@ void OnlineBeamMonitor::globalEndLuminosityBlock(const LuminosityBlock& iLumi, c auto beamSpotInfo = luminosityBlockCache(iLumi.index()); //Setting up the choice - if (beamSpotInfo->beamSpotsMap_.find("Transient") != beamSpotInfo->beamSpotsMap_.end()) { + if (beamSpotInfo->beamSpotsMap_.find("Online") != beamSpotInfo->beamSpotsMap_.end()) { if (beamSpotInfo->beamSpotsMap_.find("HLT") != beamSpotInfo->beamSpotsMap_.end() && - beamSpotInfo->beamSpotsMap_["Transient"].x0() == beamSpotInfo->beamSpotsMap_["HLT"].x0()) { + beamSpotInfo->beamSpotsMap_["Online"].x0() == beamSpotInfo->beamSpotsMap_["HLT"].x0()) { bsChoice_->Fill(iLumi.id().luminosityBlock(), 1); bsChoice_->setBinError(iLumi.id().luminosityBlock(), 0.05); } else if (beamSpotInfo->beamSpotsMap_.find("Legacy") != beamSpotInfo->beamSpotsMap_.end() && - beamSpotInfo->beamSpotsMap_["Transient"].x0() == beamSpotInfo->beamSpotsMap_["Legacy"].x0()) { + beamSpotInfo->beamSpotsMap_["Online"].x0() == beamSpotInfo->beamSpotsMap_["Legacy"].x0()) { bsChoice_->Fill(iLumi.id().luminosityBlock(), -1); bsChoice_->setBinError(iLumi.id().luminosityBlock(), 0.05); } else { @@ -437,10 +421,10 @@ void OnlineBeamMonitor::globalEndLuminosityBlock(const LuminosityBlock& iLumi, c histo->setBinContent(iLumi.id().luminosityBlock(), resultsMap["Legacy"].first); histo->setBinError(iLumi.id().luminosityBlock(), resultsMap["Legacy"].second); } - } else if (itM.second == "Lumibased BeamSpotTransient") { - if (resultsMap.find("Transient") != resultsMap.end()) { - histo->setBinContent(iLumi.id().luminosityBlock(), resultsMap["Transient"].first); - histo->setBinError(iLumi.id().luminosityBlock(), resultsMap["Transient"].second); + } else if (itM.second == "Lumibased BeamSpotOnline") { + if (resultsMap.find("Online") != resultsMap.end()) { + histo->setBinContent(iLumi.id().luminosityBlock(), resultsMap["Online"].first); + histo->setBinError(iLumi.id().luminosityBlock(), resultsMap["Online"].second); } } else { LogInfo("OnlineBeamMonitor") << "The histosMap_ have a histogram named " << itM.second @@ -448,6 +432,7 @@ void OnlineBeamMonitor::globalEndLuminosityBlock(const LuminosityBlock& iLumi, c } } } + shouldReadEvent_ = true; } void OnlineBeamMonitor::dqmEndRun(edm::Run const&, edm::EventSetup const&) { @@ -470,7 +455,7 @@ void OnlineBeamMonitor::dqmEndRun(edm::Run const&, edm::EventSetup const&) { for (int bin = 1; bin <= itHHH.second->getTH1()->GetNbinsX(); bin++) { if (itHHH.second->getTH1()->GetBinError(bin) != 0 || itHHH.second->getTH1()->GetBinContent(bin) != 0) { if (itHHH.first == "Lumibased BeamSpotHLT" || itHHH.first == "Lumibased BeamSpotLegacy" || - itHHH.first == "Lumibased BeamSpotTransient") { + itHHH.first == "Lumibased BeamSpotOnline") { if (min > itHHH.second->getTH1()->GetBinContent(bin)) { min = itHHH.second->getTH1()->GetBinContent(bin); } @@ -488,7 +473,7 @@ void OnlineBeamMonitor::dqmEndRun(edm::Run const&, edm::EventSetup const&) { for (auto& itHHH : itHH.second) { if (itHHH.second != nullptr) { if (itHHH.first == "Lumibased BeamSpotHLT" || itHHH.first == "Lumibased BeamSpotLegacy" || - itHHH.first == "Lumibased BeamSpotTransient") { + itHHH.first == "Lumibased BeamSpotOnline") { if ((max == -bigNumber && min == bigNumber) || max - min == 0) { itHHH.second->getTH1()->SetMinimum(itHHH.second->getTH1()->GetMinimum() - 0.01); itHHH.second->getTH1()->SetMaximum(itHHH.second->getTH1()->GetMaximum() + 0.01); @@ -508,4 +493,11 @@ void OnlineBeamMonitor::dqmEndRun(edm::Run const&, edm::EventSetup const&) { } } +void OnlineBeamMonitor::analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup) { + if (shouldReadEvent_) { + fetchBeamSpotInformation(iEvent, iSetup); + shouldReadEvent_ = false; + } +} + DEFINE_FWK_MODULE(OnlineBeamMonitor); diff --git a/DQM/BeamMonitor/plugins/OnlineBeamMonitor.h b/DQM/BeamMonitor/plugins/OnlineBeamMonitor.h index 5ffd098d0f77e..3ad6e1122c986 100644 --- a/DQM/BeamMonitor/plugins/OnlineBeamMonitor.h +++ b/DQM/BeamMonitor/plugins/OnlineBeamMonitor.h @@ -23,7 +23,6 @@ #include "CondFormats/BeamSpotObjects/interface/BeamSpotOnlineObjects.h" #include "CondFormats/DataRecord/interface/BeamSpotOnlineLegacyObjectsRcd.h" #include "CondFormats/DataRecord/interface/BeamSpotOnlineHLTObjectsRcd.h" -#include "CondFormats/DataRecord/interface/BeamSpotTransientObjectsRcd.h" namespace onlinebeammonitor { struct BeamSpotInfo { @@ -36,11 +35,13 @@ class OnlineBeamMonitor : public DQMOneEDAnalyzer globalBeginLuminosityBlock( const edm::LuminosityBlock& iLumi, const edm::EventSetup& iSetup) const override; + void fetchBeamSpotInformation(const edm::Event& iEvent, const edm::EventSetup& iSetup); void globalEndLuminosityBlock(const edm::LuminosityBlock& iLumi, const edm::EventSetup& iSetup) override; void dqmEndRun(edm::Run const&, edm::EventSetup const&) override; @@ -55,7 +56,7 @@ class OnlineBeamMonitor : public DQMOneEDAnalyzer bsTransientToken_; + edm::EDGetTokenT bsOnlineToken_; edm::ESGetToken bsHLTToken_; edm::ESGetToken bsLegacyToken_; std::ofstream fasciiDIP; @@ -76,6 +77,8 @@ class OnlineBeamMonitor : public DQMOneEDAnalyzer48h old payloads for replays. DO NOT CHANGE -) +process.load("DQM.Integration.config.unitteststreamerinputsource_cfi") +from DQM.Integration.config.unitteststreamerinputsource_cfi import options # initialize MessageLogger process.load("FWCore.MessageLogger.MessageLogger_cfi") @@ -52,22 +36,18 @@ limit = cms.untracked.int32(1) ), OnlineBeamMonitor = cms.untracked.PSet( - reportEvery = cms.untracked.int32(1), # every 1000th only + reportEvery = cms.untracked.int32(1), limit = cms.untracked.int32(0) )) -process.source = cms.Source("EmptySource") -process.source.numberEventsInRun=cms.untracked.uint32(100) -process.source.firstRun = cms.untracked.uint32(options.runNumber) -process.source.firstLuminosityBlock = cms.untracked.uint32(1) -process.source.numberEventsInLuminosityBlock = cms.untracked.uint32(1) -process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(options.maxEvents)) +process.maxEvents.input = cms.untracked.int32(options.maxEvents) #process.load("DQMServices.Core.DQMEDAnalyzer") process.onlineBeamMonitor = cms.EDProducer("OnlineBeamMonitor", MonitorName = cms.untracked.string("onlineBeamMonitor"), AppendRunToFileName = cms.untracked.bool(False), WriteDIPAscii = cms.untracked.bool(True), + OnlineBeamSpotLabel = cms.untracked.InputTag("hltOnlineBeamSpot"), DIPFileName = cms.untracked.string("BeamFitResultsForDIP.txt")) @@ -88,7 +68,6 @@ numberOfThreads = cms.untracked.uint32(4), numberOfStreams = cms.untracked.uint32 (4), numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(2) - ) #process.Tracer = cms.Service("Tracer") diff --git a/DQM/BeamMonitor/test/testOnlineBeamMonitor.sh b/DQM/BeamMonitor/test/testOnlineBeamMonitor.sh index 4b3376f030f2a..4ba8b1b6dfcb9 100755 --- a/DQM/BeamMonitor/test/testOnlineBeamMonitor.sh +++ b/DQM/BeamMonitor/test/testOnlineBeamMonitor.sh @@ -3,4 +3,4 @@ function die { echo $1: status $2 ; exit $2; } echo "TESTING OnlineBeamMonitor ..." -cmsRun ${SCRAM_TEST_PATH}/Online_BeamMonitor_file.py maxEvents=10 || die "Failure running Online_BeamMonitor_file.py" $? +cmsRun ${SCRAM_TEST_PATH}/Online_BeamMonitor_file.py maxEvents=10 runNumber=381594 || die "Failure running Online_BeamMonitor_file.py" $? diff --git a/DQM/Integration/python/clients/beam_dqm_sourceclient-live_cfg.py b/DQM/Integration/python/clients/beam_dqm_sourceclient-live_cfg.py index 5cf86c21e61e4..2e25f1c5f987e 100644 --- a/DQM/Integration/python/clients/beam_dqm_sourceclient-live_cfg.py +++ b/DQM/Integration/python/clients/beam_dqm_sourceclient-live_cfg.py @@ -86,13 +86,6 @@ #-------------------------------------------------------- # Swap offline <-> online BeamSpot as in Express and HLT -import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod -process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone() - -# for running offline enhance the time validity of the online beamspot in DB -if ((not live) or process.isDqmPlayback.value): - process.BeamSpotESProducer.timeThreshold = cms.int32(int(1e6)) - import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi process.offlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() diff --git a/DQM/Integration/python/clients/beamhlt_dqm_sourceclient-live_cfg.py b/DQM/Integration/python/clients/beamhlt_dqm_sourceclient-live_cfg.py index 36a7e11a3a0a4..19227055ec519 100644 --- a/DQM/Integration/python/clients/beamhlt_dqm_sourceclient-live_cfg.py +++ b/DQM/Integration/python/clients/beamhlt_dqm_sourceclient-live_cfg.py @@ -153,10 +153,6 @@ import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone() -# for running offline enhance the time validity of the online beamspot in DB -if ((not live) or process.isDqmPlayback.value): - process.BeamSpotESProducer.timeThreshold = cms.int32(int(1e6)) - import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi process.offlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() diff --git a/DQM/Integration/python/clients/onlinebeammonitor_dqm_sourceclient-live_cfg.py b/DQM/Integration/python/clients/onlinebeammonitor_dqm_sourceclient-live_cfg.py index baef5ae1f856f..ae05b41629e64 100644 --- a/DQM/Integration/python/clients/onlinebeammonitor_dqm_sourceclient-live_cfg.py +++ b/DQM/Integration/python/clients/onlinebeammonitor_dqm_sourceclient-live_cfg.py @@ -46,10 +46,6 @@ # process.dqmSaverPB.tag = 'OnlineBeamMonitor' # process.dqmSaverPB.runNumber = options.runNumber -# for running offline enhance the time validity of the online beamspot in DB -if (unitTest or process.isDqmPlayback.value): - process.BeamSpotESProducer.timeThreshold = cms.int32(int(1e6)) - #----------------------------- # BeamMonitor #----------------------------- @@ -57,6 +53,7 @@ MonitorName = cms.untracked.string("OnlineBeamMonitor"), AppendRunToFileName = cms.untracked.bool(False), WriteDIPAscii = cms.untracked.bool(True), +OnlineBeamSpotLabel = cms.untracked.InputTag("hltOnlineBeamSpot"), DIPFileName = cms.untracked.string("/nfshome0/dqmpro/BeamMonitorDQM/BeamFitResultsForDIP.txt") ) diff --git a/DQM/Integration/python/clients/pixel_dqm_sourceclient-live_cfg.py b/DQM/Integration/python/clients/pixel_dqm_sourceclient-live_cfg.py index fee74d39d6132..646bfa8e6eee4 100644 --- a/DQM/Integration/python/clients/pixel_dqm_sourceclient-live_cfg.py +++ b/DQM/Integration/python/clients/pixel_dqm_sourceclient-live_cfg.py @@ -132,13 +132,6 @@ else: process.load("Configuration.StandardSequences.Reconstruction_cff") -import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod -process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone() - -# for running offline enhance the time validity of the online beamspot in DB -if ((not live) or process.isDqmPlayback.value): - process.BeamSpotESProducer.timeThreshold = cms.int32(int(1e6)) - import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi process.offlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() diff --git a/DQM/Integration/python/clients/sistrip_approx_dqm_sourceclient-live_cfg.py b/DQM/Integration/python/clients/sistrip_approx_dqm_sourceclient-live_cfg.py index 40228642726d3..a3128b30d3a37 100644 --- a/DQM/Integration/python/clients/sistrip_approx_dqm_sourceclient-live_cfg.py +++ b/DQM/Integration/python/clients/sistrip_approx_dqm_sourceclient-live_cfg.py @@ -107,13 +107,6 @@ process.load("Configuration.StandardSequences.RawToDigi_Data_cff") process.load("Configuration.StandardSequences.Reconstruction_cff") -import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod -process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone() - -# for running offline enhance the time validity of the online beamspot in DB -if ((not live) or process.isDqmPlayback.value): - process.BeamSpotESProducer.timeThreshold = cms.int32(int(1e6)) - import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi process.offlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() diff --git a/DQM/Integration/python/clients/sistrip_dqm_sourceclient-live_cfg.py b/DQM/Integration/python/clients/sistrip_dqm_sourceclient-live_cfg.py index 32fb727ce71a3..6ed56605ffa9c 100644 --- a/DQM/Integration/python/clients/sistrip_dqm_sourceclient-live_cfg.py +++ b/DQM/Integration/python/clients/sistrip_dqm_sourceclient-live_cfg.py @@ -117,13 +117,6 @@ else: process.load("Configuration.StandardSequences.Reconstruction_cff") -import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod -process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone() - -# for running offline enhance the time validity of the online beamspot in DB -if ((not live) or process.isDqmPlayback.value): - process.BeamSpotESProducer.timeThreshold = cms.int32(int(1e6)) - import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi process.offlineBeamSpot = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() diff --git a/HLTrigger/Configuration/python/HLT_75e33/eventsetup/hltOnlineBeamSpotESProducer_cfi.py b/HLTrigger/Configuration/python/HLT_75e33/eventsetup/hltOnlineBeamSpotESProducer_cfi.py deleted file mode 100644 index fe9cb8237a0bb..0000000000000 --- a/HLTrigger/Configuration/python/HLT_75e33/eventsetup/hltOnlineBeamSpotESProducer_cfi.py +++ /dev/null @@ -1,7 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -hltOnlineBeamSpotESProducer = cms.ESProducer("OnlineBeamSpotESProducer", - timeThreshold = cms.int32( int(1e6) ), # we do want to read the DB even if it's old - sigmaZThreshold = cms.double( 2.0 ), - sigmaXYThreshold = cms.double( 4.0 ) -) diff --git a/HLTrigger/Configuration/python/HLT_75e33/modules/hltOnlineBeamSpot_cfi.py b/HLTrigger/Configuration/python/HLT_75e33/modules/hltOnlineBeamSpot_cfi.py index 9e03d06e83717..69ae344c08a82 100644 --- a/HLTrigger/Configuration/python/HLT_75e33/modules/hltOnlineBeamSpot_cfi.py +++ b/HLTrigger/Configuration/python/HLT_75e33/modules/hltOnlineBeamSpot_cfi.py @@ -6,5 +6,8 @@ maxRadius = cms.double(2.0), maxZ = cms.double(40.0), setSigmaZ = cms.double(0.0), - useTransientRecord = cms.bool(True) + useBSOnlineRecords = cms.bool(True), + timeThreshold = cms.int32(48), + sigmaZThreshold = cms.double( 2.0 ), + sigmaXYThreshold = cms.double( 4.0 ) ) diff --git a/HLTrigger/Configuration/python/HLT_75e33_cff.py b/HLTrigger/Configuration/python/HLT_75e33_cff.py index a368143257275..606945078cbff 100644 --- a/HLTrigger/Configuration/python/HLT_75e33_cff.py +++ b/HLTrigger/Configuration/python/HLT_75e33_cff.py @@ -56,7 +56,6 @@ fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/muonSeededTrajectoryCleanerBySharedHits_cfi") ### Mostly comes from HLT-like configuration, not RECO-like configuration -fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltOnlineBeamSpotESProducer_cfi") fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltESPBwdElectronPropagator_cfi") fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltESPChi2ChargeMeasurementEstimator2000_cfi") fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltESPChi2ChargeMeasurementEstimator30_cfi") diff --git a/HLTrigger/Configuration/python/HLT_75e33_timing_cff.py b/HLTrigger/Configuration/python/HLT_75e33_timing_cff.py index 66fc73ed1a957..6649f8a946bec 100644 --- a/HLTrigger/Configuration/python/HLT_75e33_timing_cff.py +++ b/HLTrigger/Configuration/python/HLT_75e33_timing_cff.py @@ -61,7 +61,6 @@ fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/muonSeededTrajectoryCleanerBySharedHits_cfi") ### Mostly comes from HLT-like configuration, not RECO-like configuration -fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltOnlineBeamSpotESProducer_cfi") fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltESPBwdElectronPropagator_cfi") fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltESPChi2ChargeMeasurementEstimator2000_cfi") fragment.load("HLTrigger/Configuration/HLT_75e33/eventsetup/hltESPChi2ChargeMeasurementEstimator30_cfi") diff --git a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py index 37e82223d290f..35a3b292a22d6 100644 --- a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py +++ b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py @@ -20,15 +20,6 @@ def customiseForOffline(process): - # For running HLT offline on Run-3 Data, use "(OnlineBeamSpotESProducer).timeThreshold = 1e6", - # in order to pick the beamspot that was actually used by the HLT (instead of a "fake" beamspot). - # These same settings can be used offline for Run-3 Data and Run-3 MC alike. - # Note: the products of the OnlineBeamSpotESProducer are used only - # if the configuration uses "(BeamSpotOnlineProducer).useTransientRecord = True". - # See CMSHLT-2271 and CMSHLT-2300 for further details. - for prod in esproducers_by_type(process, 'OnlineBeamSpotESProducer'): - prod.timeThreshold = int(1e6) - # For running HLT offline and relieve the strain on Frontier so it will no longer inject a # transaction id which tells Frontier to add a unique "&freshkey" to many query URLs. # That was intended as a feature to only be used by the Online HLT, to guarantee that fresh conditions @@ -48,6 +39,19 @@ def customiseForOffline(process): return process +def customizeHLTfor47378(process): + """Needed following the migration of the online beam spot arbitration to the edproducer""" + import copy + for esprod in list(esproducers_by_type(process, "OnlineBeamSpotESProducer")): + delattr(process, esprod.label()) + + for edprod in producers_by_type(process, "BeamSpotOnlineProducer"): + if hasattr(edprod, 'useTransientRecord'): + setattr(edprod, 'useBSOnlineRecords', copy.deepcopy(getattr(edprod, 'useTransientRecord'))) + delattr(edprod, 'useTransientRecord') + + return process + # CMSSW version specific customizations def customizeHLTforCMSSW(process, menuType="GRun"): @@ -55,5 +59,6 @@ def customizeHLTforCMSSW(process, menuType="GRun"): # add call to action function in proper order: newest last! # process = customiseFor12718(process) + process = customizeHLTfor47378(process) return process diff --git a/RecoVertex/BeamSpotProducer/plugins/BeamSpotOnlineProducer.cc b/RecoVertex/BeamSpotProducer/plugins/BeamSpotOnlineProducer.cc index 79fe97af78acc..c6b6cbe2551f4 100644 --- a/RecoVertex/BeamSpotProducer/plugins/BeamSpotOnlineProducer.cc +++ b/RecoVertex/BeamSpotProducer/plugins/BeamSpotOnlineProducer.cc @@ -12,14 +12,15 @@ ________________________________________________________________**/ #include "CondFormats/BeamSpotObjects/interface/BeamSpotObjects.h" #include "CondFormats/DataRecord/interface/BeamSpotObjectsRcd.h" -#include "CondFormats/DataRecord/interface/BeamSpotTransientObjectsRcd.h" +#include "CondFormats/BeamSpotObjects/interface/BeamSpotOnlineObjects.h" +#include "CondFormats/DataRecord/interface/BeamSpotOnlineHLTObjectsRcd.h" +#include "CondFormats/DataRecord/interface/BeamSpotOnlineLegacyObjectsRcd.h" #include "DataFormats/BeamSpot/interface/BeamSpot.h" #include "DataFormats/Common/interface/Handle.h" #include "DataFormats/GeometryCommonDetAlgo/interface/GlobalError.h" #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerEvmReadoutRecord.h" #include "DataFormats/Scalers/interface/BeamSpotOnline.h" #include "FWCore/Framework/interface/ESHandle.h" -#include "FWCore/Framework/interface/ESWatcher.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/stream/EDProducer.h" @@ -28,12 +29,15 @@ ________________________________________________________________**/ #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/Utilities/interface/ESGetToken.h" +#include "FWCore/Utilities/interface/TypeDemangler.h" class BeamSpotOnlineProducer : public edm::stream::EDProducer<> { public: /// constructor explicit BeamSpotOnlineProducer(const edm::ParameterSet& iConf); + void beginLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& setup) override; + /// produce a beam spot class void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override; @@ -43,27 +47,34 @@ class BeamSpotOnlineProducer : public edm::stream::EDProducer<> { private: // helper methods bool shouldShout(const edm::Event& iEvent) const; - bool processTransientRecord(const edm::EventSetup& iSetup, reco::BeamSpot& result, bool shoutMODE); - void createBeamSpotFromTransient(const BeamSpotObjects& spotDB, reco::BeamSpot& result) const; - bool processScalers(const edm::Event& iEvent, reco::BeamSpot& result, bool shoutMODE); - void createBeamSpotFromScaler(const BeamSpotOnline& spotOnline, reco::BeamSpot& result) const; + bool processRecords(const edm::LuminosityBlock& iLumi, const edm::EventSetup& iSetup, bool shoutMODE); + void createBeamSpotFromRecord(const BeamSpotObjects& spotDB); + template + const BeamSpotOnlineObjects& getBeamSpotFromRecord(const TokenType& token, + const edm::LuminosityBlock& lumi, + const edm::EventSetup& setup); + const BeamSpotOnlineObjects& chooseBS(const BeamSpotOnlineObjects& bs1, const BeamSpotOnlineObjects& bs2); + bool processScalers(const edm::Event& iEvent, bool shoutMODE); + void createBeamSpotFromScaler(const BeamSpotOnline& spotOnline); bool isInvalidScaler(const BeamSpotOnline& spotOnline, bool shoutMODE) const; - void createBeamSpotFromDB(const edm::EventSetup& iSetup, reco::BeamSpot& result, bool shoutMODE) const; + void createBeamSpotFromDB(const edm::EventSetup& iSetup, bool shoutMODE); // data members const bool changeFrame_; const double theMaxZ, theSetSigmaZ; double theMaxR2; - const bool useTransientRecord_; + const int timeThreshold_; + const double sigmaZThreshold_, sigmaXYThreshold_; + const bool useBSOnlineRecords_; const edm::EDGetTokenT scalerToken_; const edm::EDGetTokenT l1GtEvmReadoutRecordToken_; const edm::ESGetToken beamToken_; - const edm::ESGetToken beamTransientToken_; - - // watch IOV transition to emit warnings - edm::ESWatcher beamTransientRcdESWatcher_; + const edm::ESGetToken beamTokenLegacy_; + const edm::ESGetToken beamTokenHLT_; + reco::BeamSpot result; const unsigned int theBeamShoutMode; + BeamSpotOnlineObjects fakeBS_; }; using namespace edm; @@ -72,13 +83,20 @@ BeamSpotOnlineProducer::BeamSpotOnlineProducer(const ParameterSet& iconf) : changeFrame_(iconf.getParameter("changeToCMSCoordinates")), theMaxZ(iconf.getParameter("maxZ")), theSetSigmaZ(iconf.getParameter("setSigmaZ")), - useTransientRecord_(iconf.getParameter("useTransientRecord")), - scalerToken_(useTransientRecord_ ? edm::EDGetTokenT() + timeThreshold_(iconf.getParameter("timeThreshold")), + sigmaZThreshold_(iconf.getParameter("sigmaZThreshold")), + sigmaXYThreshold_(iconf.getParameter("sigmaXYThreshold") * 1E-4), + useBSOnlineRecords_(iconf.getParameter("useBSOnlineRecords")), + scalerToken_(useBSOnlineRecords_ ? edm::EDGetTokenT() : consumes(iconf.getParameter("src"))), l1GtEvmReadoutRecordToken_(consumes(iconf.getParameter("gtEvmLabel"))), beamToken_(esConsumes()), - beamTransientToken_(esConsumes()), + beamTokenLegacy_( + esConsumes()), + beamTokenHLT_( + esConsumes()), theBeamShoutMode(iconf.getUntrackedParameter("beamMode", 11)) { + fakeBS_.setType(reco::BeamSpot::Fake); theMaxR2 = iconf.getParameter("maxRadius"); theMaxR2 *= theMaxR2; @@ -94,31 +112,40 @@ void BeamSpotOnlineProducer::fillDescriptions(edm::ConfigurationDescriptions& iD ps.addOptional("src", InputTag("hltScalersRawToDigi"))->setComment("SCAL decommissioned after Run 2"); ps.add("gtEvmLabel", InputTag("")); ps.add("maxRadius", 2.0); - ps.add("useTransientRecord", false); + ps.add("useBSOnlineRecords", false); + ps.add("timeThreshold", 48)->setComment("hours"); + ps.add("sigmaZThreshold", 2.)->setComment("cm"); + ps.add("sigmaXYThreshold", 4.)->setComment("um"); iDesc.addWithDefaultLabel(ps); } -void BeamSpotOnlineProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { - auto result = std::make_unique(); +void BeamSpotOnlineProducer::beginLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& setup) { + /// fetch online records only at the beginning of a lumisection + if (useBSOnlineRecords_) { + processRecords(lumi, setup, true); + } +} +void BeamSpotOnlineProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { // Determine if we should "shout" based on the beam mode bool shoutMODE = shouldShout(iEvent); bool fallBackToDB{false}; - // Use transient record if enabled - if (useTransientRecord_) { - fallBackToDB = processTransientRecord(iSetup, *result, shoutMODE); + // Use online records if enabled + if (useBSOnlineRecords_) { + fallBackToDB = result.type() != reco::BeamSpot::Tracker; } else { // Process online beam spot scalers - fallBackToDB = processScalers(iEvent, *result, shoutMODE); + fallBackToDB = processScalers(iEvent, shoutMODE); } // Fallback to DB if necessary if (fallBackToDB) { - createBeamSpotFromDB(iSetup, *result, shoutMODE); + createBeamSpotFromDB(iSetup, shoutMODE); } - iEvent.put(std::move(result)); + std::unique_ptr toput = std::make_unique(result); + iEvent.put(std::move(toput)); } bool BeamSpotOnlineProducer::shouldShout(const edm::Event& iEvent) const { @@ -129,25 +156,80 @@ bool BeamSpotOnlineProducer::shouldShout(const edm::Event& iEvent) const { return true; // Default to "shout" if the record is missing } -bool BeamSpotOnlineProducer::processTransientRecord(const edm::EventSetup& iSetup, - reco::BeamSpot& result, - bool shoutMODE) { - auto const& spotDB = iSetup.getData(beamTransientToken_); +bool BeamSpotOnlineProducer::processRecords(const edm::LuminosityBlock& iLumi, + const edm::EventSetup& iSetup, + bool shoutMODE) { + auto const& spotDBLegacy = getBeamSpotFromRecord(beamTokenLegacy_, iLumi, iSetup); + auto const& spotDBHLT = getBeamSpotFromRecord(beamTokenHLT_, iLumi, iSetup); + auto const& spotDB = chooseBS(spotDBLegacy, spotDBHLT); - if (spotDB.beamType() != 2) { - if (shoutMODE && beamTransientRcdESWatcher_.check(iSetup)) { - edm::LogWarning("BeamSpotOnlineProducer") - << "Online Beam Spot producer falls back to DB value due to fake beamspot in transient record."; + if (spotDB.beamType() != reco::BeamSpot::Tracker) { + if (shoutMODE) { + edm::LogWarning("BeamSpotOnlineProducer") << "None of the online records holds a valid beam spot. The Online " + "Beam Spot producer falls back to the PCL value."; } return true; // Trigger fallback to DB } // Create BeamSpot from transient record - createBeamSpotFromTransient(spotDB, result); + createBeamSpotFromRecord(spotDB); return false; // No fallback needed } -void BeamSpotOnlineProducer::createBeamSpotFromTransient(const BeamSpotObjects& spotDB, reco::BeamSpot& result) const { +template +const BeamSpotOnlineObjects& BeamSpotOnlineProducer::getBeamSpotFromRecord(const TokenType& token, + const LuminosityBlock& lumi, + const EventSetup& setup) { + auto const bsRecord = setup.tryToGet(); + const auto& recordTypeName = edm::typeDemangle(typeid(RecordType).name()); + if (!bsRecord) { + edm::LogWarning("BeamSpotOnlineProducer") << "No " << recordTypeName << " found in the EventSetup"; + return fakeBS_; + } + const auto& bsHandle = setup.getHandle(token); + if (bsHandle.isValid()) { + const auto& bs = *bsHandle; + if (bs.sigmaZ() < sigmaZThreshold_ || bs.beamWidthX() < sigmaXYThreshold_ || bs.beamWidthY() < sigmaXYThreshold_ || + bs.beamType() != reco::BeamSpot::Tracker) { + edm::LogWarning("BeamSpotOnlineProducer") + << "The beam spot record does not pass the fit sanity checks (record: " << recordTypeName << ")" << std::endl + << "sigmaZ: " << bs.sigmaZ() << std::endl + << "sigmaX: " << bs.beamWidthX() << std::endl + << "sigmaY: " << bs.beamWidthY() << std::endl + << "type: " << bs.beamType(); + return fakeBS_; + } + auto lumitime = std::chrono::seconds(lumi.beginTime().unixTime()); + auto bstime = std::chrono::microseconds(bs.creationTime()); + auto threshold = std::chrono::duration_cast(std::chrono::hours(timeThreshold_)).count(); + if ((lumitime - bstime).count() > threshold) { + edm::LogWarning("BeamSpotOnlineProducer") + << "The beam spot record is too old. (record: " << recordTypeName << ")" << std::endl + << "record creation time: " << std::chrono::duration_cast(bstime).count() + << "lumi block time: " << std::chrono::duration_cast(lumitime).count(); + return fakeBS_; + } + return bs; + } else { + edm::LogWarning("BeamSpotOnlineProducer") << "Invalid online beam spot handle for the record: " << recordTypeName; + return fakeBS_; + } +} + +const BeamSpotOnlineObjects& BeamSpotOnlineProducer::chooseBS(const BeamSpotOnlineObjects& bs1, + const BeamSpotOnlineObjects& bs2) { + if (bs1.beamType() == reco::BeamSpot::Tracker && bs2.beamType() == reco::BeamSpot::Tracker) { + return bs1.sigmaZ() > bs2.sigmaZ() ? bs1 : bs2; + } else if (bs1.beamType() == reco::BeamSpot::Tracker) { + return bs1; + } else if (bs2.beamType() == reco::BeamSpot::Tracker) { + return bs2; + } else { + return fakeBS_; + } +} + +void BeamSpotOnlineProducer::createBeamSpotFromRecord(const BeamSpotObjects& spotDB) { double f = changeFrame_ ? -1.0 : 1.0; reco::BeamSpot::Point apoint(f * spotDB.x(), f * spotDB.y(), f * spotDB.z()); @@ -167,7 +249,7 @@ void BeamSpotOnlineProducer::createBeamSpotFromTransient(const BeamSpotObjects& result.setType(reco::BeamSpot::Tracker); } -bool BeamSpotOnlineProducer::processScalers(const edm::Event& iEvent, reco::BeamSpot& result, bool shoutMODE) { +bool BeamSpotOnlineProducer::processScalers(const edm::Event& iEvent, bool shoutMODE) { edm::Handle handleScaler; iEvent.getByToken(scalerToken_, handleScaler); @@ -177,7 +259,7 @@ bool BeamSpotOnlineProducer::processScalers(const edm::Event& iEvent, reco::Beam // Extract data from scaler BeamSpotOnline spotOnline = *(handleScaler->begin()); - createBeamSpotFromScaler(spotOnline, result); + createBeamSpotFromScaler(spotOnline); // Validate the scaler data if (isInvalidScaler(spotOnline, shoutMODE)) { @@ -186,7 +268,7 @@ bool BeamSpotOnlineProducer::processScalers(const edm::Event& iEvent, reco::Beam return false; // No fallback needed } -void BeamSpotOnlineProducer::createBeamSpotFromScaler(const BeamSpotOnline& spotOnline, reco::BeamSpot& result) const { +void BeamSpotOnlineProducer::createBeamSpotFromScaler(const BeamSpotOnline& spotOnline) { double f = changeFrame_ ? -1.0 : 1.0; reco::BeamSpot::Point apoint(f * spotOnline.x(), spotOnline.y(), f * spotOnline.z()); @@ -227,9 +309,7 @@ bool BeamSpotOnlineProducer::isInvalidScaler(const BeamSpotOnline& spotOnline, b return false; } -void BeamSpotOnlineProducer::createBeamSpotFromDB(const edm::EventSetup& iSetup, - reco::BeamSpot& result, - bool shoutMODE) const { +void BeamSpotOnlineProducer::createBeamSpotFromDB(const edm::EventSetup& iSetup, bool shoutMODE) { edm::ESHandle beamhandle = iSetup.getHandle(beamToken_); const BeamSpotObjects* spotDB = beamhandle.product(); diff --git a/RecoVertex/BeamSpotProducer/python/BeamSpotOnline_cfi.py b/RecoVertex/BeamSpotProducer/python/BeamSpotOnline_cfi.py index f71348bd486f0..adb7ade65c081 100644 --- a/RecoVertex/BeamSpotProducer/python/BeamSpotOnline_cfi.py +++ b/RecoVertex/BeamSpotProducer/python/BeamSpotOnline_cfi.py @@ -7,4 +7,4 @@ ) from Configuration.Eras.Modifier_run3_common_cff import run3_common -run3_common.toModify(onlineBeamSpotProducer, useTransientRecord = True) +run3_common.toModify(onlineBeamSpotProducer, useBSOnlineRecords = True, timeThreshold = 48, sigmaZThreshold = 2, sigmaXYThreshold = 4) diff --git a/RecoVertex/BeamSpotProducer/python/BeamSpot_cfi.py b/RecoVertex/BeamSpotProducer/python/BeamSpot_cfi.py index 8340129c5dc81..b81712f221e35 100644 --- a/RecoVertex/BeamSpotProducer/python/BeamSpot_cfi.py +++ b/RecoVertex/BeamSpotProducer/python/BeamSpot_cfi.py @@ -4,14 +4,6 @@ offlineBeamSpot = cms.EDProducer("BeamSpotProducer") -def _loadOnlineBeamSpotESProducer(process): - import RecoVertex.BeamSpotProducer.onlineBeamSpotESProducer_cfi as _mod - process.BeamSpotESProducer = _mod.onlineBeamSpotESProducer.clone( - timeThreshold = 999999 # for express allow >48h old payloads for replays. DO NOT CHANGE - ) - import RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi _onlineBeamSpotProducer = RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi.onlineBeamSpotProducer.clone() mods.offlineToOnlineBeamSpotSwap.toReplaceWith(offlineBeamSpot, _onlineBeamSpotProducer) - -applyOnlineBSESProducer = mods.offlineToOnlineBeamSpotSwap.makeProcessModifier(_loadOnlineBeamSpotESProducer)