File indexing completed on 2023-03-17 11:14:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include "L1TriggerConfig/L1GtConfigProducers/interface/L1GtBoardMapsTrivialProducer.h"
0017
0018
0019 #include <memory>
0020
0021 #include <string>
0022
0023
0024
0025 #include "FWCore/Utilities/interface/EDMException.h"
0026
0027 #include "FWCore/Framework/interface/ModuleFactory.h"
0028 #include "FWCore/Framework/interface/ESHandle.h"
0029
0030 #include "CondFormats/L1TObjects/interface/L1GtFwd.h"
0031
0032
0033
0034
0035
0036 std::vector<L1GtObject> chInputObjects(const std::vector<std::string>& chInputStrings) {
0037 std::vector<L1GtObject> chInputObjectsV;
0038 chInputObjectsV.reserve(chInputStrings.size());
0039
0040 L1GtObject obj;
0041
0042 for (std::vector<std::string>::const_iterator itObj = chInputStrings.begin(); itObj != chInputStrings.end();
0043 ++itObj) {
0044 if ((*itObj) == "Mu") {
0045 obj = Mu;
0046 } else if ((*itObj) == "NoIsoEG") {
0047 obj = NoIsoEG;
0048 } else if ((*itObj) == "IsoEG") {
0049 obj = IsoEG;
0050 } else if ((*itObj) == "CenJet") {
0051 obj = CenJet;
0052 } else if ((*itObj) == "ForJet") {
0053 obj = ForJet;
0054 } else if ((*itObj) == "TauJet") {
0055 obj = TauJet;
0056 } else if ((*itObj) == "ETM") {
0057 obj = ETM;
0058 } else if ((*itObj) == "ETT") {
0059 obj = ETT;
0060 } else if ((*itObj) == "HTT") {
0061 obj = HTT;
0062 } else if ((*itObj) == "HTM") {
0063 obj = HTM;
0064 } else if ((*itObj) == "JetCounts") {
0065 obj = JetCounts;
0066 } else if ((*itObj) == "HfBitCounts") {
0067 obj = HfBitCounts;
0068 } else if ((*itObj) == "HfRingEtSums") {
0069 obj = HfRingEtSums;
0070 } else if ((*itObj) == "TechTrig") {
0071 obj = TechTrig;
0072 } else if ((*itObj) == "BPTX") {
0073 obj = BPTX;
0074 } else if ((*itObj) == "GtExternal") {
0075 obj = GtExternal;
0076 } else {
0077 throw cms::Exception("Configuration") << "\nError: no such L1 GT object: " << (*itObj) << "\n"
0078 << "\n Can not define the mapping of the L1 GT boards. \n"
0079 << std::endl;
0080 }
0081
0082 chInputObjectsV.push_back(obj);
0083 }
0084
0085 return chInputObjectsV;
0086 }
0087
0088
0089 L1GtBoardMapsTrivialProducer::L1GtBoardMapsTrivialProducer(const edm::ParameterSet& parSet) {
0090
0091 setWhatProduced(this, &L1GtBoardMapsTrivialProducer::produceBoardMaps);
0092
0093
0094
0095
0096 std::vector<std::string> boardList = parSet.getParameter<std::vector<std::string> >("BoardList");
0097
0098 std::vector<int> boardIndexVec = parSet.getParameter<std::vector<int> >("BoardIndex");
0099
0100
0101
0102
0103 if (boardList.size() != boardIndexVec.size()) {
0104 throw cms::Exception("Configuration") << "\nError: inconsistent length of board list and board indices.\n"
0105 << "\n Can not define the mapping of the L1 GT boards. \n"
0106 << std::endl;
0107 }
0108
0109
0110 std::vector<int> boardPositionDaqRecord = parSet.getParameter<std::vector<int> >("BoardPositionDaqRecord");
0111
0112 if (boardList.size() != boardPositionDaqRecord.size()) {
0113 throw cms::Exception("Configuration")
0114 << "\nError: inconsistent length of board list and board indices in GT DAQ record.\n"
0115 << "\n Can not define the mapping of the L1 GT boards. \n"
0116 << std::endl;
0117 }
0118
0119
0120 std::vector<int> boardPositionEvmRecord = parSet.getParameter<std::vector<int> >("BoardPositionEvmRecord");
0121
0122 if (boardList.size() != boardPositionEvmRecord.size()) {
0123 throw cms::Exception("Configuration")
0124 << "\nError: inconsistent length of board list and board indices in GT EVM record.\n"
0125 << "\n Can not define the mapping of the L1 GT boards. \n"
0126 << std::endl;
0127 }
0128
0129
0130 std::vector<int> activeBoardsDaqRecord = parSet.getParameter<std::vector<int> >("ActiveBoardsDaqRecord");
0131
0132 if (boardList.size() != activeBoardsDaqRecord.size()) {
0133 throw cms::Exception("Configuration")
0134 << "\nError: inconsistent length of board list and active boards in GT DAQ record.\n"
0135 << "\n Can not define the mapping of the L1 GT boards. \n"
0136 << std::endl;
0137 }
0138
0139
0140 std::vector<int> activeBoardsEvmRecord = parSet.getParameter<std::vector<int> >("ActiveBoardsEvmRecord");
0141
0142 if (boardList.size() != activeBoardsEvmRecord.size()) {
0143 throw cms::Exception("Configuration")
0144 << "\nError: inconsistent length of board list and active boards in GT EVM record.\n"
0145 << "\n Can not define the mapping of the L1 GT boards. \n"
0146 << std::endl;
0147 }
0148
0149
0150 std::vector<int> boardSlotMap = parSet.getParameter<std::vector<int> >("BoardSlotMap");
0151
0152 if (boardList.size() != boardSlotMap.size()) {
0153 throw cms::Exception("Configuration") << "\nError: inconsistent length of board list and board - slot map.\n"
0154 << "\n Can not define the mapping of the L1 GT boards. \n"
0155 << std::endl;
0156 }
0157
0158
0159 std::vector<int> boardHexNameMap = parSet.getParameter<std::vector<int> >("BoardHexNameMap");
0160
0161 if (boardList.size() != boardHexNameMap.size()) {
0162 throw cms::Exception("Configuration")
0163 << "\nError: inconsistent length of board list and board name in hw record map.\n"
0164 << "\n Can not define the mapping of the L1 GT boards. \n"
0165 << std::endl;
0166 }
0167
0168
0169
0170
0171 std::vector<std::string> cableList = parSet.getParameter<std::vector<std::string> >("CableList");
0172
0173
0174
0175
0176 std::vector<int> cableToPsbMap = parSet.getParameter<std::vector<int> >("CableToPsbMap");
0177
0178 if (cableList.size() != cableToPsbMap.size()) {
0179 throw cms::Exception("Configuration") << "\nError: inconsistent length of cable list and input to PSB list.\n"
0180 << "\n Can not define the mapping of GCT quadruplets to GT PSBs.\n"
0181 << std::endl;
0182 }
0183
0184
0185 std::vector<edm::ParameterSet> psbInput = parSet.getParameter<std::vector<edm::ParameterSet> >("PsbInput");
0186
0187
0188 m_gtBoardMaps.reserve(boardList.size());
0189
0190
0191 int posVec = 0;
0192
0193 for (std::vector<std::string>::const_iterator it = boardList.begin(); it != boardList.end(); ++it) {
0194 L1GtBoardType boardType;
0195
0196 if ((*it) == "GTFE") {
0197 boardType = GTFE;
0198 } else if ((*it) == "FDL") {
0199 boardType = FDL;
0200 } else if ((*it) == "PSB") {
0201 boardType = PSB;
0202 } else if ((*it) == "GMT") {
0203 boardType = GMT;
0204 } else if ((*it) == "TCS") {
0205 boardType = TCS;
0206 } else if ((*it) == "TIM") {
0207 boardType = TIM;
0208 } else {
0209 throw cms::Exception("Configuration") << "\nError: no such board: " << (*it).c_str() << "\n"
0210 << "\n Can not define the mapping of the L1 GT boards. \n"
0211 << std::endl;
0212 }
0213
0214
0215
0216 int iBoard = boardIndexVec.at(posVec);
0217 L1GtBoard gtBoard = L1GtBoard(boardType, iBoard);
0218
0219
0220
0221 gtBoard.setGtPositionDaqRecord(boardPositionDaqRecord.at(posVec));
0222
0223
0224
0225 gtBoard.setGtPositionEvmRecord(boardPositionEvmRecord.at(posVec));
0226
0227
0228
0229 gtBoard.setGtBitDaqActiveBoards(activeBoardsDaqRecord.at(posVec));
0230
0231
0232
0233 gtBoard.setGtBitEvmActiveBoards(activeBoardsEvmRecord.at(posVec));
0234
0235
0236 int boardSlot = boardSlotMap.at(posVec);
0237 gtBoard.setGtBoardSlot(boardSlot);
0238
0239
0240 gtBoard.setGtBoardHexName(boardHexNameMap.at(posVec));
0241
0242
0243
0244
0245 if (boardType == PSB) {
0246 L1GtPsbQuad psbQuad = Free;
0247 int posCable = 0;
0248 int iPsb = 0;
0249 std::vector<L1GtPsbQuad> quadVec(L1GtBoard::NumberCablesBoard);
0250
0251 for (std::vector<std::string>::const_iterator cIt = cableList.begin(); cIt != cableList.end(); ++cIt) {
0252 if (*cIt == "TechTr") {
0253 psbQuad = TechTr;
0254 } else if (*cIt == "IsoEGQ") {
0255 psbQuad = IsoEGQ;
0256 } else if (*cIt == "NoIsoEGQ") {
0257 psbQuad = NoIsoEGQ;
0258 } else if (*cIt == "CenJetQ") {
0259 psbQuad = CenJetQ;
0260 } else if (*cIt == "ForJetQ") {
0261 psbQuad = ForJetQ;
0262 } else if (*cIt == "TauJetQ") {
0263 psbQuad = TauJetQ;
0264 } else if (*cIt == "ESumsQ") {
0265 psbQuad = ESumsQ;
0266 } else if (*cIt == "JetCountsQ") {
0267 psbQuad = JetCountsQ;
0268 } else if (*cIt == "MQB1") {
0269 psbQuad = MQB1;
0270 } else if (*cIt == "MQB2") {
0271 psbQuad = MQB2;
0272 } else if (*cIt == "MQF3") {
0273 psbQuad = MQF3;
0274 } else if (*cIt == "MQF4") {
0275 psbQuad = MQF4;
0276 } else if (*cIt == "MQB5") {
0277 psbQuad = MQB5;
0278 } else if (*cIt == "MQB6") {
0279 psbQuad = MQB6;
0280 } else if (*cIt == "MQF7") {
0281 psbQuad = MQF7;
0282 } else if (*cIt == "MQF8") {
0283 psbQuad = MQF8;
0284 } else if (*cIt == "MQB9") {
0285 psbQuad = MQB9;
0286 } else if (*cIt == "MQB10") {
0287 psbQuad = MQB10;
0288 } else if (*cIt == "MQF11") {
0289 psbQuad = MQF11;
0290 } else if (*cIt == "MQF12") {
0291 psbQuad = MQF12;
0292 } else if (*cIt == "Free") {
0293 psbQuad = Free;
0294 } else if (*cIt == "HfQ") {
0295 psbQuad = HfQ;
0296 } else {
0297
0298 throw cms::Exception("Configuration")
0299 << "\nError: no such quadruplet: " << (*cIt).c_str() << "\n"
0300 << "\n Can not define the mapping of quadruplets to the L1 PSB boards.\n"
0301 << std::endl;
0302 }
0303
0304 int psbIndex = cableToPsbMap.at(posCable);
0305
0306 if (psbIndex == gtBoard.gtBoardIndex()) {
0307 if (iPsb > L1GtBoard::NumberCablesBoard) {
0308 throw cms::Exception("Configuration")
0309 << "\nError: too many cables for PSB_" << gtBoard.gtBoardIndex() << "\n\n "
0310 << "Can not define the mapping of cables to L1 PSB boards. \n"
0311 << std::endl;
0312 }
0313 quadVec[iPsb] = psbQuad;
0314 iPsb++;
0315 }
0316 posCable++;
0317 }
0318
0319 gtBoard.setGtQuadInPsb(quadVec);
0320 }
0321
0322 if (boardType == PSB) {
0323 std::map<int, std::vector<L1GtObject> > inputPsbChannels;
0324
0325 std::vector<std::string> chStrings;
0326 chStrings.reserve(2);
0327
0328 std::vector<L1GtObject> chObjects;
0329
0330 for (std::vector<edm::ParameterSet>::const_iterator itPSet = psbInput.begin(); itPSet != psbInput.end();
0331 ++itPSet) {
0332
0333 int slot = itPSet->getParameter<int>("Slot");
0334
0335 if (slot == boardSlot) {
0336 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch0");
0337 chObjects = chInputObjects(chStrings);
0338 inputPsbChannels[0] = chObjects;
0339 chStrings.clear();
0340 chObjects.clear();
0341
0342 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch1");
0343 chObjects = chInputObjects(chStrings);
0344 inputPsbChannels[1] = chObjects;
0345 chStrings.clear();
0346 chObjects.clear();
0347
0348 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch2");
0349 chObjects = chInputObjects(chStrings);
0350 inputPsbChannels[2] = chObjects;
0351 chStrings.clear();
0352 chObjects.clear();
0353
0354 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch3");
0355 chObjects = chInputObjects(chStrings);
0356 inputPsbChannels[3] = chObjects;
0357 chStrings.clear();
0358 chObjects.clear();
0359
0360 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch4");
0361 chObjects = chInputObjects(chStrings);
0362 inputPsbChannels[4] = chObjects;
0363 chStrings.clear();
0364 chObjects.clear();
0365
0366 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch5");
0367 chObjects = chInputObjects(chStrings);
0368 inputPsbChannels[5] = chObjects;
0369 chStrings.clear();
0370 chObjects.clear();
0371
0372 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch6");
0373 chObjects = chInputObjects(chStrings);
0374 inputPsbChannels[6] = chObjects;
0375 chStrings.clear();
0376 chObjects.clear();
0377
0378 chStrings = itPSet->getParameter<std::vector<std::string> >("Ch7");
0379 chObjects = chInputObjects(chStrings);
0380 inputPsbChannels[7] = chObjects;
0381 chStrings.clear();
0382 chObjects.clear();
0383 }
0384 }
0385
0386 gtBoard.setGtInputPsbChannels(inputPsbChannels);
0387 }
0388
0389
0390 m_gtBoardMaps.push_back(gtBoard);
0391
0392
0393 posVec++;
0394 }
0395 }
0396
0397
0398 L1GtBoardMapsTrivialProducer::~L1GtBoardMapsTrivialProducer() {
0399
0400 }
0401
0402
0403
0404
0405 std::unique_ptr<L1GtBoardMaps> L1GtBoardMapsTrivialProducer::produceBoardMaps(const L1GtBoardMapsRcd& iRecord) {
0406 auto pL1GtBoardMaps = std::make_unique<L1GtBoardMaps>();
0407
0408 pL1GtBoardMaps->setGtBoardMaps(m_gtBoardMaps);
0409
0410 return pL1GtBoardMaps;
0411 }