ATLAS Offline Software
SourceCompAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "SourceCompAlg.h"
6 #include "RDBAccessSvc.h"
8 #include "GaudiKernel/ServiceHandle.h"
9 
10 typedef std::map<std::string,IRDBRecordset_ptr> NodeToRecordsetMap;
11 
12 SourceCompAlg::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 
78 std::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 
145 StatusCode 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] = 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 }
RDBAccessSvc::getChildTag
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.
Definition: RDBAccessSvc.cxx:271
SourceCompAlg::compareGlobalTags
StatusCode compareGlobalTags(const std::vector< std::string > &globalTags, RDBAccessSvc *rdbAccessSvc, std::ofstream &log)
Definition: SourceCompAlg.cxx:145
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SourceCompAlg::m_supportedGeometry
Gaudi::Property< std::string > m_supportedGeometry
Definition: SourceCompAlg.h:31
RDBAccessSvc::getLockedSupportedTags
std::vector< std::string > getLockedSupportedTags(const std::string &supportedFlag, const std::string &connName="ATLASDD")
Definition: RDBAccessSvc.cxx:454
get_generator_info.result
result
Definition: get_generator_info.py:21
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
RDBAccessSvc.h
Definition of RDBAccessSvc class.
NodeToRecordsetMap
std::map< std::string, IRDBRecordset_ptr > NodeToRecordsetMap
Definition: SourceCompAlg.cxx:10
skel.it
it
Definition: skel.GENtoEVGEN.py:423
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
SourceCompAlg.h
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
RDBAccessSvc
RDBAccessSvc is the implementation of IRDBAccessSvc interface.
Definition: RDBAccessSvc.h:59
SourceCompAlg::m_globalTag
Gaudi::Property< std::string > m_globalTag
Definition: SourceCompAlg.h:26
DetDescrDictionaryDict::it1
std::vector< HWIdentifier >::iterator it1
Definition: DetDescrDictionaryDict.h:17
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
RDBAccessSvc::getRecordsetPtr
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.
Definition: RDBAccessSvc.cxx:150
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
AthAlgorithm
Definition: AthAlgorithm.h:47
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
RDBTagDetails
coral::AttributeList RDBTagDetails
Definition: IRDBAccessSvc.h:29
SourceCompAlg::getGlobalTags
std::vector< std::string > getGlobalTags(RDBAccessSvc *rdbAccessSvc, std::ofstream &log)
Definition: SourceCompAlg.cxx:78
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
SourceCompAlg::SourceCompAlg
SourceCompAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: SourceCompAlg.cxx:12
SourceCompAlg::execute
virtual StatusCode execute() override
Definition: SourceCompAlg.cxx:66
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
SourceCompAlg::finalize
virtual StatusCode finalize() override
Definition: SourceCompAlg.cxx:72
checker_macros.h
Define macros for attributes used to control the static checker.
SourceCompAlg::m_connNames
std::vector< std::string > m_connNames
Definition: SourceCompAlg.h:36
RDBAccessSvc::getTagDetails
void getTagDetails(RDBTagDetails &tagDetails, const std::string &tag, const std::string &connName="ATLASDD") override
Returns AttributeList with tag details Attributes in the list: Locked (bool), Supported (bool)
Definition: RDBAccessSvc.cxx:337
SourceCompAlg::initialize
virtual StatusCode initialize() override
Definition: SourceCompAlg.cxx:17
RDBAccessSvc::getAllLeafNodes
void getAllLeafNodes(std::vector< std::string > &list, const std::string &connName="ATLASDD")
Definition: RDBAccessSvc.cxx:415
keylayer_zslicemap.perc
perc
Definition: keylayer_zslicemap.py:62
RDBAccessSvc::disconnect
bool disconnect(const std::string &connName) override
If the counnection counter==1 closes the connection.
Definition: RDBAccessSvc.cxx:82
RDBRecordset
RDBRecordset is an implementation of IRDBRecordset interface.
Definition: RDBRecordset.h:39
RDBRecordset::compare
void compare(const RDBRecordset &rec, std::ostream &os) const
Definition: RDBRecordset.cxx:165
ServiceHandle< IRDBAccessSvc >