96 {
97
98 SG::WriteCondHandle<SCT_CablingData> writeHandle{
m_writeKey, ctx};
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;
104 }
105
106
107 std::unique_ptr<SCT_CablingData> writeCdo{std::make_unique<SCT_CablingData>()};
108
109 Identifier offlineId;
110 IdentifierHash offlineIdHash;
111 unsigned int onlineId;
112 int robid{0};
113 std::ifstream fromDataFile{
m_source.value().c_str()};
114 if (not fromDataFile) {
116 return StatusCode::FAILURE;
117 }
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;
124 }
125
126 bool endOfTable{false};
127 unsigned int numEntries{0};
128 std::vector<IdentifierHash> disabledFibres;
129 do {
130 std::getline(fromDataFile, inString);
131 if (
contains(inString,
"- "))
continue;
132 endOfTable=
contains(inString, endOfTableTableSignature);
133 std::istringstream dataLine(inString);
134 if (not endOfTable) {
136 std::string sn,Link;
137
138 dataLine.exceptions(std::ios_base::badbit|std::ios_base::failbit);
139 try {
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);
146 continue;
147 }
148
149
150 if (Link.empty() or Link.size()>10) {
152 << ", Link (" << Link << ") cannot be converted to an integer");
153 continue;
154 }
155
156 link = std::stoi(Link,
nullptr, 0);
157 if (link<0) {
158 ATH_MSG_ERROR(
"link " << link <<
" seems invalid. This was obtained from Link " << Link <<
". Will not be used.");
159 continue;
160 }
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);
166 continue;
167 }
168 robid = robidFromfile;
169 onlineId = (robid & 0xFFFFFF) | (link << 24);
170
171 bool success{
insert(offlineIdHash, onlineId, SCT_SerialNumber(sn), writeCdo.get())};
172 if (not success) {
173 ATH_MSG_ERROR(
"Insertion of fibre failed, " << offlineIdHash <<
", " << std::hex << onlineId << std::dec <<
" " << sn);
174 } else {
175 numEntries++;
176 }
177 }
178 endOfFile = fromDataFile.eof();
179 } while ((not endOfTable) and (not endOfFile));
180
181
182
183
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) {
190 IdentifierHash offlineIdHash{*
it};
191
194
195 IdentifierHash otherIdHash{offlineIdHash + (
s ? -1 : 1)};
196
197 onlineId=writeCdo->getOnlineIdFromHash(otherIdHash);
198 int link{
static_cast<int>((onlineId>>24) & 0x7F)};
199 bool cableSwapped{(
link % 2)!=os};
200
201
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))};
206
207 SCT_SerialNumber sn{writeCdo->getSerialNumberFromHash(offlineIdHash)};
208 bool success{
insert(offlineIdHash, newOnlineId, sn, writeCdo.get())};
209 if (not success) {
210 ATH_MSG_ERROR(
"Insertion of disabled fibre failed, " << offlineIdHash <<
", " << std::hex << newOnlineId << std::dec <<
" " << sn.
str());
211 } else {
212 numEntries++;
213 }
214 }
215 }
216 ATH_MSG_INFO(numEntries <<
" entries were made to the identifier map.");
217
218
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};
222 if (writeHandle.
record(rangeW, std::move(writeCdo)).isFailure()) {
224 << " with EventRange " << rangeW
225 << " into Conditions Store");
226 return StatusCode::FAILURE;
227 }
228 ATH_MSG_INFO(
"recorded new CDO " << writeHandle.
key() <<
" with range " << rangeW <<
" into Conditions Store");
229
231}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
static const int disabledFibre
bool insert(const IdentifierHash &hash, const SCT_OnlineId &onlineId, const SCT_SerialNumber &sn, SCT_CablingData *data) const
const SCT_ID * m_idHelper
SG::WriteCondHandleKey< SCT_CablingData > m_writeKey
std::string str() const
Full serial number as a string.
const std::string & key() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
bool contains(const std::string &s, const std::string ®x)
does a string contain the substring
::StatusCode StatusCode
StatusCode definition for legacy code.
pointer & link(pointer p) const
Return a reference to the link for an element.