101 <<
". In theory this should not be called, but may happen"
102 <<
" if multiple concurrent events are being processed out of order.");
103 return StatusCode::SUCCESS;
107 std::unique_ptr<SCT_CablingData> writeCdo{std::make_unique<SCT_CablingData>()};
111 unsigned int onlineId;
113 std::ifstream fromDataFile{
m_source.value().c_str()};
114 if (not fromDataFile) {
116 return StatusCode::FAILURE;
118 std::string inString;
119 bool endOfFile{
false};
120 inString=fastForward(fromDataFile, atlasTableSignature);
121 if (inString.empty()) {
122 ATH_MSG_FATAL(
"The end of the datafile was reached before an identifier mapping was found");
123 return StatusCode::FAILURE;
126 bool endOfTable{
false};
127 unsigned int numEntries{0};
128 std::vector<IdentifierHash> disabledFibres;
130 std::getline(fromDataFile, inString);
131 if (
contains(inString,
"- "))
continue;
132 endOfTable=
contains(inString, endOfTableTableSignature);
133 std::istringstream dataLine(inString);
134 if (not endOfTable) {
135 int rod,link,barrelOrEndcap,layer,
phi,
eta,side,robidFromfile;
138 dataLine.exceptions(std::ios_base::badbit|std::ios_base::failbit);
140 dataLine>>rod>>Link>>barrelOrEndcap>>layer>>
eta>>
phi>>side>>std::hex>>robidFromfile>>std::dec>>sn;
142 offlineIdHash =
m_idHelper->wafer_hash(offlineId);
143 }
catch (
const std::ios_base::failure&) {
145 <<
", it may be badly formatted in the following line: \n" << inString);
150 if (Link.empty() or Link.size()>10) {
152 <<
", Link (" << Link <<
") cannot be converted to an integer");
156 link = std::stoi(Link,
nullptr, 0);
158 ATH_MSG_ERROR(
"link " << link <<
" seems invalid. This was obtained from Link " << Link <<
". Will not be used.");
162 ATH_MSG_DEBUG(sn <<
": Disabled fibre encountered in text file. Will attempt to place identifier using the other fibre.");
164 offlineIdHash =
m_idHelper->wafer_hash(offlineId);
165 disabledFibres.push_back(offlineIdHash);
168 robid = robidFromfile;
169 onlineId = (robid & 0xFFFFFF) | (link << 24);
173 ATH_MSG_ERROR(
"Insertion of fibre failed, " << offlineIdHash <<
", " << std::hex << onlineId << std::dec <<
" " << sn);
178 endOfFile = fromDataFile.eof();
179 }
while ((not endOfTable) and (not endOfFile));
184 std::string plural{(disabledFibres.size()==1) ?
" was" :
"s were"};
185 ATH_MSG_INFO(disabledFibres.size() <<
" disabled fibre" << plural <<
" found.");
186 if (not disabledFibres.empty()) {
188 std::vector<IdentifierHash>::const_iterator it{disabledFibres.begin()};
189 for (;it not_eq disabledFibres.end();++it) {
197 onlineId=writeCdo->getOnlineIdFromHash(otherIdHash);
198 int link{
static_cast<int>((onlineId>>24) & 0x7F)};
199 bool cableSwapped{(link % 2)!=os};
202 int newlink{(s == 0) ? (link - 1) : (link +1)};
203 if (cableSwapped) newlink = (s == 0) ? (link+1) : (link-1);
204 int newOnlineId{
static_cast<int>((onlineId & 0xFFFFFF)|(newlink << 24))};
208 bool success{
insert(offlineIdHash, newOnlineId, sn, writeCdo.get())};
210 ATH_MSG_ERROR(
"Insertion of disabled fibre failed, " << offlineIdHash <<
", " << std::hex << newOnlineId << std::dec <<
" " << sn.
str());
216 ATH_MSG_INFO(numEntries <<
" entries were made to the identifier map.");
219 const EventIDBase start{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, 0, 0, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
220 const EventIDBase stop{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
221 const EventIDRange rangeW{start, stop};
222 if (writeHandle.
record(rangeW, std::move(writeCdo)).isFailure()) {
224 <<
" with EventRange " << rangeW
225 <<
" into Conditions Store");
226 return StatusCode::FAILURE;
228 ATH_MSG_INFO(
"recorded new CDO " << writeHandle.
key() <<
" with range " << rangeW <<
" into Conditions Store");
230 return (numEntries==0) ? (StatusCode::FAILURE) : (StatusCode::SUCCESS);
Fills an SCT cabling object from a plain text source.
bool insert(const IdentifierHash &hash, const SCT_OnlineId &onlineId, const SCT_SerialNumber &sn, SCT_CablingData *data) const
SCT_CablingCondAlgFromText(const std::string &name, ISvcLocator *svc)
virtual StatusCode initialize() override
virtual StatusCode finalize() override
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteCondHandleKey< SCT_CablingData > m_writeKey