ATLAS Offline Software
SGFolder.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 <cassert>
6 #include <cstdlib> /* atoi */
7 #include <iostream>
8 #include <vector>
9 
10 #include "GaudiKernel/IMessageSvc.h"
11 #include "GaudiKernel/MsgStream.h"
12 #include "GaudiKernel/ISvcLocator.h"
13 
15 #include "GaudiKernel/IClassIDSvc.h"
17 
18 #include "SGFolder.h"
19 
20 /* #define SGFOLDER_DEBUG 1 */
21 
22 using namespace SG;
23 
24 
25 
26 //-----------------------------------------------------------------------------
27 Folder::Folder( const std::string& type,
28  const std::string& name,
29  const IInterface* parent) :
30  base_class( type, name, parent ),
31  m_pCLIDSvc("ClassIDSvc", name),
32  m_checkItems(false)
33 {
34  declareProperty("ItemList", m_itemList,
35  " list of data objects identified by a class name (or clid)#key pairs. One can use '*' as key value to add all objects of a given type to the Folder. If the type name ends with !, then write the object as exactly that type (and not as any derived class). ");
36  m_itemList.declareUpdateHandler(&Folder::decodeItemList, this);
37  declareProperty("CheckItems", m_checkItems,
38  "check if item types are known to ClassIDSvc");
39 }
40 
41 //-----------------------------------------------------------------------------
43 {}
44 
45 //-----------------------------------------------------------------------------
47  return m_pCLIDSvc.retrieve();
48 }
49 
50 //-----------------------------------------------------------------------------
51 void Folder::updateItemList(bool checkValid) {
52  std::vector< std::string >::const_iterator
53  i(m_itemList.value().begin()), e(m_itemList.value().end());
54  while (i != e) decodeItem(*i++, checkValid);
55 }
56 
57 void Folder::decodeItem(const std::string& item, bool checkValid) {
58  assert( !item.empty() );
59  assert( m_pCLIDSvc );
60 #ifdef SGFOLDER_DEBUG
61  //can't use MsgStream (log level still not defined)
62  std::cout << "Folder::decodeItem("<< item<<") called" << std::endl;
63 #endif
64  std::string::size_type sep(item.rfind('#'));
65  std::string typeName (item.substr(0,sep));
66  std::string skey;
67  if (sep != std::string::npos) skey = item.substr(sep+1);
68 
69  //item contains a typename OR a CLID. Try the CLID hypothesis first
70  CLID clid(atoi(typeName.c_str()));
71  //atoi would return 0 if "typeName" is not a stringified number
72  if ( 0 == clid) {
73  //notice that if the typename is not yet in the ClassIDSvc registry the entry will be ignored
74  add(typeName, skey).ignore();
75  } else add(clid, skey, checkValid, false).ignore();
76 }
77 
79 Folder::add(const std::string& typeName, const std::string& skey) {
80  bool exact = false;
81  std::string tn = typeName;
82  if (tn.size() > 0 && tn[tn.size()-1] == '!') {
83  exact = true;
84  tn.erase (tn.end()-1);
85  }
86 
87  CLID clid;
88  //let's see if the typename is known to ClassIDSvc
89  StatusCode sc(m_pCLIDSvc->getIDOfTypeName(tn, clid));
90  //if so, add the corresponding clid (no point in checking it again)
91  if (sc.isSuccess()) sc=add(clid, skey, false, exact);
92  else {
93  MsgStream log(msgSvc(), name());
94  log << MSG::WARNING << "add: can not find type ["
95  << typeName << "] in clid db" << endmsg;
96  }
97  return sc;
98 }
99 
101 Folder::add(const CLID& clid, const std::string& skey,
102  bool checkValid, bool exact)
103 {
104  StatusCode sc(StatusCode::FAILURE);
105  if ( !checkValid || m_pCLIDSvc->isIDInUse(clid) ) {
106  m_list.insert(FolderItem(clid, skey, exact));
107  sc = StatusCode::SUCCESS;
108  } else if (0 != clid) {
109  MsgStream log(msgSvc(), name());
110  log << MSG::WARNING << "add: can not find clid "
111  << clid << " in clid db" << endmsg;
112  }
113 #ifdef SGFOLDER_DEBUG
114  std::cout << "SG::Folder::add(" << clid << ",\"" << skey << "\") returns "
115  << (sc.isSuccess() ? "SUCCESS" : "FAILURE") << std::endl;
116 #endif
117  return sc;
118 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
SGFolder.h
a run-time configurable list of data objects
SG::Folder::~Folder
virtual ~Folder() override
Definition: SGFolder.cxx:42
SG
Forward declaration.
Definition: CaloCellPacker_400_500.h:32
SG::Folder::updateItemList
virtual void updateItemList(bool checkValidCLID) override final
update contents of the ItemList
Definition: SGFolder.cxx:51
SG::Folder::m_pCLIDSvc
ServiceHandle< IClassIDSvc > m_pCLIDSvc
Definition: SGFolder.h:88
SG::Folder::m_itemList
StringArrayProperty m_itemList
property: the list of items (data objects identified by a class name/key pair)
Definition: SGFolder.h:90
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
StdJOSetup.msgSvc
msgSvc
Provide convenience handles for various services.
Definition: StdJOSetup.py:36
lumiFormat.i
int i
Definition: lumiFormat.py:85
ClassID_traits.h
a traits class that associates a CLID to a type T It also detects whether T inherits from Gaudi DataO...
SG::Folder::Folder
Folder(const std::string &type, const std::string &name, const IInterface *parent)
Definition: SGFolder.cxx:27
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::Folder::m_list
ItemList m_list
Definition: SGFolder.h:102
test_pyathena.parent
parent
Definition: test_pyathena.py:15
SG::Folder::decodeItemList
void decodeItemList(Gaudi::Details::PropertyBase &)
Definition: SGFolder.h:91
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
grepfile.sep
sep
Definition: grepfile.py:38
SG::Folder::m_checkItems
BooleanProperty m_checkItems
property: check if item types are known to ClassIDSvc
Definition: SGFolder.h:104
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
SG::Folder::add
virtual StatusCode add(const std::string &typeName, const std::string &skey) override
add a data object identifier to the list.
Definition: SGFolder.cxx:79
item
Definition: ItemListSvc.h:43
SG::Folder::initialize
virtual StatusCode initialize() override
Definition: SGFolder.cxx:46
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
ReadCalibFromCool.typeName
typeName
Definition: ReadCalibFromCool.py:477
CxxUtils::atoi
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
Definition: Control/CxxUtils/Root/StringUtils.cxx:85
DefaultKey.h
SG::Folder::decodeItem
void decodeItem(const std::string &item, bool checkValidCLID)
Definition: SGFolder.cxx:57
SG::FolderItem
a Folder item (data object) is identified by the clid/key pair
Definition: SGFolderItem.h:24