36 StringProperty containerPrefixProp(
"PoolContainerPrefix",
"CollectionTree");
37 StringProperty containerNameHintProp(
"TopLevelContainerName",
"");
38 StringProperty branchNameHintProp(
"SubLevelBranchName",
"<type>/<key>");
40 propertyServer->getProperty(&containerPrefixProp).ignore();
41 propertyServer->getProperty(&containerNameHintProp).ignore();
42 propertyServer->getProperty(&branchNameHintProp).ignore();
47 return StatusCode::SUCCESS;
59 return pool::POOL_StorageType.
type();
65 bool ownTokAddr =
false;
66 if (tokAddr ==
nullptr || tokAddr->
getToken() ==
nullptr) {
68 auto token = std::make_unique<Token>();
69 token->fromString(*(pAddr->par()));
70 GenericAddress* genAddr =
dynamic_cast<GenericAddress*
>(pAddr);
72 ATH_MSG_ERROR(
"Dynamic cast failed in AthenaPoolConverter::createObj");
74 return StatusCode::FAILURE;
80 const std::string contextStr =
std::format(
"[CTXT={:08X}]",
static_cast<int>(*(pAddr->ipar())));
81 std::strncpy(
text, contextStr.c_str(),
sizeof(
text) - 1);
90 std::string
key = pAddr->par()[1];
99 if (pObj ==
nullptr) {
103 delete tokAddr; tokAddr =
nullptr;
106 if (pObj ==
nullptr) {
107 return StatusCode::FAILURE;
109 return StatusCode::SUCCESS;
114 if (
proxy ==
nullptr) {
115 ATH_MSG_ERROR(
"AthenaPoolConverter CreateRep failed to cast DataProxy, key = " << pObj->name());
116 return StatusCode::FAILURE;
122 return StatusCode::FAILURE;
126 return StatusCode::FAILURE;
129 if (pAddr ==
nullptr) {
133 GenericAddress* gAddr =
dynamic_cast<GenericAddress*
>(pAddr);
134 if (gAddr !=
nullptr) {
138 return StatusCode::SUCCESS;
146 return StatusCode::FAILURE;
150 return StatusCode::FAILURE;
152 return StatusCode::SUCCESS;
156 return pool::POOL_StorageType.
type();
161 ::
Converter(storageType(), myCLID, pSvcLocator),
163 name ?
name :
"AthenaPoolConverter"),
164 m_detStore(
"DetectorStore",
name ?
name :
"AthenaPoolConverter"),
165 m_athenaPoolCnvSvc(pSvcLocator && pSvcLocator->existsService(
"AthenaPoolSharedIOCnvSvc") ?
"AthenaPoolSharedIOCnvSvc" :
"AthenaPoolCnvSvc",
name ?
name :
"AthenaPoolConverter"),
169 m_containerPrefix(
""),
170 m_containerNameHint(
""),
171 m_branchNameHint(
""),
172 m_dataObject(nullptr),
173 m_i_poolToken(nullptr) {
179 std::string::size_type pos1 =
output.find(
'[');
180 std::string outputConnectionSpec =
output.substr(0, pos1);
187 if( containerPrefix ==
"Default" ) {
191 std::string containerName;
194 std::size_t colonPos = containerPrefix.find(
':');
195 if (colonPos != std::string::npos) {
196 dhContainerPrefix = containerPrefix.substr(0, colonPos + 1) + dhContainerPrefix;
202 std::string containerFriendPostfix;
203 while (pos1 != std::string::npos) {
204 const std::string::size_type pos2 =
output.find(
'=', pos1);
205 const std::string thisKey =
output.substr(pos1 + 1, pos2 - pos1 - 1);
206 const std::string::size_type pos3 =
output.find(
']', pos2);
207 const std::string
value =
output.substr(pos2 + 1, pos3 - pos2 - 1);
208 if (thisKey ==
"OutputCollection") {
209 dhContainerPrefix = std::move(
value);
210 }
else if (thisKey ==
"PoolContainerPrefix") {
211 containerPrefix = std::move(
value);
212 }
else if (thisKey ==
"TopLevelContainerName") {
213 containerNameHint = std::move(
value);
214 }
else if (thisKey ==
"SubLevelBranchName") {
215 branchNameHint = std::move(
value);
216 }
else if (thisKey ==
"PoolContainerFriendPostfix") {
217 containerFriendPostfix = std::move(
value);
219 pos1 =
output.find(
'[', pos3);
223 if( tname.compare(0, 10,
"DataHeader") == 0 ) {
224 if( tname.compare(10, 4,
"Form") == 0 ) {
225 containerName = dhContainerPrefix +
"Form" +
"(" + tname +
")";
227 if (
key[
key.size() - 1] ==
'/') {
228 containerName = dhContainerPrefix +
"(" +
key + tname +
")";
230 containerName = dhContainerPrefix +
"(" + tname +
")";
235 else if (tname.compare(0, 13,
"AttributeList") == 0) {
237 if( pool::ROOTRNTUPLE_StorageType.exactMatch(tech) ) {
242 tech = pool::ROOTTREE_StorageType.
type();
248 const std::string typeTok =
"<type>", keyTok =
"<key>";
249 containerName = containerPrefix + containerFriendPostfix + containerNameHint;
250 if (!branchNameHint.empty()) {
251 containerName +=
"(" + branchNameHint +
")";
253 const std::size_t pos1 = containerName.find(typeTok);
254 if (pos1 != std::string::npos) {
255 containerName.replace(pos1, typeTok.size(), tname);
257 const std::size_t pos2 = containerName.find(keyTok);
258 if (pos2 != std::string::npos) {
260 containerName.replace(pos2, keyTok.size(), tname);
262 containerName.replace(pos2, keyTok.size(),
key);
281 ATH_MSG_DEBUG(
"AthenaPoolConverter cleanUp called for base class.");
282 return StatusCode::SUCCESS;