File indexing completed on 2024-04-06 12:07:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include "DQM/L1TMonitor/interface/L1TGT.h"
0014
0015 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutSetup.h"
0016 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutCollection.h"
0017
0018 L1TGT::L1TGT(const edm::ParameterSet& ps)
0019 : gtSource_L1GT_(consumes<L1GlobalTriggerReadoutRecord>(ps.getParameter<edm::InputTag>("gtSource"))),
0020 gtSource_L1MuGMT_(consumes<L1MuGMTReadoutCollection>(ps.getParameter<edm::InputTag>("gtSource"))),
0021 gtEvmSource_(consumes<L1GlobalTriggerEvmReadoutRecord>(ps.getParameter<edm::InputTag>("gtEvmSource"))),
0022 m_runInEventLoop(ps.getUntrackedParameter<bool>("runInEventLoop", false)),
0023 m_runInEndLumi(ps.getUntrackedParameter<bool>("runInEndLumi", false)),
0024 verbose_(ps.getUntrackedParameter<bool>("verbose", false)),
0025 m_nrEvJob(0),
0026 m_nrEvRun(0),
0027 preGps_(0ULL),
0028 preOrb_(0ULL) {
0029 m_histFolder = ps.getUntrackedParameter<std::string>("HistFolder", "L1T/L1TGT");
0030 l1gtTrigmenuToken_ = esConsumes<edm::Transition::BeginRun>();
0031 }
0032
0033 L1TGT::~L1TGT() {
0034
0035 }
0036
0037 void L1TGT::bookHistograms(DQMStore::IBooker& ibooker, edm::Run const&, edm::EventSetup const& evSetup) {
0038 ibooker.setCurrentFolder(m_histFolder);
0039
0040
0041 const int TotalNrBinsLs = 1000;
0042 const double totalNrBinsLs = static_cast<double>(TotalNrBinsLs);
0043
0044 ibooker.setCurrentFolder(m_histFolder);
0045
0046 algo_bits = ibooker.book1D("algo_bits", "GT algorithm trigger bits", 128, -0.5, 127.5);
0047 algo_bits->setAxisTitle("Algorithm trigger bits", 1);
0048
0049 algo_bits_corr =
0050 ibooker.book2D("algo_bits_corr", "GT algorithm trigger bit correlation", 128, -0.5, 127.5, 128, -0.5, 127.5);
0051 algo_bits_corr->setAxisTitle("Algorithm trigger bits", 1);
0052 algo_bits_corr->setAxisTitle("Algorithm trigger bits", 2);
0053
0054 tt_bits = ibooker.book1D("tt_bits", "GT technical trigger bits", 64, -0.5, 63.5);
0055 tt_bits->setAxisTitle("Technical trigger bits", 1);
0056
0057 tt_bits_corr = ibooker.book2D("tt_bits_corr", "GT technical trigger bit correlation", 64, -0.5, 63.5, 64, -0.5, 63.5);
0058 tt_bits_corr->setAxisTitle("Technical trigger bits", 1);
0059 tt_bits_corr->setAxisTitle("Technical trigger bits", 2);
0060
0061 algo_tt_bits_corr = ibooker.book2D(
0062 "algo_tt_bits_corr", "GT algorithm - technical trigger bit correlation", 128, -0.5, 127.5, 64, -0.5, 63.5);
0063 algo_tt_bits_corr->setAxisTitle("Algorithm trigger bits", 1);
0064 algo_tt_bits_corr->setAxisTitle("Technical trigger bits", 2);
0065
0066 algo_bits_lumi = ibooker.book2D(
0067 "algo_bits_lumi", "GT algorithm trigger bit rate per LS", TotalNrBinsLs, 0., totalNrBinsLs, 128, -0.5, 127.5);
0068 algo_bits_lumi->setAxisTitle("Luminosity segment", 1);
0069 algo_bits_lumi->setAxisTitle("Algorithm trigger bits", 2);
0070
0071 tt_bits_lumi = ibooker.book2D(
0072 "tt_bits_lumi", "GT technical trigger bit rate per LS", TotalNrBinsLs, 0., totalNrBinsLs, 64, -0.5, 63.5);
0073 tt_bits_lumi->setAxisTitle("Luminosity segment", 1);
0074 tt_bits_lumi->setAxisTitle("Technical trigger bits", 2);
0075
0076 event_type = ibooker.book1D("event_type", "GT event type", 10, -0.5, 9.5);
0077 event_type->setAxisTitle("Event type", 1);
0078 event_type->setBinLabel(2, "Physics", 1);
0079 event_type->setBinLabel(3, "Calibration", 1);
0080 event_type->setBinLabel(4, "Random", 1);
0081 event_type->setBinLabel(6, "Traced", 1);
0082 event_type->setBinLabel(7, "Test", 1);
0083 event_type->setBinLabel(8, "Error", 1);
0084
0085 event_number = ibooker.book1D("event_number", "GT event number (from last resync)", 100, 0., 50000.);
0086 event_number->setAxisTitle("Event number", 1);
0087
0088 event_lumi = ibooker.bookProfile(
0089 "event_lumi", "GT event number (from last resync) vs LS", TotalNrBinsLs, 0., totalNrBinsLs, 100, -0.1, 1.e15, "s");
0090 event_lumi->setAxisTitle("Luminosity segment", 1);
0091 event_lumi->setAxisTitle("Event number", 2);
0092
0093 trigger_number = ibooker.book1D("trigger_number", "GT trigger number (from start run)", 100, 0., 50000.);
0094 trigger_number->setAxisTitle("Trigger number", 1);
0095
0096 trigger_lumi = ibooker.bookProfile("trigger_lumi",
0097 "GT trigger number (from start run) vs LS",
0098 TotalNrBinsLs,
0099 0.,
0100 totalNrBinsLs,
0101 100,
0102 -0.1,
0103 1.e15,
0104 "s");
0105 trigger_lumi->setAxisTitle("Luminosity segment", 1);
0106 trigger_lumi->setAxisTitle("Trigger number", 2);
0107
0108 evnum_trignum_lumi = ibooker.bookProfile(
0109 "evnum_trignum_lumi", "GT event/trigger number ratio vs LS", TotalNrBinsLs, 0., totalNrBinsLs, 100, -0.1, 2., "s");
0110 evnum_trignum_lumi->setAxisTitle("Luminosity segment", 1);
0111 evnum_trignum_lumi->setAxisTitle("Event/trigger number ratio", 2);
0112
0113 orbit_lumi = ibooker.bookProfile(
0114 "orbit_lumi", "GT orbit number vs LS", TotalNrBinsLs, 0., totalNrBinsLs, 100, -0.1, 1.e15, "s");
0115 orbit_lumi->setAxisTitle("Luminosity segment", 1);
0116 orbit_lumi->setAxisTitle("Orbit number", 2);
0117
0118 setupversion_lumi = ibooker.bookProfile(
0119 "setupversion_lumi", "GT setup version vs LS", TotalNrBinsLs, 0., totalNrBinsLs, 100, -0.1, 1.e10, "i");
0120 setupversion_lumi->setAxisTitle("Luminosity segment", 1);
0121 setupversion_lumi->setAxisTitle("Setup version", 2);
0122
0123 gtfe_bx = ibooker.book1D("gtfe_bx", "GTFE Bx number", 3600, 0., 3600.);
0124 gtfe_bx->setAxisTitle("GTFE BX number", 1);
0125
0126 dbx_module =
0127 ibooker.bookProfile("dbx_module", "delta Bx of GT modules wrt GTFE", 20, 0., 20., 100, -4000., 4000., "i");
0128 dbx_module->setAxisTitle("GT crate module", 1);
0129 dbx_module->setAxisTitle("Module Bx - GTFE Bx", 2);
0130 dbx_module->setBinLabel(1, "GTFEevm", 1);
0131 dbx_module->setBinLabel(2, "TCS", 1);
0132 dbx_module->setBinLabel(3, "FDL", 1);
0133 dbx_module->setBinLabel(4, "FDLloc", 1);
0134 dbx_module->setBinLabel(5, "PSB9", 1);
0135 dbx_module->setBinLabel(6, "PSB9loc", 1);
0136 dbx_module->setBinLabel(7, "PSB13", 1);
0137 dbx_module->setBinLabel(8, "PSB13loc", 1);
0138 dbx_module->setBinLabel(9, "PSB14", 1);
0139 dbx_module->setBinLabel(10, "PSB14loc", 1);
0140 dbx_module->setBinLabel(11, "PSB15", 1);
0141 dbx_module->setBinLabel(12, "PSB15loc", 1);
0142 dbx_module->setBinLabel(13, "PSB19", 1);
0143 dbx_module->setBinLabel(14, "PSB19loc", 1);
0144 dbx_module->setBinLabel(15, "PSB20", 1);
0145 dbx_module->setBinLabel(16, "PSB20loc", 1);
0146 dbx_module->setBinLabel(17, "PSB21", 1);
0147 dbx_module->setBinLabel(18, "PSB21loc", 1);
0148 dbx_module->setBinLabel(19, "GMT", 1);
0149
0150 BST_MasterStatus =
0151 ibooker.book2D("BST_MasterStatus", "BST master status over LS", TotalNrBinsLs, 0., totalNrBinsLs, 6, -1., 5.);
0152 BST_MasterStatus->setAxisTitle("Luminosity segment", 1);
0153 BST_MasterStatus->setAxisTitle("BST master status", 2);
0154 BST_MasterStatus->setBinLabel(2, "Master Beam 1", 2);
0155 BST_MasterStatus->setBinLabel(3, "Master Beam 2", 2);
0156
0157 BST_turnCountNumber =
0158 ibooker.book2D("BST_turnCountNumber", "BST turn count over LS", TotalNrBinsLs, 0., totalNrBinsLs, 250, 0., 4.3e9);
0159 BST_turnCountNumber->setAxisTitle("Luminosity segment", 1);
0160 BST_turnCountNumber->setAxisTitle("BST turn count number", 2);
0161
0162 BST_lhcFillNumber = ibooker.book1D("BST_lhcFillNumber", "BST LHC fill number % 1000", 1000, 0., 1000.);
0163 BST_lhcFillNumber->setAxisTitle("BST LHC fill number modulo 1000");
0164
0165 BST_beamMode = ibooker.book2D("BST_beamMode", "BST beam mode over LS", TotalNrBinsLs, 0., totalNrBinsLs, 25, 1., 26.);
0166 BST_beamMode->setAxisTitle("Luminosity segment", 1);
0167 BST_beamMode->setAxisTitle("Mode", 2);
0168 BST_beamMode->setBinLabel(1, "No mode", 2);
0169 BST_beamMode->setBinLabel(2, "Setup", 2);
0170 BST_beamMode->setBinLabel(3, "Inj pilot", 2);
0171 BST_beamMode->setBinLabel(4, "Inj intr", 2);
0172 BST_beamMode->setBinLabel(5, "Inj nomn", 2);
0173 BST_beamMode->setBinLabel(6, "Pre ramp", 2);
0174 BST_beamMode->setBinLabel(7, "Ramp", 2);
0175 BST_beamMode->setBinLabel(8, "Flat top", 2);
0176 BST_beamMode->setBinLabel(9, "Squeeze", 2);
0177 BST_beamMode->setBinLabel(10, "Adjust", 2);
0178 BST_beamMode->setBinLabel(11, "Stable", 2);
0179 BST_beamMode->setBinLabel(12, "Unstable", 2);
0180 BST_beamMode->setBinLabel(13, "Beam dump", 2);
0181 BST_beamMode->setBinLabel(14, "Ramp down", 2);
0182 BST_beamMode->setBinLabel(15, "Recovery", 2);
0183 BST_beamMode->setBinLabel(16, "Inj dump", 2);
0184 BST_beamMode->setBinLabel(17, "Circ dump", 2);
0185 BST_beamMode->setBinLabel(18, "Abort", 2);
0186 BST_beamMode->setBinLabel(19, "Cycling", 2);
0187 BST_beamMode->setBinLabel(20, "Warn beam dump", 2);
0188 BST_beamMode->setBinLabel(21, "No beam", 2);
0189
0190 BST_beamMomentum =
0191 ibooker.book2D("BST_beamMomentum", "BST beam momentum", TotalNrBinsLs, 0., totalNrBinsLs, 100, 0., 7200.);
0192 BST_beamMomentum->setAxisTitle("Luminosity segment", 1);
0193 BST_beamMomentum->setAxisTitle("Beam momentum", 2);
0194
0195 gpsfreq = ibooker.book1D("gpsfreq", "Clock frequency measured by GPS", 1000, 39.95, 40.2);
0196 gpsfreq->setAxisTitle("CMS clock frequency (MHz)");
0197
0198 gpsfreqwide = ibooker.book1D("gpsfreqwide", "Clock frequency measured by GPS", 1000, -2., 200.);
0199 gpsfreqwide->setAxisTitle("CMS clock frequency (MHz)");
0200
0201 gpsfreqlum = ibooker.book2D(
0202 "gpsfreqlum", "Clock frequency measured by GPS", TotalNrBinsLs, 0., totalNrBinsLs, 100, 39.95, 40.2);
0203 gpsfreqlum->setAxisTitle("Luminosity segment", 1);
0204 gpsfreqlum->setAxisTitle("CMS clock frequency (MHz)", 2);
0205
0206 BST_intensityBeam1 =
0207 ibooker.book2D("BST_intensityBeam1", "Intensity beam 1", TotalNrBinsLs, 0., totalNrBinsLs, 1000, 0., 5000.);
0208 BST_intensityBeam1->setAxisTitle("Luminosity segment", 1);
0209 BST_intensityBeam1->setAxisTitle("Beam intensity", 2);
0210
0211 BST_intensityBeam2 =
0212 ibooker.book2D("BST_intensityBeam2", "Intensity beam 2", TotalNrBinsLs, 0., totalNrBinsLs, 1000, 0., 5000.);
0213 BST_intensityBeam2->setAxisTitle("Luminosity segment", 1);
0214 BST_intensityBeam2->setAxisTitle("Beam intensity", 2);
0215
0216
0217
0218 m_monL1PrescaleFactorSet = ibooker.book2D(
0219 "L1PrescaleFactorSet", "Index of L1 prescale factor set", TotalNrBinsLs, 0., totalNrBinsLs, 25, 0., 25.);
0220 m_monL1PrescaleFactorSet->setAxisTitle("Luminosity segment", 1);
0221 m_monL1PrescaleFactorSet->setAxisTitle("L1 PF set index", 2);
0222 m_monL1PfIndicesPerLs =
0223 ibooker.book1D("L1PfIndicesPerLs", "Number of prescale factor indices used per LS", 10, 0., 10.);
0224 m_monL1PfIndicesPerLs->setAxisTitle("Number of PF indices used per LS", 1);
0225 m_monL1PfIndicesPerLs->setAxisTitle("Entries", 2);
0226
0227
0228
0229 ibooker.setCurrentFolder(m_histFolder + "/TCSvsEvmFDL");
0230
0231
0232 m_monOrbitNrDiffTcsFdlEvm = ibooker.book1D("OrbitNrDiffTcsFdlEvm",
0233 "Orbit number difference (TCS - EVM_FDL)",
0234 2 * MaxOrbitNrDiffTcsFdlEvm + 1,
0235 static_cast<float>(-(MaxOrbitNrDiffTcsFdlEvm + 1)),
0236 static_cast<float>(MaxOrbitNrDiffTcsFdlEvm + 1));
0237 m_monOrbitNrDiffTcsFdlEvm->setAxisTitle("Orbit number difference", 1);
0238 m_monOrbitNrDiffTcsFdlEvm->setAxisTitle("Entries/run", 2);
0239 m_monLsNrDiffTcsFdlEvm = ibooker.book1D("LsNrDiffTcsFdlEvm",
0240 "LS number difference (TCS - EVM_FDL)",
0241 2 * MaxLsNrDiffTcsFdlEvm + 1,
0242 static_cast<float>(-(MaxLsNrDiffTcsFdlEvm + 1)),
0243 static_cast<float>(MaxLsNrDiffTcsFdlEvm + 1));
0244 m_monLsNrDiffTcsFdlEvm->setAxisTitle("LS number difference", 1);
0245 m_monLsNrDiffTcsFdlEvm->setAxisTitle("Entries/run", 2);
0246
0247
0248 m_monOrbitNrDiffTcsFdlEvmLs = ibooker.book2D("OrbitNrDiffTcsFdlEvmLs",
0249 "Orbit number difference (TCS - EVM_FDL)",
0250 TotalNrBinsLs,
0251 0.,
0252 totalNrBinsLs,
0253 2 * MaxOrbitNrDiffTcsFdlEvm + 1,
0254 static_cast<float>(-(MaxOrbitNrDiffTcsFdlEvm + 1)),
0255 static_cast<float>(MaxOrbitNrDiffTcsFdlEvm + 1));
0256 m_monOrbitNrDiffTcsFdlEvmLs->setAxisTitle("Luminosity segment", 1);
0257 m_monOrbitNrDiffTcsFdlEvmLs->setAxisTitle("Orbit number difference (TCS - EVM_FDL)", 2);
0258
0259 m_monLsNrDiffTcsFdlEvmLs = ibooker.book2D("LsNrDiffTcsFdlEvmLs",
0260 "LS number difference (TCS - EVM_FDL)",
0261 TotalNrBinsLs,
0262 0.,
0263 totalNrBinsLs,
0264 2 * MaxLsNrDiffTcsFdlEvm + 1,
0265 static_cast<float>(-(MaxLsNrDiffTcsFdlEvm + 1)),
0266 static_cast<float>(MaxLsNrDiffTcsFdlEvm + 1));
0267 m_monLsNrDiffTcsFdlEvmLs->setAxisTitle("Luminosity segment", 1);
0268 m_monLsNrDiffTcsFdlEvmLs->setAxisTitle("LS number difference (TCS - EVM_FDL)", 2);
0269
0270 ibooker.setCurrentFolder(m_histFolder);
0271
0272 m_pairLsNumberPfIndex.clear();
0273
0274 ibooker.setCurrentFolder(m_histFolder + "/PlotTrigsBx");
0275
0276
0277
0278
0279
0280
0281 const L1GtTriggerMenu* menu = &evSetup.getData(l1gtTrigmenuToken_);
0282
0283 h_L1AlgoBX1 = ibooker.book2D("h_L1AlgoBX1", "L1 Algo Trigger BX (algo bit 0 to 31)", 32, -0.5, 31.5, 5, -2.5, 2.5);
0284 h_L1AlgoBX2 = ibooker.book2D("h_L1AlgoBX2", "L1 Algo Trigger BX (algo bit 32 to 63)", 32, 31.5, 63.5, 5, -2.5, 2.5);
0285 h_L1AlgoBX3 = ibooker.book2D("h_L1AlgoBX3", "L1 Algo Trigger BX (algo bit 64 to 95)", 32, 63.5, 95.5, 5, -2.5, 2.5);
0286 h_L1AlgoBX4 = ibooker.book2D("h_L1AlgoBX4", "L1 Algo Trigger BX (algo bit 96 to 127)", 32, 95.5, 127.5, 5, -2.5, 2.5);
0287 h_L1TechBX = ibooker.book2D("h_L1TechBX", "L1 Tech Trigger BX", 64, -0.5, 63.5, 5, -2.5, 2.5);
0288
0289 for (CItAlgo algo = menu->gtAlgorithmMap().begin(); algo != menu->gtAlgorithmMap().end(); ++algo) {
0290 int itrig = (algo->second).algoBitNumber();
0291
0292
0293 if (itrig < 32) {
0294
0295 h_L1AlgoBX1->setBinLabel(itrig + 1, std::to_string(itrig));
0296 h_L1AlgoBX1->setAxisTitle("Algorithm trigger bits", 1);
0297 h_L1AlgoBX1->setAxisTitle("BX (0=L1A)", 2);
0298 } else if (itrig < 64) {
0299
0300 h_L1AlgoBX2->setBinLabel(itrig + 1 - 32, std::to_string(itrig));
0301 h_L1AlgoBX2->setAxisTitle("Algorithm trigger bits", 1);
0302 h_L1AlgoBX2->setAxisTitle("BX (0=L1A)", 2);
0303 } else if (itrig < 96) {
0304
0305 h_L1AlgoBX3->setBinLabel(itrig + 1 - 64, std::to_string(itrig));
0306 h_L1AlgoBX3->setAxisTitle("Algorithm trigger bits", 1);
0307 h_L1AlgoBX3->setAxisTitle("BX (0=L1A)", 2);
0308 } else if (itrig < 128) {
0309
0310 h_L1AlgoBX4->setBinLabel(itrig + 1 - 96, std::to_string(itrig));
0311 h_L1AlgoBX4->setAxisTitle("Algorithm trigger bits", 1);
0312 h_L1AlgoBX4->setAxisTitle("BX (0=L1A)", 2);
0313 }
0314 }
0315
0316
0317 for (CItAlgo techTrig = menu->gtTechnicalTriggerMap().begin(); techTrig != menu->gtTechnicalTriggerMap().end();
0318 ++techTrig) {
0319 int itrig = (techTrig->second).algoBitNumber();
0320
0321
0322 h_L1TechBX->setBinLabel(itrig + 1, std::to_string(itrig));
0323 h_L1TechBX->setAxisTitle("Technical trigger bits", 1);
0324 h_L1TechBX->setAxisTitle("BX (0=L1A)", 2);
0325 }
0326 }
0327
0328 void L1TGT::dqmBeginRun(edm::Run const& iRrun, edm::EventSetup const& evSetup) { m_nrEvRun = 0; }
0329
0330
0331 void L1TGT::analyze(const edm::Event& iEvent, const edm::EventSetup& evSetup) {
0332 m_nrEvJob++;
0333
0334 if (verbose_) {
0335 edm::LogInfo("L1TGT") << "L1TGT: analyze...." << std::endl;
0336 }
0337
0338
0339 int tcsBx = -1;
0340 int gtfeEvmBx = -1;
0341
0342 long long int orbitTcs = -1;
0343 int orbitEvmFdl = -1;
0344
0345 int lsTcs = -1;
0346 int lsEvmFdl = -1;
0347
0348
0349 const int lsNumber = iEvent.luminosityBlock();
0350
0351
0352 edm::Handle<L1GlobalTriggerEvmReadoutRecord> gtEvmReadoutRecord;
0353 iEvent.getByToken(gtEvmSource_, gtEvmReadoutRecord);
0354
0355 if (!gtEvmReadoutRecord.isValid()) {
0356 edm::LogInfo("L1TGT") << "can't find L1GlobalTriggerEvmReadoutRecord";
0357 } else {
0358
0359
0360 const L1GtfeWord& gtfeEvmWord = gtEvmReadoutRecord->gtfeWord();
0361 const L1GtfeExtWord& gtfeEvmExtWord = gtEvmReadoutRecord->gtfeWord();
0362
0363 gtfeEvmBx = gtfeEvmWord.bxNr();
0364 int gtfeEvmActiveBoards = gtfeEvmWord.activeBoards();
0365
0366 if (isActive(gtfeEvmActiveBoards, TCS)) {
0367
0368
0369 const L1TcsWord& tcsWord = gtEvmReadoutRecord->tcsWord();
0370
0371 tcsBx = tcsWord.bxNr();
0372 orbitTcs = tcsWord.orbitNr();
0373 lsTcs = tcsWord.luminositySegmentNr();
0374
0375 event_type->Fill(tcsWord.triggerType());
0376 orbit_lumi->Fill(lsNumber, orbitTcs);
0377
0378 trigger_number->Fill(tcsWord.partTrigNr());
0379 event_number->Fill(tcsWord.eventNr());
0380
0381 trigger_lumi->Fill(lsNumber, tcsWord.partTrigNr());
0382 event_lumi->Fill(lsNumber, tcsWord.eventNr());
0383 evnum_trignum_lumi->Fill(lsNumber,
0384 static_cast<double>(tcsWord.eventNr()) / static_cast<double>(tcsWord.partTrigNr()));
0385
0386 uint16_t master = gtfeEvmExtWord.bstMasterStatus();
0387 uint32_t turnCount = gtfeEvmExtWord.turnCountNumber();
0388 uint32_t lhcFill = gtfeEvmExtWord.lhcFillNumber();
0389 uint16_t beam = gtfeEvmExtWord.beamMode();
0390 uint16_t momentum = gtfeEvmExtWord.beamMomentum();
0391 uint32_t intensity1 = gtfeEvmExtWord.totalIntensityBeam1();
0392 uint32_t intensity2 = gtfeEvmExtWord.totalIntensityBeam2();
0393
0394 BST_MasterStatus->Fill(lsNumber, static_cast<double>(master));
0395 BST_turnCountNumber->Fill(lsNumber, static_cast<double>(turnCount));
0396 BST_lhcFillNumber->Fill(static_cast<double>(lhcFill % 1000));
0397 BST_beamMode->Fill(lsNumber, static_cast<double>(beam));
0398
0399 BST_beamMomentum->Fill(lsNumber, static_cast<double>(momentum));
0400 BST_intensityBeam1->Fill(lsNumber, static_cast<double>(intensity1));
0401 BST_intensityBeam2->Fill(lsNumber, static_cast<double>(intensity2));
0402
0403 if (verbose_) {
0404 edm::LogInfo("L1TGT") << " check mode = " << beam << " momentum " << momentum << " int2 " << intensity2
0405 << std::endl;
0406 }
0407
0408 uint64_t gpsr = gtfeEvmExtWord.gpsTime();
0409 uint64_t gpshi = (gpsr >> 32) & 0xffffffff;
0410 uint64_t gpslo = gpsr & 0xffffffff;
0411 uint64_t gps = gpshi * 1000000 + gpslo;
0412
0413
0414 Long64_t delorb = orbitTcs - preOrb_;
0415 Long64_t delgps = gps - preGps_;
0416 Double_t freq = -1.;
0417
0418 if (delgps > 0) {
0419 freq = ((Double_t)(delorb)) * 3564. / ((Double_t)(delgps));
0420 }
0421
0422 if (delorb > 0) {
0423 gpsfreq->Fill(freq);
0424 gpsfreqwide->Fill(freq);
0425 gpsfreqlum->Fill(lsNumber, freq);
0426 if (verbose_) {
0427 if (freq > 200.) {
0428 edm::LogInfo("L1TGT") << " preOrb_ = " << preOrb_ << " orbitTcs=" << orbitTcs << " delorb=" << delorb
0429 << std::hex << " preGps_=" << preGps_ << " gps=" << gps << std::dec
0430 << " delgps=" << delgps << " freq=" << freq << std::endl;
0431 }
0432 }
0433 }
0434
0435 preGps_ = gps;
0436 preOrb_ = orbitTcs;
0437 }
0438
0439
0440 if (isActive(gtfeEvmActiveBoards, FDL)) {
0441 const L1GtFdlWord& fdlWord = gtEvmReadoutRecord->gtFdlWord();
0442
0443 orbitEvmFdl = fdlWord.orbitNr();
0444 lsEvmFdl = fdlWord.lumiSegmentNr();
0445 }
0446
0447 if ((orbitTcs >= 0) && (orbitEvmFdl >= 0)) {
0448 int diffOrbit = static_cast<float>(orbitTcs - orbitEvmFdl);
0449 edm::LogInfo("L1TGT") << "\n orbitTcs = " << orbitTcs << " orbitEvmFdl = " << orbitEvmFdl
0450 << " diffOrbit = " << diffOrbit << " orbitEvent = " << iEvent.orbitNumber() << std::endl;
0451
0452 if (diffOrbit >= MaxOrbitNrDiffTcsFdlEvm) {
0453 m_monOrbitNrDiffTcsFdlEvm->Fill(MaxOrbitNrDiffTcsFdlEvm);
0454
0455 } else if (diffOrbit <= -MaxOrbitNrDiffTcsFdlEvm) {
0456 m_monOrbitNrDiffTcsFdlEvm->Fill(-MaxOrbitNrDiffTcsFdlEvm);
0457
0458 } else {
0459 m_monOrbitNrDiffTcsFdlEvm->Fill(diffOrbit);
0460 m_monOrbitNrDiffTcsFdlEvmLs->Fill(lsNumber, diffOrbit);
0461 }
0462
0463 } else {
0464 if (orbitTcs >= 0) {
0465
0466 m_monOrbitNrDiffTcsFdlEvm->Fill(MaxOrbitNrDiffTcsFdlEvm);
0467 } else if (orbitEvmFdl >= 0) {
0468
0469 m_monOrbitNrDiffTcsFdlEvm->Fill(-MaxOrbitNrDiffTcsFdlEvm);
0470
0471 } else {
0472
0473 m_monOrbitNrDiffTcsFdlEvm->Fill(-MaxOrbitNrDiffTcsFdlEvm);
0474 m_monOrbitNrDiffTcsFdlEvm->Fill(MaxOrbitNrDiffTcsFdlEvm);
0475 }
0476 }
0477
0478 if ((lsTcs >= 0) && (lsEvmFdl >= 0)) {
0479 int diffLs = static_cast<float>(lsTcs - lsEvmFdl);
0480 edm::LogInfo("L1TGT") << "\n lsTcs = " << lsTcs << " lsEvmFdl = " << lsEvmFdl << " diffLs = " << diffLs
0481 << " lsEvent = " << lsNumber << std::endl;
0482
0483 if (diffLs >= MaxLsNrDiffTcsFdlEvm) {
0484 m_monLsNrDiffTcsFdlEvm->Fill(MaxLsNrDiffTcsFdlEvm);
0485
0486 } else if (diffLs <= -MaxLsNrDiffTcsFdlEvm) {
0487 m_monLsNrDiffTcsFdlEvm->Fill(-MaxLsNrDiffTcsFdlEvm);
0488
0489 } else {
0490 m_monLsNrDiffTcsFdlEvm->Fill(diffLs);
0491 m_monLsNrDiffTcsFdlEvmLs->Fill(lsNumber, diffLs);
0492 }
0493
0494 } else {
0495 if (lsTcs >= 0) {
0496
0497 m_monLsNrDiffTcsFdlEvm->Fill(MaxLsNrDiffTcsFdlEvm);
0498 } else if (lsEvmFdl >= 0) {
0499
0500 m_monLsNrDiffTcsFdlEvm->Fill(-MaxLsNrDiffTcsFdlEvm);
0501
0502 } else {
0503
0504 m_monLsNrDiffTcsFdlEvm->Fill(-MaxLsNrDiffTcsFdlEvm);
0505 m_monLsNrDiffTcsFdlEvm->Fill(MaxLsNrDiffTcsFdlEvm);
0506 }
0507 }
0508 }
0509
0510
0511 edm::Handle<L1GlobalTriggerReadoutRecord> gtReadoutRecord;
0512 iEvent.getByToken(gtSource_L1GT_, gtReadoutRecord);
0513
0514
0515
0516
0517
0518
0519 if (!gtReadoutRecord.isValid()) {
0520 edm::LogInfo("L1TGT") << "can't find L1GlobalTriggerReadoutRecord";
0521 return;
0522 }
0523
0524 if (gtReadoutRecord.isValid()) {
0525 unsigned int NmaxL1AlgoBit = gtReadoutRecord->decisionWord().size();
0526 unsigned int NmaxL1TechBit = gtReadoutRecord->technicalTriggerWord().size();
0527
0528 const DecisionWord dWord = gtReadoutRecord->decisionWord();
0529 const TechnicalTriggerWord technicalTriggerWordBeforeMask = gtReadoutRecord->technicalTriggerWord();
0530
0531 const std::vector<L1GtFdlWord>& m_gtFdlWord(gtReadoutRecord->gtFdlVector());
0532 int numberBxInEvent = m_gtFdlWord.size();
0533 int minBxInEvent = (numberBxInEvent + 1) / 2 - numberBxInEvent;
0534
0535 for (unsigned int iBit = 0; iBit < NmaxL1AlgoBit; ++iBit) {
0536 bool accept = dWord[iBit];
0537
0538 typedef std::map<std::string, bool>::value_type valType;
0539 trig_iter = l1TriggerDecision.find(algoBitToName[iBit]);
0540 if (trig_iter == l1TriggerDecision.end()) {
0541 l1TriggerDecision.insert(valType(algoBitToName[iBit], accept));
0542 } else {
0543 trig_iter->second = accept;
0544 }
0545
0546 int ibx = 0;
0547 for (std::vector<L1GtFdlWord>::const_iterator itBx = m_gtFdlWord.begin(); itBx != m_gtFdlWord.end(); ++itBx) {
0548 const DecisionWord dWordBX = (*itBx).gtDecisionWord();
0549 bool accept = dWordBX[iBit];
0550 if (accept) {
0551 if (iBit < 32)
0552 h_L1AlgoBX1->Fill(iBit, minBxInEvent + ibx);
0553 else if (iBit < 64)
0554 h_L1AlgoBX2->Fill(iBit, minBxInEvent + ibx);
0555 else if (iBit < 96)
0556 h_L1AlgoBX3->Fill(iBit, minBxInEvent + ibx);
0557 else if (iBit < 128)
0558 h_L1AlgoBX4->Fill(iBit, minBxInEvent + ibx);
0559 }
0560 ibx++;
0561 }
0562 }
0563
0564 for (unsigned int iBit = 0; iBit < NmaxL1TechBit; ++iBit) {
0565 bool accept = technicalTriggerWordBeforeMask[iBit];
0566
0567 typedef std::map<std::string, bool>::value_type valType;
0568 trig_iter = l1TechTriggerDecision.find(techBitToName[iBit]);
0569 if (trig_iter == l1TechTriggerDecision.end())
0570 l1TechTriggerDecision.insert(valType(techBitToName[iBit], accept));
0571 else
0572 trig_iter->second = accept;
0573
0574 int ibx = 0;
0575 for (std::vector<L1GtFdlWord>::const_iterator itBx = m_gtFdlWord.begin(); itBx != m_gtFdlWord.end(); ++itBx) {
0576 const DecisionWord dWordBX = (*itBx).gtTechnicalTriggerWord();
0577 bool accept = dWordBX[iBit];
0578 if (accept)
0579 h_L1TechBX->Fill(iBit, minBxInEvent + ibx);
0580 ibx++;
0581 }
0582 }
0583 }
0584
0585
0586 int gtfeBx = -1;
0587 int fdlBx[2] = {-1, -1};
0588 int psbBx[2][7] = {{-1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1}};
0589 int gmtBx = -1;
0590
0591
0592 const L1GtfeWord& gtfeWord = gtReadoutRecord->gtfeWord();
0593 gtfeBx = gtfeWord.bxNr();
0594 gtfe_bx->Fill(gtfeBx);
0595 setupversion_lumi->Fill(lsNumber, gtfeWord.setupVersion());
0596 int gtfeActiveBoards = gtfeWord.activeBoards();
0597
0598
0599 if (isActive(gtfeActiveBoards, GMT)) {
0600 edm::Handle<L1MuGMTReadoutCollection> gmtReadoutCollection;
0601 iEvent.getByToken(gtSource_L1MuGMT_, gmtReadoutCollection);
0602
0603 if (gmtReadoutCollection.isValid()) {
0604 gmtBx = gmtReadoutCollection->getRecord().getBxNr();
0605 }
0606 }
0607
0608
0609 if (isActive(gtfeActiveBoards, FDL)) {
0610 const L1GtFdlWord& fdlWord = gtReadoutRecord->gtFdlWord();
0611 fdlBx[0] = fdlWord.bxNr();
0612 fdlBx[1] = fdlWord.localBxNr();
0613
0614
0615 const DecisionWord& gtDecisionWord = gtReadoutRecord->decisionWord();
0616 const TechnicalTriggerWord& gtTTWord = gtReadoutRecord->technicalTriggerWord();
0617
0618 int dbitNumber = 0;
0619 DecisionWord::const_iterator GTdbitItr;
0620 algo_bits->Fill(-1.);
0621 for (GTdbitItr = gtDecisionWord.begin(); GTdbitItr != gtDecisionWord.end(); GTdbitItr++) {
0622 if (*GTdbitItr) {
0623 algo_bits->Fill(dbitNumber);
0624 algo_bits_lumi->Fill(lsNumber, dbitNumber);
0625 int dbitNumber1 = 0;
0626 DecisionWord::const_iterator GTdbitItr1;
0627 for (GTdbitItr1 = gtDecisionWord.begin(); GTdbitItr1 != gtDecisionWord.end(); GTdbitItr1++) {
0628 if (*GTdbitItr1)
0629 algo_bits_corr->Fill(dbitNumber, dbitNumber1);
0630 dbitNumber1++;
0631 }
0632 int tbitNumber1 = 0;
0633 TechnicalTriggerWord::const_iterator GTtbitItr1;
0634 for (GTtbitItr1 = gtTTWord.begin(); GTtbitItr1 != gtTTWord.end(); GTtbitItr1++) {
0635 if (*GTtbitItr1)
0636 algo_tt_bits_corr->Fill(dbitNumber, tbitNumber1);
0637 tbitNumber1++;
0638 }
0639 }
0640 dbitNumber++;
0641 }
0642
0643 int tbitNumber = 0;
0644 TechnicalTriggerWord::const_iterator GTtbitItr;
0645 tt_bits->Fill(-1.);
0646 for (GTtbitItr = gtTTWord.begin(); GTtbitItr != gtTTWord.end(); GTtbitItr++) {
0647 if (*GTtbitItr) {
0648 tt_bits->Fill(tbitNumber);
0649 tt_bits_lumi->Fill(lsNumber, tbitNumber);
0650 int tbitNumber1 = 0;
0651 TechnicalTriggerWord::const_iterator GTtbitItr1;
0652 for (GTtbitItr1 = gtTTWord.begin(); GTtbitItr1 != gtTTWord.end(); GTtbitItr1++) {
0653 if (*GTtbitItr1)
0654 tt_bits_corr->Fill(tbitNumber, tbitNumber1);
0655 tbitNumber1++;
0656 }
0657 }
0658 tbitNumber++;
0659 }
0660
0661
0662
0663
0664
0665 const int pfIndexAlgoTrig = fdlWord.gtPrescaleFactorIndexAlgo();
0666 m_monL1PrescaleFactorSet->Fill(lsNumber, static_cast<float>(pfIndexAlgoTrig));
0667
0668
0669
0670
0671
0672
0673 std::pair<int, int> pairLsPfi = std::make_pair(lsNumber, pfIndexAlgoTrig);
0674
0675 CItVecPair cIt = find(m_pairLsNumberPfIndex.begin(), m_pairLsNumberPfIndex.end(), pairLsPfi);
0676
0677 if (cIt == m_pairLsNumberPfIndex.end()) {
0678 m_pairLsNumberPfIndex.push_back(pairLsPfi);
0679 }
0680 }
0681
0682
0683 int ibit = PSB9;
0684
0685 int psbID[7] = {0xbb09, 0xbb0d, 0xbb0e, 0xbb0f, 0xbb13, 0xbb14, 0xbb15};
0686 for (int i = 0; i < 7; i++) {
0687 if (isActive(gtfeActiveBoards, ibit)) {
0688 L1GtPsbWord psbWord = gtReadoutRecord->gtPsbWord(psbID[i]);
0689 psbBx[0][i] = psbWord.bxNr();
0690 psbBx[1][i] = psbWord.localBxNr();
0691 }
0692 ibit++;
0693 }
0694
0695
0696 if (gtfeEvmBx > -1)
0697 dbx_module->Fill(0., gtfeEvmBx - gtfeBx);
0698 if (tcsBx > -1)
0699 dbx_module->Fill(1., tcsBx - gtfeBx);
0700 for (int i = 0; i < 2; i++) {
0701 if (fdlBx[i] > -1)
0702 dbx_module->Fill(2. + i, fdlBx[i] - gtfeBx);
0703 }
0704 for (int j = 0; j < 7; j++) {
0705 for (int i = 0; i < 2; i++) {
0706 if (psbBx[i][j] > -1)
0707 dbx_module->Fill(4. + i + 2 * j, psbBx[i][j] - gtfeBx);
0708 }
0709 }
0710 if (gmtBx > -1)
0711 dbx_module->Fill(18., gmtBx - gtfeBx);
0712 }
0713
0714
0715 void L1TGT::endLuminosityBlock(const edm::LuminosityBlock& iLumi, const edm::EventSetup& evSetup) {
0716 if (m_runInEndLumi) {
0717 countPfsIndicesPerLs();
0718 }
0719 }
0720
0721
0722 bool L1TGT::isActive(int word, int bit) {
0723 if (word & (1 << bit))
0724 return true;
0725 return false;
0726 }
0727
0728 void L1TGT::countPfsIndicesPerLs() {
0729 if (verbose_) {
0730 edm::LogInfo("L1TGT") << "\n Prescale factor indices used in a LS " << std::endl;
0731
0732 for (CItVecPair cIt = m_pairLsNumberPfIndex.begin(); cIt != m_pairLsNumberPfIndex.end(); ++cIt) {
0733 edm::LogVerbatim("L1TGT") << " lsNumber = " << (*cIt).first << " pfIndex = " << (*cIt).second << std::endl;
0734 }
0735 edm::LogVerbatim("L1TGT") << std::endl;
0736 }
0737
0738
0739 m_monL1PfIndicesPerLs->Reset();
0740
0741
0742 std::sort(m_pairLsNumberPfIndex.begin(), m_pairLsNumberPfIndex.end());
0743
0744 int previousLsNumber = -1;
0745 int previousPfsIndex = -1;
0746
0747
0748
0749
0750 int pfsIndicesPerLs = 1;
0751 for (CItVecPair cIt = m_pairLsNumberPfIndex.begin(); cIt != m_pairLsNumberPfIndex.end(); ++cIt) {
0752 if ((*cIt).first == previousLsNumber) {
0753 if ((*cIt).second != previousPfsIndex) {
0754 previousPfsIndex = (*cIt).second;
0755 pfsIndicesPerLs++;
0756 }
0757
0758 } else {
0759
0760 if (previousLsNumber != -1) {
0761 m_monL1PfIndicesPerLs->Fill(pfsIndicesPerLs);
0762 }
0763
0764
0765 previousLsNumber = (*cIt).first;
0766 previousPfsIndex = (*cIt).second;
0767 pfsIndicesPerLs = 1;
0768 }
0769 }
0770 }
0771
0772
0773
0774 const int L1TGT::MaxOrbitNrDiffTcsFdlEvm = 24;
0775
0776
0777 const int L1TGT::MaxLsNrDiffTcsFdlEvm = 24;