1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#include "FWCore/Framework/interface/EventSetup.h"
#include "CalibTracker/SiStripESProducers/plugins/DBWriter/SiStripFedCablingManipulator.h"
#include <fstream>
#include <iostream>
SiStripFedCablingManipulator::SiStripFedCablingManipulator(const edm::ParameterSet& iConfig)
: iConfig_(iConfig), fedCablingToken_(esConsumes<edm::Transition::EndRun>()) {
edm::LogInfo("SiStripFedCablingManipulator") << "SiStripFedCablingManipulator constructor " << std::endl;
}
SiStripFedCablingManipulator::~SiStripFedCablingManipulator() {
edm::LogInfo("SiStripFedCablingManipulator")
<< "SiStripFedCablingManipulator::~SiStripFedCablingManipulator()" << std::endl;
}
void SiStripFedCablingManipulator::endRun(const edm::Run& run, const edm::EventSetup& es) {
const auto& esobj = es.getData(fedCablingToken_);
auto obj = manipulate(esobj);
cond::Time_t Time_ = 0;
//And now write data in DB
edm::Service<cond::service::PoolDBOutputService> dbservice;
if (dbservice.isAvailable()) {
if (!obj) {
edm::LogError("SiStripFedCablingManipulator") << "null pointer obj. nothing will be written " << std::endl;
return;
}
std::string openIovAt = iConfig_.getUntrackedParameter<std::string>("OpenIovAt", "beginOfTime");
if (openIovAt == "beginOfTime")
Time_ = dbservice->beginOfTime();
else if (openIovAt == "currentTime")
dbservice->currentTime();
else
Time_ = iConfig_.getUntrackedParameter<uint32_t>("OpenIovAtTime", 1);
//if first time tag is populated
if (dbservice->isNewTagRequest("SiStripFedCablingRcd")) {
edm::LogInfo("SiStripFedCablingManipulator") << "first request for storing objects with Record "
<< "SiStripFedCablingRcd"
<< " at time " << Time_ << std::endl;
dbservice->createOneIOV<SiStripFedCabling>(*obj, Time_, "SiStripFedCablingRcd");
} else {
edm::LogInfo("SiStripFedCablingManipulator") << "appending a new object to existing tag "
<< "SiStripFedCablingRcd"
<< " in since mode " << std::endl;
dbservice->appendOneIOV<SiStripFedCabling>(*obj, Time_, "SiStripFedCablingRcd");
}
} else {
edm::LogError("SiStripFedCablingManipulator") << "Service is unavailable" << std::endl;
}
}
std::unique_ptr<SiStripFedCabling> SiStripFedCablingManipulator::manipulate(const SiStripFedCabling& iobj) {
std::string fp = iConfig_.getParameter<std::string>("file");
std::unique_ptr<SiStripFedCabling> oobj;
std::ifstream inputFile_;
inputFile_.open(fp.c_str());
std::map<uint32_t, std::pair<uint32_t, uint32_t> > dcuDetIdMap;
uint32_t dcuid, Olddetid, Newdetid;
// if(fp.c_str()==""){
if (fp.empty()) {
edm::LogInfo("SiStripFedCablingManipulator")
<< "::manipulate : since no file is specified, the copy of the input cabling will be applied" << std::endl;
oobj = std::make_unique<SiStripFedCabling>(iobj);
} else if (!inputFile_.is_open()) {
edm::LogError("SiStripFedCablingManipulator") << "::manipulate - ERROR in opening file " << fp << std::endl;
throw cms::Exception("CorruptedData") << "::manipulate - ERROR in opening file " << fp << std::endl;
} else {
for (;;) {
inputFile_ >> dcuid >> Olddetid >> Newdetid;
if (!(inputFile_.eof() || inputFile_.fail())) {
if (dcuDetIdMap.find(dcuid) == dcuDetIdMap.end()) {
edm::LogInfo("SiStripFedCablingManipulator") << dcuid << " " << Olddetid << " " << Newdetid << std::endl;
dcuDetIdMap[dcuid] = std::pair<uint32_t, uint32_t>(Olddetid, Newdetid);
} else {
edm::LogError("SiStripFedCablingManipulator")
<< "::manipulate - ERROR duplicated dcuid " << dcuid << std::endl;
throw cms::Exception("CorruptedData")
<< "SiStripFedCablingManipulator::manipulate - ERROR duplicated dcuid " << dcuid;
break;
}
} else if (inputFile_.eof()) {
edm::LogInfo("SiStripFedCablingManipulator") << "::manipulate - END of file reached" << std::endl;
break;
} else if (inputFile_.fail()) {
edm::LogError("SiStripFedCablingManipulator") << "::manipulate - ERROR while reading file" << std::endl;
break;
}
}
inputFile_.close();
std::map<uint32_t, std::pair<uint32_t, uint32_t> >::const_iterator it = dcuDetIdMap.begin();
for (; it != dcuDetIdMap.end(); ++it)
edm::LogInfo("SiStripFedCablingManipulator")
<< "::manipulate - Map " << it->first << " " << it->second.first << " " << it->second.second;
std::vector<FedChannelConnection> conns;
auto feds = iobj.fedIds();
for (auto ifeds = feds.begin(); ifeds != feds.end(); ifeds++) {
auto conns_per_fed = iobj.fedConnections(*ifeds);
for (auto iconn = conns_per_fed.begin(); iconn != conns_per_fed.end(); ++iconn) {
std::map<uint32_t, std::pair<uint32_t, uint32_t> >::const_iterator it = dcuDetIdMap.find(iconn->dcuId());
if (it != dcuDetIdMap.end() && it->second.first == iconn->detId()) {
edm::LogInfo("SiStripFedCablingManipulator")
<< "::manipulate - fedid " << *ifeds << " dcuid " << iconn->dcuId() << " oldDet " << iconn->detId()
<< " newDetID " << it->second.second;
conns.push_back(FedChannelConnection(iconn->fecCrate(),
iconn->fecSlot(),
iconn->fecRing(),
iconn->ccuAddr(),
iconn->ccuChan(),
iconn->i2cAddr(0),
iconn->i2cAddr(1),
iconn->dcuId(),
it->second.second, //<------ New detid
iconn->nApvPairs(),
iconn->fedId(),
iconn->fedCh(),
iconn->fiberLength(),
iconn->dcu(),
iconn->pll(),
iconn->mux(),
iconn->lld()));
} else {
conns.push_back(FedChannelConnection(iconn->fecCrate(),
iconn->fecSlot(),
iconn->fecRing(),
iconn->ccuAddr(),
iconn->ccuChan(),
iconn->i2cAddr(0),
iconn->i2cAddr(1),
iconn->dcuId(),
iconn->detId(),
iconn->nApvPairs(),
iconn->fedId(),
iconn->fedCh(),
iconn->fiberLength(),
iconn->dcu(),
iconn->pll(),
iconn->mux(),
iconn->lld()));
}
}
}
oobj = std::make_unique<SiStripFedCabling>(conns);
}
return oobj;
}
|