ATLAS Offline Software
Loading...
Searching...
No Matches
CscPrepDataContainerCnv_p1.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
9
14
15// Gaudi
16#include "GaudiKernel/ISvcLocator.h"
17#include "GaudiKernel/Bootstrap.h"
18#include "GaudiKernel/StatusCode.h"
19#include "GaudiKernel/Service.h"
20#include "GaudiKernel/MsgStream.h"
21
22// Athena
26
27
29 // Do not initialize again:
30 m_isInitialized=true;
31
32 // get DetectorStore service
33 SmartIF<StoreGateSvc> detStore{Gaudi::svcLocator()->service("DetectorStore")};
34 CHECK( detStore.isValid() );
35
36 // Get the CSC helper from the detector store
37 CHECK( detStore->retrieve(m_cscId) );
38
39 CHECK( m_eventCnvTool.retrieve() );
40
41 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << "Converter initialized." << endmsg;
42 return StatusCode::SUCCESS;
43}
45 const Trk::ITrkEventCnvTool* cnv_tool = m_eventCnvTool->getCnvTool(id);
46 if (!cnv_tool) return nullptr;
47 return dynamic_cast<const MuonGM::CscReadoutElement*>(cnv_tool->getDetectorElement(id));
48}
50{
51
52 // The transient model has a container holding collections and the
53 // collections hold channels.
54 //
55 // The persistent model flattens this so that the persistent
56 // container has two vectors:
57 // 1) all collections, and
58 // 2) all RDO
59 //
60 // The persistent collections, then only maintain indexes into the
61 // container's vector of all channels.
62 //
63 // So here we loop over all collection and add their channels
64 // to the container's vector, saving the indexes in the
65 // collection.
66
69
70 CscPrepDataCnv_p1 chanCnv;
71 TRANS::const_iterator it_Coll = transCont->begin();
72 TRANS::const_iterator it_CollEnd = transCont->end();
73 unsigned int collIndex = 0;
74 unsigned int chanBegin = 0;
75 unsigned int chanEnd = 0;
76 int numColl = transCont->numberOfCollections();
77
78
79 persCont->m_collections.resize(numColl);
80 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " Preparing " << persCont->m_collections.size() << "Collections" << endmsg;
81
82 for (collIndex = 0; it_Coll != it_CollEnd; ++collIndex, ++it_Coll) {
83 // Add in new collection
84 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " New collection" << endmsg;
85 const Muon::CscPrepDataCollection& collection = (**it_Coll);
86 chanBegin = chanEnd;
87 chanEnd += collection.size();
88 Muon::MuonPRD_Collection_p1& pcollection = persCont->m_collections[collIndex];
89 pcollection.m_id = collection.identify().get_identifier32().get_compact();
90 pcollection.m_hashId = (unsigned int) collection.identifyHash();
91 pcollection.m_begin = chanBegin;
92 pcollection.m_end = chanEnd;
93 // Add in channels
94 persCont->m_PRD.resize(chanEnd);
95 for (unsigned int i = 0; i < collection.size(); ++i) {
96 const Muon::CscPrepData* chan = collection[i];
97 persCont->m_PRD[i + chanBegin] = toPersistent((CONV**)nullptr, chan, log );
98 }
99 }
100 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " *** Writing CscPrepDataContainer ***" << endmsg;
101}
102
104{
105
106 // The transient model has a container holding collections and the
107 // collections hold channels.
108 //
109 // The persistent model flattens this so that the persistent
110 // container has two vectors:
111 // 1) all collections, and
112 // 2) all channels
113 //
114 // The persistent collections, then only maintain indexes into the
115 // container's vector of all channels.
116 //
117 // So here we loop over all collection and extract their channels
118 // from the vector.
119
120
121 Muon::CscPrepDataCollection* coll = nullptr;
122
123 CscPrepDataCnv_p1 chanCnv;
125 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " Reading " << persCont->m_collections.size() << "Collections" << endmsg;
126 for (unsigned int icoll = 0; icoll < persCont->m_collections.size(); ++icoll) {
127
128 // Create trans collection - is NOT owner of CscPrepData (SG::VIEW_ELEMENTS)
129 // IDet collection don't have the Ownership policy c'tor
130 const Muon::MuonPRD_Collection_p1& pcoll = persCont->m_collections[icoll];
131 Identifier collID(Identifier(pcoll.m_id));
132 IdentifierHash collIDHash(IdentifierHash(pcoll.m_hashId));
133 coll = new Muon::CscPrepDataCollection(collIDHash);
134 coll->setIdentifier(Identifier(pcoll.m_id));
135 unsigned int nchans = pcoll.m_end - pcoll.m_begin;
136 coll->resize(nchans);
137 // Fill with channels
138 for (unsigned int ichan = 0; ichan < nchans; ++ ichan) {
139 const TPObjRef pchan = persCont->m_PRD[ichan + pcoll.m_begin];
140 Muon::CscPrepData* chan = dynamic_cast<Muon::CscPrepData*>(createTransFromPStore((CONV**)nullptr, pchan, log ) );
141 if (!chan) {
142 log << MSG::ERROR << "AthenaPoolTPCnvIDCont::persToTrans: Cannot get CscPrepData!" << endmsg;
143 continue;
144 }
145 const MuonGM::CscReadoutElement * de = getReadOutElement(chan->identify());
146 chan->m_detEl = de;
147 (*coll)[ichan] = chan;
148 }
149
150 // register the rdo collection in IDC with hash - faster addCollection
151 StatusCode sc = transCont->addCollection(coll, collIDHash);
152 if (sc.isFailure()) {
153 throw std::runtime_error("Failed to add collection to ID Container");
154 }
155 if (log.level() <= MSG::DEBUG) {
156 log << MSG::DEBUG << "AthenaPoolTPCnvIDCont::persToTrans, collection, hash_id/coll id = " << (int) collIDHash << " / " <<
157 collID.get_compact() << ", added to Identifiable container." << endmsg;
158 }
159 }
160
161 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " *** Reading CscPrepDataContainer" << endmsg;
162}
163
164
165
166//================================================================
168{
169 if(!m_isInitialized) {
170 if (this->initialize(log) != StatusCode::SUCCESS) {
171 log << MSG::FATAL << "Could not initialize CscPrepDataContainerCnv_p1 " << endmsg;
172 return nullptr;
173 }
174 }
175 std::unique_ptr<Muon::CscPrepDataContainer> trans(new Muon::CscPrepDataContainer(m_cscId->module_hash_max()));
176 persToTrans(persObj, trans.get(), log);
177 return(trans.release());
178}
179
180
#define endmsg
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t sc
void resize(size_type sz)
size_type size() const noexcept
Common base class for all TP converters, specialized for a given transient type.
Definition TPConverter.h:37
CNV::Trans_t * createTransFromPStore(CNV **cnv, const TPObjRef &ref, MsgStream &log) const
TPObjRef toPersistent(CNV **cnv, const typename CNV::TransBase_t *transObj, MsgStream &log) const
const_iterator end() const
return const_iterator for end of container
virtual size_t numberOfCollections() const override final
return number of collections
virtual StatusCode addCollection(const T *coll, IdentifierHash hashId) override final
insert collection into container with id hash if IDC should not take ownership of collection,...
const_iterator begin() const
return const_iterator for first entry
value_type get_compact() const
Get the compact id.
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
ToolHandle< Trk::IEventCnvSuperTool > m_eventCnvTool
virtual Muon::CscPrepDataContainer * createTransient(const Muon::MuonPRD_Container_p1 *persObj, MsgStream &log)
virtual void transToPers(const TRANS *transCont, PERS *persCont, MsgStream &log)
virtual void persToTrans(const PERS *persCont, TRANS *transCont, MsgStream &log)
const MuonGM::CscReadoutElement * getReadOutElement(const Identifier &id) const
Class representing clusters from the CSC.
Definition CscPrepData.h:39
unsigned int m_end
End index into master collection.
unsigned int m_hashId
Hash Identifier of this collection (write this one as well, so we don't rely on the IdHelper for it)
unsigned int m_begin
Begin index into master collection.
unsigned int m_id
Identifier of this collection.
std::vector< Muon::MuonPRD_Collection_p1 > m_collections
std::vector< TPObjRef > m_PRD
virtual Identifier identify() const override final
virtual void setIdentifier(Identifier id)
virtual IdentifierHash identifyHash() const override final
This class is an object reference used in Athena persistent data model.
Definition TPObjRef.h:20
virtual const Trk::TrkDetElementBase * getDetectorElement(const Identifier &id, const IdentifierHash &idHash) const =0
Returns the detectorElement associated with this Identifier & Hash.
MuonPrepDataCollection< CscPrepData > CscPrepDataCollection
MuonPrepDataContainerT< CscPrepData > CscPrepDataContainer
void initialize()