ATLAS Offline Software
Loading...
Searching...
No Matches
SourceCompAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "SourceCompAlg.h"
6#include "RDBAccessSvc.h"
8#include "GaudiKernel/ServiceHandle.h"
9
10typedef std::map<std::string,IRDBRecordset_ptr> NodeToRecordsetMap;
11
12SourceCompAlg::SourceCompAlg(const std::string& name, ISvcLocator* pSvcLocator)
13 : AthAlgorithm(name, pSvcLocator)
14{
15}
16
18{
19 ATH_MSG_INFO(" in initialize()");
20
21 // Get RDBAccessSvc
22 ServiceHandle<IRDBAccessSvc> rdbAccessSvc("RDBAccessSvc",name());
23 ATH_CHECK(rdbAccessSvc.retrieve());
24
25 // Open connections to two databases
26 for(const std::string& connName : m_connNames) {
27 if(!rdbAccessSvc->connect(connName)) {
28 ATH_MSG_FATAL("Failed to connect to " << connName);
29 return StatusCode::FAILURE;
30 }
31 }
32
33 RDBAccessSvc* rdbAccess = dynamic_cast<RDBAccessSvc*>(rdbAccessSvc.get());
34 if(!rdbAccess) {
35 ATH_MSG_FATAL("Unable to cast IRDBAccessSvc to RDBAccessSvc");
36 return StatusCode::FAILURE;
37 }
38
39 // Open log file
40 std::ofstream log;
41 log.open("GeometryDBTagDiff.log",std::ofstream::out);
42
43 std::vector<std::string> tagList;
44
45 if(m_globalTag.value().empty()) {
46 // Get the list of locked supported global tags
47 tagList = getGlobalTags(rdbAccess,log);
48 }
49 else {
50 tagList.push_back(m_globalTag.value());
51 }
52
53 StatusCode result{StatusCode::SUCCESS};
54 if(!tagList.empty()) {
55 // Loop over the tags and compare them
56 result = compareGlobalTags(tagList,rdbAccess,log);
57 }
58
59 log.close();
60 rdbAccess->disconnect(m_connNames[1]);
61 rdbAccess->disconnect(m_connNames[0]);
62
63 return result;
64}
65
67{
68 ATH_MSG_DEBUG(" in execute()");
69 return StatusCode::SUCCESS;
70}
71
73{
74 ATH_MSG_DEBUG(" in finalize()");
75 return StatusCode::SUCCESS;
76}
77
78std::vector<std::string> SourceCompAlg::getGlobalTags(RDBAccessSvc* rdbAccessSvc
79 , std::ofstream& log)
80{
81 std::vector<std::string> tagdiff, taglist1, taglist2;
82 std::vector<char> leftright;
83 taglist1 = rdbAccessSvc->getLockedSupportedTags(m_supportedGeometry,m_connNames[0]);
84 taglist2 = rdbAccessSvc->getLockedSupportedTags(m_supportedGeometry,m_connNames[1]);
85 tagdiff.resize(taglist1.size()+taglist2.size());
86 auto it1 = taglist1.begin();
87 auto it1last = taglist1.end();
88 auto it2 = taglist2.begin();
89 auto it2last = taglist2.end();
90 auto itdiff = tagdiff.begin();
91
92 while(true) {
93 if(it1==it1last) {
94 while(it2!=it2last) {
95 leftright.push_back('>');
96 *itdiff = *it2;
97 ++itdiff;
98 ++it2;
99 }
100 break;
101 }
102 if(it2==it2last) {
103 while(it1!=it1last) {
104 leftright.push_back('<');
105 *itdiff = *it1;
106 ++itdiff;
107 ++it1;
108 }
109 break;
110 }
111
112 if (*it1<*it2) {
113 *itdiff=*it1;
114 ++itdiff;
115 ++it1;
116 leftright.push_back('<');
117 }
118 else if (*it2<*it1) {
119 *itdiff = *it2;
120 ++itdiff;
121 ++it2;
122 leftright.push_back('>');
123 }
124 else {
125 ++it1;
126 ++it2;
127 }
128 }
129
130 tagdiff.resize(itdiff-tagdiff.begin());
131 if(!tagdiff.empty()) {
132 log << "The databases contain different sets of supported locked global tags" << std::endl;
133 auto leftrightIt = leftright.begin();
134 for(const std::string& tag : tagdiff ) {
135 log << *leftrightIt << " " << tag << std::endl;
136 ++leftrightIt;
137 }
138 tagdiff.clear();
139 return tagdiff;
140 }
141 return taglist1;
142}
143
144
145StatusCode SourceCompAlg::compareGlobalTags(const std::vector<std::string>& globalTags
146 , RDBAccessSvc* rdbAccessSvc
147 , std::ofstream& log)
148{
149 ATH_MSG_INFO("compareGlobalTags()");
150 for(const std::string& tag : globalTags) {
151 ATH_MSG_INFO("Working on " << tag);
152 std::vector<NodeToRecordsetMap> map;
153 map.resize(2);
154 size_t connInd(0);
155 for(auto& mapel : map) {
156 // Double-check the existence of the global tag in the database
157 if(rdbAccessSvc->getChildTag("ATLAS",tag,"ATLAS",m_connNames[connInd])=="") {
158 ATH_MSG_FATAL("Unable to find " << tag << " in the connection " << m_connNames[connInd]);
159 return StatusCode::FAILURE;
160 }
161
162 // Get tag details, only needed for generation of tag cache
163 RDBTagDetails atlasTagDetails ATLAS_THREAD_SAFE;
164 rdbAccessSvc->getTagDetails(atlasTagDetails,tag,m_connNames[connInd]);
165 std::ostringstream tagDetailStream;
166 tagDetailStream << atlasTagDetails << std::endl;
167 ATH_MSG_DEBUG("Global tag in connection " << m_connNames[connInd] << ": " << tagDetailStream.str());
168
169 // Get the list of all leaf nodes
170 RDBAccessSvc* rdbAccessConc = dynamic_cast<RDBAccessSvc*>(rdbAccessSvc);
171 if(rdbAccessConc) {
172 std::vector<std::string> leafNodes;
173 rdbAccessConc->getAllLeafNodes(leafNodes,m_connNames[connInd]);
174 for(size_t ii=0; ii<leafNodes.size(); ++ii) {
175 std::string nodeName = leafNodes[ii];
176 int perc = ii*100/leafNodes.size();
177 ATH_MSG_DEBUG("\t ** Node: " << nodeName << "\t" << perc << "%");
178 std::string childTag = rdbAccessSvc->getChildTag(nodeName,tag,"ATLAS",m_connNames[connInd],true);
179 if(!childTag.empty()) {
180 IRDBRecordset_ptr recPtr = rdbAccessSvc->getRecordsetPtr(nodeName,childTag,"",m_connNames[connInd]);
181 if(recPtr->size()) {
182 mapel[nodeName] = std::move(recPtr);
183 }
184 }
185 }
186 }
187 ++connInd;
188 }
189
190 if(map[0].size()!=map[1].size()) {
191 log << std::endl << "TAG: " << tag << std::endl
192 << "Different number of leaf nodes in databases! " << map[0].size() << " vs " << map[1].size() << std::endl;
193 }
194
195 bool difFound{false};
196 NodeToRecordsetMap::const_iterator it = map[0].begin();
197 for(; it!=map[0].end(); ++it) {
198 if(map[1].find(it->first)==map[1].end()) {
199 if(!difFound) {
200 difFound = true;
201 log << std::endl << "TAG: " << tag << std::endl
202 << "Nodes existing in Session0 but missing in Session1:" << std::endl;
203 }
204 log << "** " << it->first << std::endl;
205 }
206 }
207
208 difFound = false;
209 it = map[1].begin();
210 for(; it!=map[1].end(); ++it) {
211 if(map[0].find(it->first)==map[0].end()) {
212 if(!difFound) {
213 difFound = true;
214 log << std::endl << "TAG: " << tag << std::endl
215 << "Nodes existing in Session1 but missing in Session0:" << std::endl;
216 }
217 log << "** " << it->first << std::endl;
218 }
219 }
220
221 difFound = false;
222 it = map[0].begin();
223 for(; it!=map[0].end(); ++it) {
224 NodeToRecordsetMap::const_iterator it1 = map[1].find(it->first);
225 if(it1!=map[1].end()) {
226 IRDBRecordset_ptr recPtr0 = it->second;
227 IRDBRecordset_ptr recPtr1 = it1->second;
228 RDBRecordset* recConcrete0 = dynamic_cast<RDBRecordset*>(recPtr0.get());
229 RDBRecordset* recConcrete1 = dynamic_cast<RDBRecordset*>(recPtr1.get());
230 if(recConcrete0!=0
231 && recConcrete1!=0
232 && *recConcrete0!=*recConcrete1) {
233 if(!difFound) {
234 difFound = true;
235 log << std::endl << "TAG: " << tag << std::endl
236 << "Differences for common nodes:" << std::endl;
237 }
238 log <<std::endl << "** " << it->first << std::endl;
239 recConcrete0->compare(*recConcrete1,log);
240 }
241 }
242 }
243 }
244 return StatusCode::SUCCESS;
245}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
coral::AttributeList RDBTagDetails
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition of RDBAccessSvc class.
std::map< std::string, IRDBRecordset_ptr > NodeToRecordsetMap
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
virtual unsigned int size() const =0
RDBAccessSvc is the implementation of IRDBAccessSvc interface.
std::vector< std::string > getLockedSupportedTags(const std::string &supportedFlag, const std::string &connName="ATLASDD")
bool disconnect(const std::string &connName) override
If the counnection counter==1 closes the connection.
IRDBRecordset_ptr getRecordsetPtr(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD") override
Provides access to the Recordset object containing HVS-tagged data.
void getAllLeafNodes(std::vector< std::string > &list, const std::string &connName="ATLASDD")
void getTagDetails(RDBTagDetails &tagDetails, const std::string &tag, const std::string &connName="ATLASDD") override
std::string getChildTag(const std::string &childNode, const std::string &parentTag, const std::string &parentNode, const std::string &connName) override
Gets the tag name for the node by giving its parent node tag.
RDBRecordset is an implementation of IRDBRecordset interface.
void compare(const RDBRecordset &rec, std::ostream &os) const
Gaudi::Property< std::string > m_globalTag
Gaudi::Property< std::string > m_supportedGeometry
virtual StatusCode execute() override
StatusCode compareGlobalTags(const std::vector< std::string > &globalTags, RDBAccessSvc *rdbAccessSvc, std::ofstream &log)
virtual StatusCode initialize() override
virtual StatusCode finalize() override
SourceCompAlg(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< std::string > getGlobalTags(RDBAccessSvc *rdbAccessSvc, std::ofstream &log)
std::vector< std::string > m_connNames
STL class.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138