File indexing completed on 2023-03-17 10:44:29
0001 #include "FWCore/Framework/interface/EventSetup.h"
0002 #include "CalibTracker/SiStripESProducers/plugins/DBWriter/SiStripFedCablingManipulator.h"
0003 #include <fstream>
0004 #include <iostream>
0005
0006 SiStripFedCablingManipulator::SiStripFedCablingManipulator(const edm::ParameterSet& iConfig)
0007 : iConfig_(iConfig), fedCablingToken_(esConsumes<edm::Transition::EndRun>()) {
0008 edm::LogInfo("SiStripFedCablingManipulator") << "SiStripFedCablingManipulator constructor " << std::endl;
0009 }
0010
0011 SiStripFedCablingManipulator::~SiStripFedCablingManipulator() {
0012 edm::LogInfo("SiStripFedCablingManipulator")
0013 << "SiStripFedCablingManipulator::~SiStripFedCablingManipulator()" << std::endl;
0014 }
0015
0016 void SiStripFedCablingManipulator::endRun(const edm::Run& run, const edm::EventSetup& es) {
0017 const auto& esobj = es.getData(fedCablingToken_);
0018
0019 auto obj = manipulate(esobj);
0020
0021 cond::Time_t Time_ = 0;
0022
0023
0024 edm::Service<cond::service::PoolDBOutputService> dbservice;
0025 if (dbservice.isAvailable()) {
0026 if (!obj) {
0027 edm::LogError("SiStripFedCablingManipulator") << "null pointer obj. nothing will be written " << std::endl;
0028 return;
0029 }
0030
0031 std::string openIovAt = iConfig_.getUntrackedParameter<std::string>("OpenIovAt", "beginOfTime");
0032 if (openIovAt == "beginOfTime")
0033 Time_ = dbservice->beginOfTime();
0034 else if (openIovAt == "currentTime")
0035 dbservice->currentTime();
0036 else
0037 Time_ = iConfig_.getUntrackedParameter<uint32_t>("OpenIovAtTime", 1);
0038
0039
0040 if (dbservice->isNewTagRequest("SiStripFedCablingRcd")) {
0041 edm::LogInfo("SiStripFedCablingManipulator") << "first request for storing objects with Record "
0042 << "SiStripFedCablingRcd"
0043 << " at time " << Time_ << std::endl;
0044 dbservice->createOneIOV<SiStripFedCabling>(*obj, Time_, "SiStripFedCablingRcd");
0045 } else {
0046 edm::LogInfo("SiStripFedCablingManipulator") << "appending a new object to existing tag "
0047 << "SiStripFedCablingRcd"
0048 << " in since mode " << std::endl;
0049 dbservice->appendOneIOV<SiStripFedCabling>(*obj, Time_, "SiStripFedCablingRcd");
0050 }
0051 } else {
0052 edm::LogError("SiStripFedCablingManipulator") << "Service is unavailable" << std::endl;
0053 }
0054 }
0055
0056 std::unique_ptr<SiStripFedCabling> SiStripFedCablingManipulator::manipulate(const SiStripFedCabling& iobj) {
0057 std::string fp = iConfig_.getParameter<std::string>("file");
0058 std::unique_ptr<SiStripFedCabling> oobj;
0059
0060 std::ifstream inputFile_;
0061 inputFile_.open(fp.c_str());
0062
0063 std::map<uint32_t, std::pair<uint32_t, uint32_t> > dcuDetIdMap;
0064 uint32_t dcuid, Olddetid, Newdetid;
0065
0066
0067 if (fp.empty()) {
0068 edm::LogInfo("SiStripFedCablingManipulator")
0069 << "::manipulate : since no file is specified, the copy of the input cabling will be applied" << std::endl;
0070 oobj = std::make_unique<SiStripFedCabling>(iobj);
0071 } else if (!inputFile_.is_open()) {
0072 edm::LogError("SiStripFedCablingManipulator") << "::manipulate - ERROR in opening file " << fp << std::endl;
0073 throw cms::Exception("CorruptedData") << "::manipulate - ERROR in opening file " << fp << std::endl;
0074 } else {
0075 for (;;) {
0076 inputFile_ >> dcuid >> Olddetid >> Newdetid;
0077
0078 if (!(inputFile_.eof() || inputFile_.fail())) {
0079 if (dcuDetIdMap.find(dcuid) == dcuDetIdMap.end()) {
0080 edm::LogInfo("SiStripFedCablingManipulator") << dcuid << " " << Olddetid << " " << Newdetid << std::endl;
0081
0082 dcuDetIdMap[dcuid] = std::pair<uint32_t, uint32_t>(Olddetid, Newdetid);
0083 } else {
0084 edm::LogError("SiStripFedCablingManipulator")
0085 << "::manipulate - ERROR duplicated dcuid " << dcuid << std::endl;
0086 throw cms::Exception("CorruptedData")
0087 << "SiStripFedCablingManipulator::manipulate - ERROR duplicated dcuid " << dcuid;
0088 break;
0089 }
0090 } else if (inputFile_.eof()) {
0091 edm::LogInfo("SiStripFedCablingManipulator") << "::manipulate - END of file reached" << std::endl;
0092 break;
0093 } else if (inputFile_.fail()) {
0094 edm::LogError("SiStripFedCablingManipulator") << "::manipulate - ERROR while reading file" << std::endl;
0095 break;
0096 }
0097 }
0098 inputFile_.close();
0099 std::map<uint32_t, std::pair<uint32_t, uint32_t> >::const_iterator it = dcuDetIdMap.begin();
0100 for (; it != dcuDetIdMap.end(); ++it)
0101 edm::LogInfo("SiStripFedCablingManipulator")
0102 << "::manipulate - Map " << it->first << " " << it->second.first << " " << it->second.second;
0103
0104 std::vector<FedChannelConnection> conns;
0105
0106 auto feds = iobj.fedIds();
0107 for (auto ifeds = feds.begin(); ifeds != feds.end(); ifeds++) {
0108 auto conns_per_fed = iobj.fedConnections(*ifeds);
0109 for (auto iconn = conns_per_fed.begin(); iconn != conns_per_fed.end(); ++iconn) {
0110 std::map<uint32_t, std::pair<uint32_t, uint32_t> >::const_iterator it = dcuDetIdMap.find(iconn->dcuId());
0111 if (it != dcuDetIdMap.end() && it->second.first == iconn->detId()) {
0112 edm::LogInfo("SiStripFedCablingManipulator")
0113 << "::manipulate - fedid " << *ifeds << " dcuid " << iconn->dcuId() << " oldDet " << iconn->detId()
0114 << " newDetID " << it->second.second;
0115 conns.push_back(FedChannelConnection(iconn->fecCrate(),
0116 iconn->fecSlot(),
0117 iconn->fecRing(),
0118 iconn->ccuAddr(),
0119 iconn->ccuChan(),
0120 iconn->i2cAddr(0),
0121 iconn->i2cAddr(1),
0122 iconn->dcuId(),
0123 it->second.second,
0124 iconn->nApvPairs(),
0125 iconn->fedId(),
0126 iconn->fedCh(),
0127 iconn->fiberLength(),
0128 iconn->dcu(),
0129 iconn->pll(),
0130 iconn->mux(),
0131 iconn->lld()));
0132 } else {
0133 conns.push_back(FedChannelConnection(iconn->fecCrate(),
0134 iconn->fecSlot(),
0135 iconn->fecRing(),
0136 iconn->ccuAddr(),
0137 iconn->ccuChan(),
0138 iconn->i2cAddr(0),
0139 iconn->i2cAddr(1),
0140 iconn->dcuId(),
0141 iconn->detId(),
0142 iconn->nApvPairs(),
0143 iconn->fedId(),
0144 iconn->fedCh(),
0145 iconn->fiberLength(),
0146 iconn->dcu(),
0147 iconn->pll(),
0148 iconn->mux(),
0149 iconn->lld()));
0150 }
0151 }
0152 }
0153
0154 oobj = std::make_unique<SiStripFedCabling>(conns);
0155 }
0156 return oobj;
0157 }