93 {
94
95 SG::WriteCondHandle<SCT_CablingData> writeHandle{
m_writeKey, ctx};
98 << ". In theory this should not be called, but may happen"
99 << " if multiple concurrent events are being processed out of order.");
100 return StatusCode::SUCCESS;
101 }
102
103
104 std::unique_ptr<SCT_CablingData> writeCdo{std::make_unique<SCT_CablingData>()};
105
106 Identifier offlineId;
107 IdentifierHash offlineIdHash;
108 unsigned int onlineId;
109 int robid{0};
110 std::ifstream fromDataFile{
m_source.value().c_str()};
111 if (not fromDataFile) {
113 return StatusCode::FAILURE;
114 }
115 std::string inString;
116 bool endOfFile{false};
118 if (inString.empty()) {
119 ATH_MSG_FATAL(
"The end of the datafile was reached before an identifier mapping was found");
120 return StatusCode::FAILURE;
121 }
122
123 bool endOfTable{false};
124 unsigned int numEntries{0};
125 std::vector<IdentifierHash> disabledFibres;
126 do {
127 std::getline(fromDataFile, inString);
128 if (
contains(inString,
"- "))
continue;
129 endOfTable=
contains(inString,
"</textList>");
130 std::istringstream dataLine(inString);
131 if (not endOfTable) {
133 std::string sn,Link;
134
135 dataLine.exceptions(std::ios_base::badbit|std::ios_base::failbit);
136 try {
137 dataLine>>
rod>>Link>>barrelOrEndcap>>
layer>>
eta>>
phi>>
side>>std::hex>>robidFromfile>>std::dec>>sn;
139 offlineIdHash =
m_idHelper->wafer_hash(offlineId);
140 } catch (const std::ios_base::failure&) {
142 << ", it may be badly formatted in the following line: \n" << inString);
143 continue;
144 }
145
146
147 if (Link.empty() or Link.size()>10) {
149 << ", Link (" << Link << ") cannot be converted to an integer");
150 continue;
151 }
152
153 link = std::stoi(Link, nullptr, 0);
154 if (link<0) {
155 ATH_MSG_ERROR(
"link " << link <<
" seems invalid. This was obtained from Link " << Link <<
". Will not be used.");
156 continue;
157 }
159 ATH_MSG_DEBUG(sn <<
": Disabled fibre encountered in text file. Will attempt to place identifier using the other fibre.");
161 offlineIdHash =
m_idHelper->wafer_hash(offlineId);
162 disabledFibres.push_back(offlineIdHash);
163 continue;
164 }
165 robid = robidFromfile;
166 onlineId = (robid & 0xFFFFFF) | (link << 24);
167
168 bool success{
insert(offlineIdHash, onlineId, SCT_SerialNumber(sn), writeCdo.get())};
169 if (not success) {
170 ATH_MSG_ERROR(
"Insertion of fibre failed, " << offlineIdHash <<
", " << std::hex << onlineId << std::dec <<
" " << sn);
171 } else {
172 numEntries++;
173 }
174 }
175 endOfFile = fromDataFile.eof();
176 } while ((not endOfTable) and (not endOfFile));
177
178
179
180
181 std::string plural{(disabledFibres.size()==1) ? " was" : "s were"};
182 ATH_MSG_INFO(disabledFibres.size() <<
" disabled fibre" << plural <<
" found.");
183 if (not disabledFibres.empty()) {
185 std::vector<IdentifierHash>::const_iterator
it{disabledFibres.begin()};
186 for (;
it not_eq disabledFibres.end();++
it) {
187 IdentifierHash offlineIdHash{*
it};
188
191
192 IdentifierHash otherIdHash{offlineIdHash + (
s ? -1 : 1)};
193
194 onlineId=writeCdo->getOnlineIdFromHash(otherIdHash);
195 int link{static_cast<int>((onlineId>>24) & 0x7F)};
196 bool cableSwapped{(link % 2)!=os};
197
198
199 int newlink{(
s == 0) ? (link - 1) : (link +1)};
200 if (cableSwapped) newlink = (
s == 0) ? (link+1) : (link-1);
201 int newOnlineId{static_cast<int>((onlineId & 0xFFFFFF)|(newlink << 24))};
203
204 SCT_SerialNumber sn{writeCdo->getSerialNumberFromHash(offlineIdHash)};
205 bool success{
insert(offlineIdHash, newOnlineId, sn, writeCdo.get())};
206 if (not success) {
207 ATH_MSG_ERROR(
"Insertion of disabled fibre failed, " << offlineIdHash <<
", " << std::hex << newOnlineId << std::dec <<
" " << sn.
str());
208 } else {
209 numEntries++;
210 }
211 }
212 }
213 ATH_MSG_INFO(numEntries <<
" entries were made to the identifier map.");
214
215
216 const EventIDBase
start{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, 0, 0, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
217 const EventIDBase
stop{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
219 if (writeHandle.
record(rangeW, std::move(writeCdo)).isFailure()) {
221 << " with EventRange " << rangeW
222 << " into Conditions Store");
223 return StatusCode::FAILURE;
224 }
225 ATH_MSG_INFO(
"recorded new CDO " << writeHandle.
key() <<
" with range " << rangeW <<
" into Conditions Store");
226
228}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
static const int disabledFibre
static const std::string atlasTableSignature
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.