ATLAS Offline Software
SCT_RDO_ContainerCnv.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "SCT_RDO_ContainerCnv.h"
6 
8 
9 #include <memory>
10 
11 #include <iostream>
12 
13 
14 //================================================================
15 namespace {
16 #ifdef SCT_DEBUG
17  std::string shortPrint(const SCT_RDO_Container* main_input_SCT, unsigned maxprint=25) {
18  std::ostringstream os;
19  if (main_input_SCT) {
20  for (unsigned i=0; i<maxprint; i++) {
21  const auto* p = main_input_SCT->indexFindPtr(i);
22  if (p != nullptr) {
23  os<<" "<< p->size();
24  }
25  else {
26  os<<" *";
27  }
28  }
29  }
30  else {
31  os<<" [SCT_RDO_Container==nullptr]";
32  }
33  return os.str();
34  }
35 #endif
36 }
37 
39  : SCT_RDO_ContainerCnvBase(svcloc, "SCT_RDO_ContainerCnv"),
40  m_converter_p0(),
41  m_storeGate(nullptr)
42 {}
43 
44 //================================================================
47  if (sc.isFailure()) {
48  ATH_MSG_FATAL("SCT_RDO_ContainerCnvBase::initialize() returned failure !");
49  return StatusCode::FAILURE;
50  }
51 
52  ATH_MSG_DEBUG("SCT_RDO_ContainerCnv::initialize()");
53 
54  // get StoreGate service. This is needed only for clients
55  // that register collections directly to the SG instead of adding
56  // them to the container.
57  sc = service("StoreGateSvc", m_storeGate);
58  if (sc.isFailure()) {
59  ATH_MSG_FATAL("StoreGate service not found !");
60  return StatusCode::FAILURE;
61  }
62 
63  // get DetectorStore service
64  StoreGateSvc* detStore(nullptr);
65  if (service("DetectorStore", detStore).isFailure()) {
66  ATH_MSG_FATAL("DetectorStore service not found !");
67  return StatusCode::FAILURE;
68  } else {
69  ATH_MSG_DEBUG("Found DetectorStore.");
70  }
71 
72  // Get the sct helper from the detector store
73  const SCT_ID* idhelper(nullptr);
74  if (detStore->retrieve(idhelper, "SCT_ID").isFailure()) {
75  ATH_MSG_FATAL("Could not get SCT_ID helper !");
76  return StatusCode::FAILURE;
77  } else {
78  ATH_MSG_DEBUG("Found the SCT_ID helper.");
79  }
80 
81  m_converter_p0.initialize(idhelper);
82  m_converter_TP1.initialize(idhelper);
87  m_converter_PERS.initialize(idhelper);
88 
89  // ATH_MSG_DEBUG("Converter initialized");
90 
91  return StatusCode::SUCCESS;
92 }
93 
94 //================================================================
96 
97 #ifdef SCT_DEBUG
98  ATH_MSG_DEBUG("createPersistent(): main converter. TRANS = "<<shortPrint(transCont));
99 #endif
100  // converter_num is a switch to determine which persistent type to use
101  // 1: if concrete type private data is equivalent to InDetRawData_p1
102  // 3: for cosmic/TB
103  //
104  unsigned int converter_num(1);
105  SCT_RDO_Container::const_iterator it_Coll = transCont->begin();
106  SCT_RDO_Container::const_iterator it_CollEnd = transCont->end();
107  // check one element of the container. The container can't be empty for this...
108  if (it_Coll != it_CollEnd) {
109  while (it_Coll != it_CollEnd && (*it_Coll)->size() == 0) ++it_Coll;
110  if (it_Coll != it_CollEnd) {
111  const SCT_RDORawData* test((**it_Coll)[0]);
112  if (dynamic_cast<const SCT1_RawData*>(test) != nullptr) {
113  //ATH_MSG_DEBUG("Found container with SCT1_RawData concrete type objects");
114  converter_num=1;
115  } else if (dynamic_cast<const SCT3_RawData*>(test) != nullptr) {
116  //ATH_MSG_DEBUG("Found container with SCT3_RawData concrete type objects");
117  converter_num=3;
118  } else {
119  ATH_MSG_FATAL("Converter not implemented for this concrete type ");
120  throw "Converter not implemented";
121  }
122  } else {
123  ATH_MSG_WARNING("Container has only empty collections. Using TP1 converter");
124  }
125  } else {
126  ATH_MSG_WARNING("Empty container. Using TP1 converter");
127  }
128  // Switch facility depending on the concrete data type of the contained objects
129  // Should do by getting the type_info of one of the contained objects
130  SCT_RDO_Container_PERS* persObj(nullptr);
131  if (converter_num == 1 || converter_num == 3) {
132  m_converter_PERS.setType(converter_num);
133  persObj = m_converter_PERS.createPersistent( transCont, msg() );
134  } else {
135  ATH_MSG_FATAL("This shouldn't happen!! ");
136  }
137 #ifdef SCT_DEBUG
138  ATH_MSG_DEBUG("Success");
139 #endif
140  return persObj;
141 }
142 
143 //================================================================
145 
146  static const pool::Guid p0_guid("B82A1D11-3F86-4F07-B380-B61BA2DAF3A9"); // with SCT1_RawData
147  static const pool::Guid TP1_guid("DA76970C-E019-43D2-B2F9-25660DCECD9D"); // for t/p separated version with InDetRawDataContainer_p1
148  static const pool::Guid SCT_TP1_guid("8E13963E-13E5-4D10-AA8B-73F00AFF8FA8"); // for t/p separated version with SCT_RawDataContainer_p1
149  static const pool::Guid SCT_TP2_guid("D1258125-2CBA-476E-8578-E09D54F477E1"); // for t/p separated version with SCT_RawDataContainer_p2
150  static const pool::Guid SCT_TP3_guid("5FBC8D4D-7B4D-433A-8487-0EA0C870CBDB"); // for t/p separated version with SCT_RawDataContainer_p3
151  static const pool::Guid SCT_TP4_guid("6C7540BE-E85C-4777-BC1C-A9FF11460F54"); // for t/p separated version with SCT_RawDataContainer_p4
152 
153 #ifdef SCT_DEBUG
154  ATH_MSG_DEBUG("createTransient(): main converter");
155 #endif
156  if ( compareClassGuid(SCT_TP4_guid) ) {
157 #ifdef SCT_DEBUG
158  ATH_MSG_DEBUG("createTransient(): New TP version - TP4 branch");
159 #endif
160 
161  std::unique_ptr< SCT_RawDataContainer_p4 > col_vect( poolReadObject< SCT_RawDataContainer_p4 >() );
163 #ifdef SCT_DEBUG
164  ATH_MSG_DEBUG("createTransient(), TP4 branch: returns TRANS = "<<shortPrint(res));
165 #endif
166  return res;
167 
168  }
169  else if ( compareClassGuid(SCT_TP3_guid) ) {
170 #ifdef SCT_DEBUG
171  ATH_MSG_DEBUG("createTransient(): New TP version - TP3 branch");
172 #endif
173 
174  std::unique_ptr< SCT_RawDataContainer_p3 > col_vect( poolReadObject< SCT_RawDataContainer_p3 >() );
176 #ifdef SCT_DEBUG
177  ATH_MSG_DEBUG("createTransient(), TP3 branch: returns TRANS = "<<shortPrint(res));
178 #endif
179  return res;
180 
181  }
182  else if ( compareClassGuid(SCT_TP2_guid) ) {
183 #ifdef SCT_DEBUG
184  ATH_MSG_DEBUG("createTransient(): New TP version - TP2 branch");
185 #endif
186 
187  std::unique_ptr< SCT_RawDataContainer_p2 > col_vect( poolReadObject< SCT_RawDataContainer_p2 >() );
189 #ifdef SCT_DEBUG
190  ATH_MSG_DEBUG("createTransient(), TP2 branch: returns TRANS = "<<shortPrint(res));
191 #endif
192  return res;
193 
194  }
195  else if ( compareClassGuid(SCT_TP1_guid) ) {
196 #ifdef SCT_DEBUG
197  ATH_MSG_DEBUG("createTransient(): New TP version - TP1 branch");
198 #endif
199  std::unique_ptr< SCT_RawDataContainer_p1 > col_vect( poolReadObject< SCT_RawDataContainer_p1 >() );
201 #ifdef SCT_DEBUG
202  ATH_MSG_DEBUG("createTransient(), TP1 branch: returns TRANS = "<<shortPrint(res));
203 #endif
204  return res;
205 
206 
207  }
208  else if ( compareClassGuid(TP1_guid) ) {
209  ATH_MSG_DEBUG("createTransient(): New TP version - TP1 branch");
210 
211  std::unique_ptr< InDetRawDataContainer_p1 > col_vect( poolReadObject< InDetRawDataContainer_p1 >() );
212  SCT_RDO_Container* res = m_converter_TP1.createTransient( col_vect.get(), msg() );
213 #ifdef SCT_DEBUG
214  ATH_MSG_DEBUG("createTransient(), TP1 branch: returns TRANS = "<<shortPrint(res));
215 #endif
216  return res;
217 
218 
219  }
220  else if ( compareClassGuid(p0_guid) ) {
221 #ifdef SCT_DEBUG
222  ATH_MSG_DEBUG("createTransient(): Old input file - p0 branch");
223 #endif
224  std::unique_ptr< SCT_RDO_Container_p0 > col_vect( poolReadObject< SCT_RDO_Container_p0 >() );
225  SCT_RDO_Container* res = m_converter_p0.createTransient( col_vect.get(), msg() );
226 #ifdef SCT_DEBUG
227  ATH_MSG_DEBUG("createTransient(), p0 branch: returns TRANS = "<<shortPrint(res));
228 #endif
229  return res;
230  }
231 
232  throw std::runtime_error("Unsupported persistent version of SCT_RDO_Container");
233 }
234 
235 //================================================================
SCT_RDO_ContainerCnv::m_storeGate
StoreGateSvc * m_storeGate
Definition: SCT_RDO_ContainerCnv.h:41
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
SCT_RDO_ContainerCnv::m_converter_SCT_TP1
SCT_RawDataContainerCnv_p1 m_converter_SCT_TP1
Definition: SCT_RDO_ContainerCnv.h:34
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
SCT_RDO_ContainerCnv::m_converter_SCT_TP2
SCT_RawDataContainerCnv_p2 m_converter_SCT_TP2
Definition: SCT_RDO_ContainerCnv.h:35
SCT1_RawDataContainerCnv_p1::createTransient
virtual SCT_RDO_Container * createTransient(const InDetRawDataContainer_p1 *persObj, MsgStream &log)
Definition: SCT1_RawDataContainerCnv_p1.cxx:122
SCT_RDO_ContainerCnv.h
SCT_RDO_ContainerCnv::SCT_RDO_ContainerCnv
SCT_RDO_ContainerCnv(ISvcLocator *svcloc)
Definition: SCT_RDO_ContainerCnv.cxx:38
SCT_RDORawData
Definition: SCT_RDORawData.h:24
TrigInDetValidation_Base.test
test
Definition: TrigInDetValidation_Base.py:144
InDetRawDataContainer
Definition: InDetRawDataContainer.h:27
TPAbstractPolyCnvBase::createPersistent
virtual PERS * createPersistent(const TRANS *transObj, MsgStream &log)
Create persistent representation of a transient object.
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
SCT_RawDataContainerCnv_p2::createTransient
virtual SCT_RDO_Container * createTransient(const SCT_RawDataContainer_p2 *persObj, MsgStream &log)
Definition: SCT_RawDataContainerCnv_p2.cxx:196
pool::Guid
::Guid Guid
Definition: T_AthenaPoolCustCnv.h:19
SCT_RDO_ContainerCnv::createPersistent
virtual SCT_RDO_Container_PERS * createPersistent(SCT_RDO_Container *transCont)
Definition: SCT_RDO_ContainerCnv.cxx:95
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
SCT_RawDataContainerCnv_p4::createTransient
virtual SCT_RDO_Container * createTransient(const SCT_RawDataContainer_p4 *persObj, MsgStream &log)
Definition: SCT_RawDataContainerCnv_p4.cxx:190
SCT_RDO_ContainerCnv::initialize
virtual StatusCode initialize()
Gaudi Service Interface method implementations:
Definition: SCT_RDO_ContainerCnv.cxx:45
T_AthenaPoolCustomCnv
Compatibility for old converter classes that don't get passed the key.
Definition: T_AthenaPoolCustomCnv.h:132
lumiFormat.i
int i
Definition: lumiFormat.py:92
SCT3_RawData
Definition: SCT3_RawData.h:24
SCT_RawDataContainerCnv_p1::initialize
void initialize(const SCT_ID *idhelper)
Definition: SCT_RawDataContainerCnv_p1.h:42
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
SCT_RDO_ContainerCnv::m_converter_PERS
SCT_RDO_ContainerCnv_PERS m_converter_PERS
Definition: SCT_RDO_ContainerCnv.h:38
res
std::pair< std::vector< unsigned int >, bool > res
Definition: JetGroupProductTest.cxx:14
SCT_RawDataContainerCnv_p3::createTransient
virtual SCT_RDO_Container * createTransient(const SCT_RawDataContainer_p3 *persObj, MsgStream &log)
Definition: SCT_RawDataContainerCnv_p3.cxx:194
IdentifiableContainerMT::end
const_iterator end() const
return const_iterator for end of container
Definition: IdentifiableContainerMT.h:242
SCT_RDO_ContainerCnv::m_converter_SCT_TP3
SCT_RawDataContainerCnv_p3 m_converter_SCT_TP3
Definition: SCT_RDO_ContainerCnv.h:36
IdentifiableContainerMT::const_iterator
Definition: IdentifiableContainerMT.h:82
IdentifiableContainerMT::begin
const_iterator begin() const
return const_iterator for first entry
Definition: IdentifiableContainerMT.h:236
SCT_RDO_ContainerCnv::createTransient
virtual SCT_RDO_Container * createTransient()
Definition: SCT_RDO_ContainerCnv.cxx:144
SCT_RDO_ContainerCnv::m_converter_p0
SCT_RDO_ContainerCnv_p0 m_converter_p0
Definition: SCT_RDO_ContainerCnv.h:32
SCT_RawDataContainerCnv_p1::createTransient
virtual SCT_RDO_Container * createTransient(const SCT_RawDataContainer_p1 *persObj, MsgStream &log)
Definition: SCT_RawDataContainerCnv_p1.cxx:147
ReadFromCoolCompare.os
os
Definition: ReadFromCoolCompare.py:231
AthMessaging::msg
MsgStream & msg() const
The standard message stream.
Definition: AthMessaging.h:164
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
SCT_RDO_ContainerCnv::m_converter_SCT_TP4
SCT_RawDataContainerCnv_p4 m_converter_SCT_TP4
Definition: SCT_RDO_ContainerCnv.h:37
SCT_RawDataContainer_p4
Persistent represenation of an SCT_RawDataContainer.
Definition: SCT_RawDataContainer_p4.h:24
SCT_RDO_ContainerCnv::m_converter_TP1
SCT1_RawDataContainerCnv_p1 m_converter_TP1
Definition: SCT_RDO_ContainerCnv.h:33
SCT_RawDataContainerCnv_p4::initialize
void initialize(const SCT_ID *idhelper)
Definition: SCT_RawDataContainerCnv_p4.h:43
IdentifiableContainerMT::indexFindPtr
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
Definition: IdentifiableContainerMT.h:292
SCT1_RawDataContainerCnv_p1::initialize
void initialize(const SCT_ID *idhelper)
Definition: SCT1_RawDataContainerCnv_p1.h:42
SCT_RDO_ContainerCnv_p0::createTransient
virtual SCT_RDO_Container * createTransient(const SCT_RDO_Container_p0 *persObj, MsgStream &log)
Definition: SCT_RDO_ContainerCnv_p0.cxx:14
SCT_RDO_ContainerCnv_p0::initialize
void initialize(const SCT_ID *idhelper)
Definition: SCT_RDO_ContainerCnv_p0.h:33
SCT_RawDataContainerCnv_p4::setType
void setType(int type)
Definition: SCT_RawDataContainerCnv_p4.h:44
SCT_ID
Definition: SCT_ID.h:68
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT1_RawData
Definition: SCT1_RawData.h:27
T_AthenaPoolCustCnv::compareClassGuid
virtual bool compareClassGuid(const Guid &clid) const
Compare POOL class GUID with the one of the object being read.
T_AthenaPoolCustCnv::initialize
virtual StatusCode initialize()
Gaudi Service Interface method implementations:
SCT_RawDataContainerCnv_p2::initialize
void initialize(const SCT_ID *idhelper)
Definition: SCT_RawDataContainerCnv_p2.h:43
SCT_RawDataContainerCnv_p3::initialize
void initialize(const SCT_ID *idhelper)
Definition: SCT_RawDataContainerCnv_p3.h:44