File indexing completed on 2024-04-06 12:03:16
0001 #include "CondTools/RPC/interface/RPCLBLinkMapHandler.h"
0002
0003 #include <cstdint>
0004 #include <fstream>
0005 #include <memory>
0006 #include <sstream>
0007
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/Utilities/interface/Exception.h"
0011
0012 #include "CondCore/CondDB/interface/Types.h"
0013
0014 #include "RelationalAccess/ICursor.h"
0015 #include "RelationalAccess/IQuery.h"
0016 #include "RelationalAccess/IQueryDefinition.h"
0017 #include "RelationalAccess/ISchema.h"
0018 #include "RelationalAccess/ISessionProxy.h"
0019 #include "RelationalAccess/ITransaction.h"
0020
0021 #include "CoralBase/Attribute.h"
0022 #include "CoralBase/AttributeList.h"
0023
0024 #include "CondTools/RPC/interface/RPCLBLinkNameParser.h"
0025
0026 RPCDetId RPCLBLinkMapHandler::getRPCDetId(
0027 int region, int disk_or_wheel, int layer, int sector, std::string subsector_string, std::string partition) {
0028 int station(0), ring(0), subsector(0), roll(0);
0029
0030 if (!region) {
0031 switch (layer) {
0032 case 1:
0033 case 2:
0034 station = 1;
0035 break;
0036 case 3:
0037 case 4:
0038 station = 2;
0039 layer -= 2;
0040 break;
0041 case 5:
0042 station = 3;
0043 layer = 1;
0044 break;
0045 case 6:
0046 station = 4;
0047 layer = 1;
0048 break;
0049 }
0050 ring = disk_or_wheel;
0051
0052 subsector = 1;
0053 if (subsector_string == "+" && (station == 3 || (station == 4 && (sector != 4 && sector != 9 && sector != 11))))
0054 subsector = 2;
0055 if (station == 4 && sector == 4) {
0056 if (subsector_string == "-")
0057 subsector = 2;
0058 else if (subsector_string == "+")
0059 subsector = 3;
0060 else if (subsector_string == "++")
0061 subsector = 4;
0062 }
0063 } else {
0064 station = std::abs(disk_or_wheel);
0065 ring = layer;
0066 layer = 1;
0067 if (ring > 1 || station == 1) {
0068 subsector = (sector - 1) % 6 + 1;
0069 sector = (sector - 1) / 6 + 1;
0070 } else {
0071 subsector = (sector - 1) % 3 + 1;
0072 sector = (sector - 1) / 3 + 1;
0073 }
0074 }
0075
0076 if (partition == "Backward" || partition == "A")
0077 roll = 1;
0078 else if (partition == "Central" || partition == "B")
0079 roll = 2;
0080 else if (partition == "Forward" || partition == "C")
0081 roll = 3;
0082 else if (partition == "D")
0083 roll = 4;
0084 else
0085 throw cms::Exception("RPCLBLinkMapHandler") << "Unexpected partition name " << partition;
0086
0087 return RPCDetId(region, ring, station, sector, layer, subsector, roll);
0088 }
0089
0090 RPCLBLinkMapHandler::RPCLBLinkMapHandler(edm::ParameterSet const& config)
0091 : id_(config.getParameter<std::string>("identifier")),
0092 data_tag_(config.getParameter<std::string>("dataTag")),
0093 since_run_(config.getParameter<unsigned long long>("sinceRun")),
0094 txt_file_(config.getUntrackedParameter<std::string>("txtFile", "")),
0095 connect_(config.getParameter<std::string>("connect")) {
0096 edm::LogInfo("RPCDCCLinkMapHandler") << "Configuring Input Connection";
0097 connection_.setParameters(config.getParameter<edm::ParameterSet>("DBParameters"));
0098 connection_.configure();
0099 }
0100
0101 RPCLBLinkMapHandler::~RPCLBLinkMapHandler() {}
0102
0103 void RPCLBLinkMapHandler::getNewObjects() {
0104 edm::LogInfo("RPCLBLinkMapHandler") << "getNewObjects";
0105 cond::TagInfo_t const& tag_info = tagInfo();
0106 if (since_run_ < tag_info.lastInterval.since)
0107 throw cms::Exception("RPCLBLinkMapHandler") << "Refuse to create RPCLBLinkMap for run " << since_run_
0108 << ", older than most recent tag" << tag_info.lastInterval.since;
0109
0110 edm::LogInfo("RPCDCCLinkMapHandler") << "Opening read-only Input Session";
0111 auto input_session = connection_.createCoralSession(connect_, false);
0112 edm::LogInfo("RPCDCCLinkMapHandler") << "Started Input Transaction";
0113 input_session->transaction().start(true);
0114
0115 std::unique_ptr<coral::IQuery> query(input_session->schema("CMS_RPC_CONF").newQuery());
0116 query->addToTableList("BOARD");
0117 query->addToTableList("CHAMBERSTRIP");
0118 query->addToTableList("CHAMBERLOCATION");
0119 query->addToTableList("FEBLOCATION");
0120 query->addToTableList("FEBCONNECTOR");
0121 coral::IQueryDefinition& subquery_min_channel(query->defineSubQuery("MIN_CHANNEL"));
0122 query->addToTableList("MIN_CHANNEL");
0123 coral::IQueryDefinition& subquery_max_strip(query->defineSubQuery("MAX_STRIP"));
0124 query->addToTableList("MAX_STRIP");
0125
0126 query->addToOutputList("BOARD.NAME", "LB_NAME");
0127 query->addToOutputList("FEBCONNECTOR.LINKBOARDINPUTNUM", "CONNECTOR");
0128 query->addToOutputList("CHAMBERSTRIP.CHAMBERSTRIPNUMBER", "FIRST_STRIP");
0129 query->addToOutputList("CAST(DECODE(SIGN(MAX_STRIP.STRIP - CHAMBERSTRIP.CHAMBERSTRIPNUMBER), 1, 1, -1) AS INTEGER)",
0130 "SLOPE");
0131 query->addToOutputList("MIN_CHANNEL.CHANNELS", "CHANNELS");
0132 query->addToOutputList(
0133 "CAST(DECODE(CHAMBERLOCATION.BARRELORENDCAP, 'Barrel', 0, DECODE(SIGN(CHAMBERLOCATION.DISKORWHEEL), 1, 1, -1)) "
0134 "AS INTEGER)",
0135 "REGION");
0136 query->addToOutputList("CHAMBERLOCATION.DISKORWHEEL", "DISKORWHEEL");
0137 query->addToOutputList("CHAMBERLOCATION.LAYER", "LAYER");
0138 query->addToOutputList("CHAMBERLOCATION.SECTOR", "SECTOR");
0139 query->addToOutputList("CHAMBERLOCATION.SUBSECTOR", "SUBSECTOR");
0140 query->addToOutputList("FEBLOCATION.FEBLOCALETAPARTITION", "ETAPARTITION");
0141
0142 subquery_min_channel.addToTableList("CHAMBERSTRIP");
0143 subquery_min_channel.addToOutputList("FC_FEBCONNECTORID");
0144 subquery_min_channel.addToOutputList("MIN(CABLECHANNELNUM)", "CHANNEL");
0145 subquery_min_channel.addToOutputList("CAST(SUM(POWER(2, CABLECHANNELNUM-1)) AS INTEGER)", "CHANNELS");
0146 subquery_min_channel.groupBy("FC_FEBCONNECTORID");
0147 coral::AttributeList subquery_min_channel_condition_data;
0148 subquery_min_channel.setCondition("CABLECHANNELNUM IS NOT NULL", subquery_min_channel_condition_data);
0149
0150 subquery_max_strip.addToTableList("CHAMBERSTRIP");
0151 coral::IQueryDefinition& subquery_max_channel(subquery_max_strip.defineSubQuery("MAX_CHANNEL"));
0152 subquery_max_strip.addToTableList("MAX_CHANNEL");
0153 subquery_max_strip.addToOutputList("CHAMBERSTRIP.FC_FEBCONNECTORID", "FC_FEBCONNECTORID");
0154 subquery_max_strip.addToOutputList("CHAMBERSTRIP.CHAMBERSTRIPNUMBER", "STRIP");
0155 coral::AttributeList subquery_max_strip_condition_data;
0156 subquery_max_strip.setCondition(
0157 "CHAMBERSTRIP.FC_FEBCONNECTORID=MAX_CHANNEL.FC_FEBCONNECTORID"
0158 " AND CHAMBERSTRIP.CABLECHANNELNUM=MAX_CHANNEL.CHANNEL",
0159 subquery_max_strip_condition_data);
0160
0161 subquery_max_channel.addToTableList("CHAMBERSTRIP");
0162 subquery_max_channel.addToOutputList("FC_FEBCONNECTORID");
0163 subquery_max_channel.addToOutputList("MAX(CABLECHANNELNUM)", "CHANNEL");
0164 subquery_max_channel.groupBy("FC_FEBCONNECTORID");
0165 coral::AttributeList subquery_max_channel_condition_data;
0166 subquery_max_channel.setCondition("CABLECHANNELNUM IS NOT NULL", subquery_max_channel_condition_data);
0167
0168 coral::AttributeList query_condition_data;
0169 query->setCondition(
0170 "CHAMBERSTRIP.FC_FEBCONNECTORID=MIN_CHANNEL.FC_FEBCONNECTORID"
0171 " AND CHAMBERSTRIP.CABLECHANNELNUM=MIN_CHANNEL.CHANNEL"
0172 " AND CHAMBERSTRIP.FC_FEBCONNECTORID=MAX_STRIP.FC_FEBCONNECTORID"
0173 " AND CHAMBERSTRIP.FC_FEBCONNECTORID=FEBCONNECTOR.FEBCONNECTORID"
0174 " AND FEBCONNECTOR.FL_FEBLOCATIONID=FEBLOCATION.FEBLOCATIONID"
0175 " AND BOARD.BOARDID=FEBLOCATION.LB_LINKBOARDID"
0176 " AND CHAMBERLOCATION.CHAMBERLOCATIONID=FEBLOCATION.CL_CHAMBERLOCATIONID",
0177 query_condition_data);
0178
0179 std::string lb_name("");
0180 int first_strip(0), slope(1);
0181 std::uint16_t channels(0x0);
0182
0183 std::unique_ptr<RPCLBLinkMap> lb_link_map_object(new RPCLBLinkMap());
0184 RPCLBLinkMap::map_type& lb_link_map = lb_link_map_object->getMap();
0185 RPCLBLink lb_link;
0186 RPCDetId det_id;
0187 std::string subsector;
0188
0189 edm::LogInfo("RPCLBLinkMapHandler") << "Execute query";
0190 coral::ICursor& cursor(query->execute());
0191 while (cursor.next()) {
0192 coral::AttributeList const& row(cursor.currentRow());
0193
0194
0195 lb_name = row["LB_NAME"].data<std::string>();
0196 RPCLBLinkNameParser::parse(lb_name, lb_link);
0197 if (lb_name != lb_link.getName())
0198 edm::LogWarning("RPCLBLinkMapHandler") << "Mismatch LinkBoard Name: " << lb_name << " vs " << lb_link;
0199 lb_link.setConnector(row["CONNECTOR"].data<short>() - 1);
0200
0201
0202 if (row["SUBSECTOR"].isNull())
0203 subsector = "";
0204 else
0205 subsector = row["SUBSECTOR"].data<std::string>();
0206 det_id = getRPCDetId(row["REGION"].data<long long>(),
0207 row["DISKORWHEEL"].data<short>(),
0208 row["LAYER"].data<short>(),
0209 row["SECTOR"].data<short>(),
0210 subsector,
0211 row["ETAPARTITION"].data<std::string>());
0212
0213
0214 first_strip = row["FIRST_STRIP"].data<int>();
0215 slope = row["SLOPE"].data<long long>();
0216 channels = (std::uint16_t)(row["CHANNELS"].data<long long>());
0217
0218 lb_link_map.insert(
0219 std::pair<RPCLBLink, RPCFebConnector>(lb_link, RPCFebConnector(det_id, first_strip, slope, channels)));
0220 }
0221 cursor.close();
0222
0223 input_session->transaction().commit();
0224
0225 if (!txt_file_.empty()) {
0226 edm::LogInfo("RPCLBLinkMapHandler") << "Fill txtFile";
0227 std::ofstream ofstream(txt_file_);
0228 for (auto const& link_connector : lb_link_map) {
0229 ofstream << link_connector.first << ": " << link_connector.second << std::endl;
0230 }
0231 }
0232
0233 edm::LogInfo("RPCLBLinkMapHandler") << "Add to transfer list";
0234 m_to_transfer.push_back(std::make_pair(lb_link_map_object.release(), since_run_));
0235 }
0236
0237 std::string RPCLBLinkMapHandler::id() const { return id_; }