22 #include "Identifier/Identifier.h"
27 #include "GaudiKernel/EventIDRange.h"
34 static const std::string atlasTableSignature{
"Rod Fibre Bec LayerDisk Eta Phi Side RobId Sn"};
35 static const int disabledFibre{255};
42 return (
s1.find(
s2) not_eq std::string::npos);
47 fastForward(std::ifstream& theFile,
const std::string& signature) {
49 bool found{
false}, endOfFile{
false};
51 std::getline(theFile, inString);
53 endOfFile = theFile.eof();
54 }
while ((not
found) and (not endOfFile));
55 return found ? (inString) : (std::string{
""});
72 return StatusCode::FAILURE;
82 return StatusCode::SUCCESS;
88 return StatusCode::SUCCESS;
96 if (writeHandle.isValid()) {
97 ATH_MSG_DEBUG(
"CondHandle " << writeHandle.fullKey() <<
" is already valid."
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;
104 std::unique_ptr<SCT_CablingData> writeCdo{std::make_unique<SCT_CablingData>()};
108 unsigned int onlineId;
110 std::ifstream fromDataFile{
m_source.value().c_str()};
111 if (not fromDataFile) {
113 return StatusCode::FAILURE;
115 std::string inString;
116 bool endOfFile{
false};
117 inString=fastForward(fromDataFile, atlasTableSignature);
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;
123 bool endOfTable{
false};
124 unsigned int numEntries{0};
125 std::vector<IdentifierHash> disabledFibres;
127 std::getline(fromDataFile, inString);
128 if (
contains(inString,
"- "))
continue;
129 endOfTable=
contains(inString,
"</textList>");
130 std::istringstream dataLine(inString);
131 if (not endOfTable) {
135 dataLine.exceptions(std::ios_base::badbit|std::ios_base::failbit);
137 dataLine>>
rod>>Link>>barrelOrEndcap>>
layer>>
eta>>
phi>>
side>>std::hex>>robidFromfile>>std::dec>>sn;
140 }
catch (
const std::ios_base::failure&) {
142 <<
", it may be badly formatted in the following line: \n" << inString);
147 if (Link.empty() or Link.size()>10) {
149 <<
", Link (" << Link <<
") cannot be converted to an integer");
153 link = std::stoi(Link,
nullptr, 0);
155 ATH_MSG_ERROR(
"link " << link <<
" seems invalid. This was obtained from Link " << Link <<
". Will not be used.");
158 if (link==disabledFibre) {
159 ATH_MSG_DEBUG(sn <<
": Disabled fibre encountered in text file. Will attempt to place identifier using the other fibre.");
162 disabledFibres.push_back(offlineIdHash);
165 robid = robidFromfile;
166 onlineId = (robid & 0xFFFFFF) | (link << 24);
170 ATH_MSG_ERROR(
"Insertion of fibre failed, " << offlineIdHash <<
", " << std::hex << onlineId << std::dec <<
" " << sn);
175 endOfFile = fromDataFile.eof();
176 }
while ((not endOfTable) and (not endOfFile));
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) {
194 onlineId=writeCdo->getOnlineIdFromHash(otherIdHash);
195 int link{
static_cast<int>((onlineId>>24) & 0x7F)};
196 bool cableSwapped{(link % 2)!=
os};
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))};
205 bool success{
insert(offlineIdHash, newOnlineId, sn, writeCdo.get())};
207 ATH_MSG_ERROR(
"Insertion of disabled fibre failed, " << offlineIdHash <<
", " << std::hex << newOnlineId << std::dec <<
" " << sn.str());
213 ATH_MSG_INFO(numEntries <<
" entries were made to the identifier map.");
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()) {
220 ATH_MSG_FATAL(
"Could not record SCT_CablingData " << writeHandle.key()
221 <<
" with EventRange " << rangeW
222 <<
" into Conditions Store");
223 return StatusCode::FAILURE;
225 ATH_MSG_INFO(
"recorded new CDO " << writeHandle.key() <<
" with range " << rangeW <<
" into Conditions Store");
227 return (numEntries==0) ? (StatusCode::FAILURE) : (StatusCode::SUCCESS);
237 if (not
hash.is_valid()) {
243 ATH_MSG_FATAL(
"Pointer of derived conditions object is null");
247 if (not
data->setHashForOnlineId(
hash, onlineId))
return false;
248 if (not
data->setOnlineIdForHash(onlineId,
hash))
return false;
250 bool successfulInsert{
data->setHashForSerialNumber(
hash, sn)};
251 successfulInsert &=
data->setSerialNumberForHash(sn,
hash);
253 if (successfulInsert) {