File indexing completed on 2024-04-06 12:03:16
0001 #include "CondTools/RPC/interface/RPCEMapSourceHandler.h"
0002 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0003 #include "FWCore/ServiceRegistry/interface/Service.h"
0004 #include "CondCore/CondDB/interface/ConnectionPool.h"
0005 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
0006
0007 popcon::RPCEMapSourceHandler::RPCEMapSourceHandler(const edm::ParameterSet& ps)
0008 : m_name(ps.getUntrackedParameter<std::string>("name", "RPCEMapSourceHandler")),
0009 m_dummy(ps.getUntrackedParameter<int>("WriteDummy", 0)),
0010 m_validate(ps.getUntrackedParameter<int>("Validate", 0)),
0011 m_connect(ps.getUntrackedParameter<std::string>("OnlineConn", "")),
0012 m_authpath(ps.getUntrackedParameter<std::string>("OnlineAuthPath", ".")) {}
0013
0014 popcon::RPCEMapSourceHandler::~RPCEMapSourceHandler() {}
0015
0016 void popcon::RPCEMapSourceHandler::getNewObjects() {
0017
0018
0019 edm::Service<cond::service::PoolDBOutputService> mydbservice;
0020
0021
0022 Ref payload;
0023 if (m_validate == 1 && tagInfo().size > 0) {
0024 std::cout << " Validation was requested, so will check present contents" << std::endl;
0025 std::cout << "Name of tag : " << tagInfo().name << ", tag size : " << tagInfo().size << ", last object valid since "
0026 << tagInfo().lastInterval.since << std::endl;
0027 payload = lastPayload();
0028 }
0029
0030
0031 time_t rawtime;
0032 time(&rawtime);
0033 tm* ptm = gmtime(&rawtime);
0034 char buffer[20];
0035 strftime(buffer, 20, "%d/%m/%Y_%H:%M:%S", ptm);
0036 std::string eMap_version = (std::string)buffer;
0037
0038 eMap = new RPCEMap(eMap_version);
0039 if (m_dummy == 0) {
0040 ConnectOnlineDB(m_connect, m_authpath);
0041 readEMap1();
0042 DisconnectOnlineDB();
0043 }
0044
0045 cond::Time_t snc = mydbservice->currentTime();
0046
0047
0048 int difference = 1;
0049 if (m_validate == 1)
0050 difference = Compare2EMaps(payload, eMap);
0051 if (!difference)
0052 std::cout << "No changes - will not write anything!!!" << std::endl;
0053 if (difference == 1) {
0054 std::cout << "Will write new object to offline DB!!!" << std::endl;
0055 m_to_transfer.push_back(std::make_pair((RPCEMap*)eMap, snc));
0056 }
0057
0058
0059 }
0060
0061 void popcon::RPCEMapSourceHandler::ConnectOnlineDB(std::string connect, std::string authPath) {
0062 cond::persistency::ConnectionPool connection;
0063 std::cout << "RPCEMapConfigSourceHandler: connecting to " << connect << "..." << std::flush;
0064 connection.setAuthenticationPath(authPath);
0065 connection.configure();
0066 session = connection.createSession(connect, true);
0067 std::cout << "Done." << std::endl;
0068 }
0069
0070 void popcon::RPCEMapSourceHandler::DisconnectOnlineDB() { session.close(); }
0071
0072 void popcon::RPCEMapSourceHandler::readEMap1() {
0073 session.transaction().start(true);
0074 coral::ISchema& schema = session.nominalSchema();
0075 std::string condition = "";
0076 coral::AttributeList conditionData;
0077
0078 std::cout << std::endl << "RPCEMapSourceHandler: start to build RPC e-Map..." << std::flush << std::endl << std::endl;
0079
0080
0081 RPCEMap::dccItem thisDcc;
0082 coral::IQuery* query1 = schema.newQuery();
0083 query1->addToTableList("DCCBOARD");
0084 query1->addToOutputList("DCCBOARD.DCCBOARDID", "DCCBOARDID");
0085 query1->addToOutputList("DCCBOARD.FEDNUMBER", "FEDNUMBER");
0086 query1->addToOrderList("FEDNUMBER");
0087 condition = "DCCBOARD.DCCBOARDID>0";
0088 query1->setCondition(condition, conditionData);
0089
0090 coral::ICursor& cursor1 = query1->execute();
0091 std::cout << "OK" << std::endl;
0092 std::pair<int, int> tmp_tbl;
0093 std::vector<std::pair<int, int> > theDAQ;
0094 while (cursor1.next()) {
0095
0096 const coral::AttributeList& row = cursor1.currentRow();
0097 tmp_tbl.first = row["DCCBOARDID"].data<long long>();
0098 tmp_tbl.second = row["FEDNUMBER"].data<long long>();
0099 theDAQ.push_back(tmp_tbl);
0100 }
0101 delete query1;
0102
0103 for (unsigned int iFED = 0; iFED < theDAQ.size(); iFED++) {
0104 thisDcc.theId = theDAQ[iFED].second;
0105 std::vector<std::pair<int, int> > theTB;
0106
0107 RPCEMap::tbItem thisTB;
0108 coral::IQuery* query2 = schema.newQuery();
0109 query2->addToTableList("TRIGGERBOARD");
0110 query2->addToOutputList("TRIGGERBOARD.TRIGGERBOARDID", "TRIGGERBOARDID");
0111 query2->addToOutputList("TRIGGERBOARD.DCCINPUTCHANNELNUM", "DCCCHANNELNUM");
0112 query2->addToOrderList("DCCCHANNELNUM");
0113 condition = "TRIGGERBOARD.DCCBOARD_DCCBOARDID=" + IntToString(theDAQ[iFED].first);
0114 query2->setCondition(condition, conditionData);
0115 coral::ICursor& cursor2 = query2->execute();
0116 int ntbs = 0;
0117 while (cursor2.next()) {
0118 ntbs++;
0119
0120 const coral::AttributeList& row = cursor2.currentRow();
0121 tmp_tbl.first = row["TRIGGERBOARDID"].data<long long>();
0122 tmp_tbl.second = row["DCCCHANNELNUM"].data<long long>();
0123 theTB.push_back(tmp_tbl);
0124 }
0125 delete query2;
0126 for (unsigned int iTB = 0; iTB < theTB.size(); iTB++) {
0127 thisTB.theNum = theTB[iTB].second;
0128 std::vector<std::pair<int, int> > theLink;
0129
0130 RPCEMap::linkItem thisLink;
0131 coral::IQuery* query3 = schema.newQuery();
0132 query3->addToTableList("BOARDBOARDCONN");
0133 query3->addToOutputList("BOARDBOARDCONN.BOARD_BOARDID", "BOARDID");
0134 query3->addToOutputList("BOARDBOARDCONN.COLLECTORBOARDINPUTNUM", "TBINPUTNUM");
0135 query3->addToOrderList("TBINPUTNUM");
0136 condition = "BOARDBOARDCONN.BOARD_COLLECTORBOARDID=" + IntToString(theTB[iTB].first);
0137 query3->setCondition(condition, conditionData);
0138 coral::ICursor& cursor3 = query3->execute();
0139 int nlinks = 0;
0140 while (cursor3.next()) {
0141 nlinks++;
0142 const coral::AttributeList& row = cursor3.currentRow();
0143 tmp_tbl.first = row["BOARDID"].data<long long>();
0144 tmp_tbl.second = row["TBINPUTNUM"].data<long long>();
0145 theLink.push_back(tmp_tbl);
0146 }
0147 delete query3;
0148 for (unsigned int iLink = 0; iLink < theLink.size(); iLink++) {
0149 int boardId = theLink[iLink].first;
0150 thisLink.theTriggerBoardInputNumber = theLink[iLink].second;
0151 std::vector<std::pair<int, std::string> > theLB;
0152 std::pair<int, std::string> tmpLB;
0153
0154 RPCEMap::lbItem thisLB;
0155 coral::IQuery* query4 = schema.newQuery();
0156 query4->addToTableList("BOARD");
0157 query4->addToOutputList("BOARD.NAME", "NAME");
0158 condition = "BOARD.BOARDID=" + IntToString(theLink[iLink].first);
0159 query4->setCondition(condition, conditionData);
0160 coral::ICursor& cursor4 = query4->execute();
0161 int nlbs = 0;
0162 while (cursor4.next()) {
0163 nlbs++;
0164 const coral::AttributeList& row = cursor4.currentRow();
0165 tmpLB.first = theLink[iLink].first;
0166 tmpLB.second = row["NAME"].data<std::string>();
0167 theLB.push_back(tmpLB);
0168 }
0169 delete query4;
0170
0171 coral::IQuery* query5 = schema.newQuery();
0172 query5->addToTableList("LINKBOARD");
0173 query5->addToTableList("BOARD");
0174 query5->addToOutputList("LINKBOARD.LINKBOARDID", "LINKBOARDID");
0175 query5->addToOutputList("BOARD.NAME", "NAME");
0176 query5->addToOrderList("LINKBOARDID");
0177 condition = "LINKBOARD.MASTERID=" + IntToString(theLink[iLink].first) +
0178 " AND BOARD.BOARDID=LINKBOARD.LINKBOARDID AND LINKBOARD.MASTERID<>LINKBOARD.LINKBOARDID";
0179 query5->setCondition(condition, conditionData);
0180 coral::ICursor& cursor5 = query5->execute();
0181 while (cursor5.next()) {
0182 nlbs++;
0183 const coral::AttributeList& row = cursor5.currentRow();
0184 tmpLB.first = row["LINKBOARDID"].data<long long>();
0185 tmpLB.second = row["NAME"].data<std::string>();
0186 theLB.push_back(tmpLB);
0187 }
0188 delete query5;
0189 for (unsigned int iLB = 0; iLB < theLB.size(); iLB++) {
0190 thisLB.theMaster = (theLB[iLB].first == boardId);
0191
0192 std::string theName = theLB[iLB].second;
0193 int slength = theName.length();
0194 thisLB.theLinkBoardNumInLink = atoi((theName.substr(slength - 1, 1)).c_str());
0195 int wheel = atoi((theName.substr(6, 1)).c_str());
0196 std::string char1 = theName.substr(4, 1);
0197 std::string char2 = theName.substr(slength - 7, 1);
0198 int num3 = atoi((theName.substr(slength - 6, 1)).c_str());
0199 std::string char4 = theName.substr(slength - 5, 1);
0200 bool itsS1to9 = (theName.substr(slength - 11, 1) == "S");
0201 int n1 = 10;
0202 int n2 = 1;
0203 int n3 = 0;
0204 if (!itsS1to9) {
0205 n1 = 11;
0206 n2 = 2;
0207 }
0208 int sector = atoi((theName.substr(slength - n1, n2)).c_str());
0209 std::string char1Val[2] = {"B", "E"};
0210 std::string char2Val[3] = {"N", "M", "P"};
0211 std::string char4Val[9] = {"0", "1", "2", "3", "A", "B", "C", "D", "E"};
0212 for (int i = 0; i < 2; i++)
0213 if (char1 == char1Val[i])
0214 n1 = i + 1;
0215 for (int i = 0; i < 3; i++)
0216 if (char2 == char2Val[i])
0217 n2 = i;
0218 for (int i = 0; i < 9; i++)
0219 if (char4 == char4Val[i])
0220 n3 = i;
0221 thisLB.theCode = n3 + num3 * 10 + n2 * 100 + n1 * 1000 + wheel * 10000 + sector * 100000;
0222 std::vector<FEBStruct> theFEB;
0223
0224 coral::IQuery* query6 = schema.newQuery();
0225 query6->addToTableList("FEBLOCATION");
0226 query6->addToTableList("FEBCONNECTOR");
0227 query6->addToOutputList("FEBLOCATION.FEBLOCATIONID", "FEBLOCATIONID");
0228 query6->addToOutputList("FEBLOCATION.CL_CHAMBERLOCATIONID", "CHAMBERLOCATIONID");
0229 query6->addToOutputList("FEBCONNECTOR.FEBCONNECTORID", "FEBCONNECTORID");
0230 query6->addToOutputList("FEBLOCATION.FEBLOCALETAPARTITION", "LOCALETAPART");
0231 query6->addToOutputList("FEBLOCATION.POSINLOCALETAPARTITION", "POSINLOCALETAPART");
0232 query6->addToOutputList("FEBLOCATION.FEBCMSETAPARTITION", "CMSETAPART");
0233 query6->addToOutputList("FEBLOCATION.POSINCMSETAPARTITION", "POSINCMSETAPART");
0234 query6->addToOutputList("FEBCONNECTOR.LINKBOARDINPUTNUM", "LINKBOARDINPUTNUM");
0235 query6->addToOrderList("FEBLOCATIONID");
0236 query6->addToOrderList("FEBCONNECTORID");
0237 condition = "FEBLOCATION.LB_LINKBOARDID=" + IntToString(theLB[iLB].first) +
0238 " AND FEBLOCATION.FEBLOCATIONID=FEBCONNECTOR.FL_FEBLOCATIONID";
0239 query6->setCondition(condition, conditionData);
0240 coral::ICursor& cursor6 = query6->execute();
0241 int nfebs = 0;
0242 while (cursor6.next()) {
0243 FEBStruct tmpFEB;
0244 nfebs++;
0245 const coral::AttributeList& row = cursor6.currentRow();
0246 tmpFEB.febId = row["FEBLOCATIONID"].data<long long>();
0247 tmpFEB.chamberId = row["CHAMBERLOCATIONID"].data<long long>();
0248 tmpFEB.connectorId = row["FEBCONNECTORID"].data<long long>();
0249 tmpFEB.localEtaPart = row["LOCALETAPART"].data<std::string>();
0250 tmpFEB.posInLocalEtaPart = row["POSINLOCALETAPART"].data<short>();
0251 tmpFEB.cmsEtaPart = row["CMSETAPART"].data<std::string>();
0252 tmpFEB.posInCmsEtaPart = row["POSINCMSETAPART"].data<short>();
0253 tmpFEB.lbInputNum = row["LINKBOARDINPUTNUM"].data<short>();
0254 theFEB.push_back(tmpFEB);
0255 }
0256 delete query6;
0257 for (unsigned int iFEB = 0; iFEB < theFEB.size(); iFEB++) {
0258 RPCEMap::febItem thisFeb;
0259 std::string temp = theFEB[iFEB].localEtaPart;
0260 std::string localEtaVal[6] = {"Forward", "Central", "Backward", "A", "B", "C"};
0261 char localEtaPartition = 0;
0262 for (int i = 0; i < 6; i++)
0263 if (temp == localEtaVal[i])
0264 localEtaPartition = i + 1;
0265 char positionInLocalEtaPartition = theFEB[iFEB].posInLocalEtaPart;
0266 temp = theFEB[iFEB].cmsEtaPart;
0267 std::string cmsEtaVal[6] = {"1", "2", "3", "A", "B", "C"};
0268 char cmsEtaPartition = 0;
0269 for (int i = 0; i < 6; i++)
0270 if (temp == cmsEtaVal[i])
0271 cmsEtaPartition = i + 1;
0272 char positionInCmsEtaPartition = theFEB[iFEB].posInCmsEtaPart;
0273 thisFeb.thePartition = positionInLocalEtaPartition + 10 * localEtaPartition +
0274 100 * positionInCmsEtaPartition + 1000 * cmsEtaPartition;
0275 thisFeb.theLinkBoardInputNum = theFEB[iFEB].lbInputNum;
0276
0277 coral::IQuery* query7 = schema.newQuery();
0278 query7->addToTableList("CHAMBERLOCATION");
0279 query7->addToOutputList("CHAMBERLOCATION.DISKORWHEEL", "DISKORWHEEL");
0280 query7->addToOutputList("CHAMBERLOCATION.LAYER", "LAYER");
0281 query7->addToOutputList("CHAMBERLOCATION.SECTOR", "SECTOR");
0282 query7->addToOutputList("CHAMBERLOCATION.SUBSECTOR", "SUBSECTOR");
0283 query7->addToOutputList("CHAMBERLOCATION.CHAMBERLOCATIONNAME", "NAME");
0284 query7->addToOutputList("CHAMBERLOCATION.FEBZORNT", "FEBZORNT");
0285 query7->addToOutputList("CHAMBERLOCATION.FEBRADORNT", "FEBRADORNT");
0286 query7->addToOutputList("CHAMBERLOCATION.BARRELORENDCAP", "BARRELORENDCAP");
0287 condition = "CHAMBERLOCATION.CHAMBERLOCATIONID=" + IntToString(theFEB[iFEB].chamberId);
0288 query7->setCondition(condition, conditionData);
0289 coral::ICursor& cursor7 = query7->execute();
0290 thisFeb.theChamber = -1;
0291 while (cursor7.next()) {
0292 const coral::AttributeList& row = cursor7.currentRow();
0293 char diskOrWheel = row["DISKORWHEEL"].data<short>() + 3;
0294 char layer = row["LAYER"].data<short>();
0295 int sector = row["SECTOR"].data<short>();
0296 temp = row["SUBSECTOR"].data<std::string>();
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306 std::string subsVal[5] = {"--", "-", "", "+", "++"};
0307 char subsector = 0;
0308 for (int i = 0; i < 5; i++)
0309 if (temp == subsVal[i])
0310 subsector = i;
0311 temp = row["FEBZORNT"].data<std::string>();
0312 char febZOrnt = 0;
0313 if (temp == "+z")
0314 febZOrnt = 1;
0315 temp = row["FEBRADORNT"].data<std::string>();
0316 char febZRadOrnt = 0;
0317 std::string febZRVal[3] = {"", "IN", "OUT"};
0318 for (int i = 0; i < 3; i++)
0319 if (temp == febZRVal[i])
0320 febZRadOrnt = i;
0321 temp = row["BARRELORENDCAP"].data<std::string>();
0322 char barrelOrEndcap = 0;
0323 if (temp == "Barrel")
0324 barrelOrEndcap = 1;
0325 thisFeb.theChamber = sector + 100 * subsector + 1000 * febZRadOrnt + 5000 * febZOrnt +
0326 10000 * diskOrWheel + 100000 * layer + 1000000 * barrelOrEndcap;
0327 }
0328 delete query7;
0329
0330 coral::IQuery* query8 = schema.newQuery();
0331 query8->addToTableList("CHAMBERSTRIP");
0332 query8->addToOutputList("CHAMBERSTRIP.CABLECHANNELNUM", "CABLECHANNELNUM");
0333 query8->addToOutputList("CHAMBERSTRIP.CHAMBERSTRIPNUMBER", "CHAMBERSTRIPNUM");
0334
0335 query8->addToOrderList("CABLECHANNELNUM");
0336 condition = "CHAMBERSTRIP.FC_FEBCONNECTORID=" + IntToString(theFEB[iFEB].connectorId);
0337 query8->setCondition(condition, conditionData);
0338 coral::ICursor& cursor8 = query8->execute();
0339
0340
0341 int nstrips = 0;
0342 int firstChamberStrip = 0;
0343 int firstPin = 0;
0344 int lastChamberStrip = 0;
0345 int lastPin = 0;
0346 while (cursor8.next()) {
0347 const coral::AttributeList& row = cursor8.currentRow();
0348 lastChamberStrip = row["CHAMBERSTRIPNUM"].data<int>();
0349 lastPin = row["CABLECHANNELNUM"].data<short>();
0350 if (nstrips == 0) {
0351 firstChamberStrip = lastChamberStrip;
0352 firstPin = lastPin;
0353 }
0354 nstrips++;
0355 }
0356 delete query8;
0357 int algo = -1;
0358 if (firstPin == 1 && lastPin == nstrips) {
0359 algo = 1;
0360 } else if (firstPin == 2 && lastPin == nstrips + 1) {
0361 algo = 2;
0362 } else if (firstPin == 3 && lastPin == nstrips + 2) {
0363 algo = 3;
0364 } else if (firstPin == 2 && lastPin == nstrips + 2) {
0365 algo = 0;
0366 } else {
0367 std::cout << " Unknown algo : " << firstPin << " " << lastPin << std::endl;
0368 }
0369 if ((lastPin - firstPin) * (lastChamberStrip - firstChamberStrip) < 0)
0370 algo = algo + 4;
0371 thisFeb.theAlgo = algo + 100 * firstChamberStrip + 10000 * nstrips;
0372 eMap->theFebs.push_back(thisFeb);
0373 }
0374 thisLB.nFebs = nfebs;
0375 eMap->theLBs.push_back(thisLB);
0376 }
0377 thisLink.nLBs = nlbs;
0378 eMap->theLinks.push_back(thisLink);
0379 }
0380 thisTB.nLinks = nlinks;
0381 eMap->theTBs.push_back(thisTB);
0382 }
0383 thisDcc.nTBs = ntbs;
0384 std::cout << "DCC added" << std::endl;
0385 eMap->theDccs.push_back(thisDcc);
0386 }
0387 std::cout << std::endl << "Building RPC e-Map done!" << std::flush << std::endl << std::endl;
0388 }
0389
0390 int popcon::RPCEMapSourceHandler::Compare2EMaps(const Ref& _map1, RPCEMap* map2) {
0391 const Ref& map1 = _map1;
0392 RPCReadOutMapping const* oldmap1 = map1->convert();
0393 RPCReadOutMapping const* oldmap2 = map2->convert();
0394 std::vector<const DccSpec*> dccs1 = oldmap1->dccList();
0395 std::vector<const DccSpec*> dccs2 = oldmap2->dccList();
0396 if (dccs1.size() != dccs2.size()) {
0397 return 1;
0398 }
0399 std::pair<int, int> dccRange1 = oldmap1->dccNumberRange();
0400 std::pair<int, int> dccRange2 = oldmap2->dccNumberRange();
0401 if (dccRange1.first != dccRange2.first) {
0402 return 1;
0403 }
0404 if (dccRange1.second != dccRange2.second) {
0405 return 1;
0406 }
0407 typedef std::vector<const DccSpec*>::const_iterator IDCC;
0408 IDCC idcc2 = dccs2.begin();
0409 for (IDCC idcc1 = dccs1.begin(); idcc1 != dccs1.end(); idcc1++) {
0410 int dccNo = (**idcc1).id();
0411 std::string dccContents = (**idcc1).print(4);
0412 if ((**idcc2).id() != dccNo) {
0413 return 1;
0414 }
0415 if ((**idcc2).print(4) != dccContents) {
0416 return 1;
0417 }
0418 idcc2++;
0419 }
0420 return 0;
0421 }