ATLAS Offline Software
Loading...
Searching...
No Matches
MdtPrepDataContainerCnv_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 helper from the detector store
37 CHECK( detStore->retrieve(m_MdtId) );
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::MdtReadoutElement*>(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 PRDs
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 MdtPrepDataCnv_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 // if(numColl == transCont->hashFunc().max() ) { // let's count how many collections we have:
78 // numColl = 0;
79 // for ( ; it_Coll != it_CollEnd; it_Coll++)
80 // numColl++;
81 // it_Coll = transCont->begin(); // reset the iterator, we used it!
82 // }
83 persCont->m_collections.resize(numColl);
84 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " Preparing " << persCont->m_collections.size() << "Collections" << endmsg;
85
86 for (collIndex = 0; it_Coll != it_CollEnd; ++collIndex, ++it_Coll) {
87 // Add in new collection
88 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " New collection" << endmsg;
89 const Muon::MdtPrepDataCollection& collection = (**it_Coll);
90 chanBegin = chanEnd;
91 chanEnd += collection.size();
92 Muon::MuonPRD_Collection_p1& pcollection = persCont->m_collections[collIndex];
93 pcollection.m_id = collection.identify().get_identifier32().get_compact();
94 pcollection.m_hashId = (unsigned int) collection.identifyHash();
95 pcollection.m_begin = chanBegin;
96 pcollection.m_end = chanEnd;
97 // Add in channels
98 persCont->m_PRD.resize(chanEnd);
99 for (unsigned int i = 0; i < collection.size(); ++i) {
100 const Muon::MdtPrepData* chan = collection[i];
101 persCont->m_PRD[i + chanBegin] = toPersistent((CONV**)nullptr, chan, log );
102 }
103 }
104 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " *** Writing MdtPrepDataContainer ***" << endmsg;
105}
106
108{
109
110 // The transient model has a container holding collections and the
111 // collections hold channels.
112 //
113 // The persistent model flattens this so that the persistent
114 // container has two vectors:
115 // 1) all collections, and
116 // 2) all channels
117 //
118 // The persistent collections, then only maintain indexes into the
119 // container's vector of all channels.
120 //
121 // So here we loop over all collection and extract their channels
122 // from the vector.
123
124
125 Muon::MdtPrepDataCollection* coll = nullptr;
126
127 MdtPrepDataCnv_p1 chanCnv;
129
130 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " Reading " << persCont->m_collections.size() << "Collections" << endmsg;
131 for (unsigned int icoll = 0; icoll < persCont->m_collections.size(); ++icoll) {
132
133 // Create trans collection - is NOT owner of MdtPrepData (SG::VIEW_ELEMENTS)
134 // IDet collection don't have the Ownership policy c'tor
135 const Muon::MuonPRD_Collection_p1& pcoll = persCont->m_collections[icoll];
136 Identifier collID(Identifier(pcoll.m_id));
137 IdentifierHash collIDHash(IdentifierHash(pcoll.m_hashId));
138 coll = new Muon::MdtPrepDataCollection(collIDHash);
139 coll->setIdentifier(Identifier(pcoll.m_id));
140 unsigned int nchans = pcoll.m_end - pcoll.m_begin;
141 coll->resize(nchans);
142// No hash based lookup for Mdts?
143 // Fill with channels
144 for (unsigned int ichan = 0; ichan < nchans; ++ ichan) {
145 const TPObjRef pchan = persCont->m_PRD[ichan + pcoll.m_begin];
146 Muon::MdtPrepData* chan = dynamic_cast<Muon::MdtPrepData*>(createTransFromPStore((CONV**)nullptr, pchan, log ) );
147 if (chan!=nullptr) {
148 const MuonGM::MdtReadoutElement * de = getReadOutElement(chan->identify());
149 chan->m_detEl = de;
150 (*coll)[ichan] = chan;
151 } else {
152 log<<MSG::WARNING<<"Dynamic cast or createTransFromPStore failed - channel missing"<<endmsg;
153 }
154 }
155
156 // register the rdo collection in IDC with hash - faster addCollection
157 StatusCode sc = transCont->addCollection(coll, collIDHash);
158 if (sc.isFailure()) {
159 throw std::runtime_error("Failed to add collection to ID Container");
160 }
161 if (log.level() <= MSG::DEBUG) {
162 log << MSG::DEBUG << "AthenaPoolTPCnvIDCont::persToTrans, collection, hash_id/coll id = " << (int) collIDHash << " / " <<
163 collID.get_compact() << ", added to Identifiable container." << endmsg;
164 }
165 }
166
167 if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " *** Reading MdtPrepDataContainer" << endmsg;
168}
169
170
171
172//================================================================
174{
175 if(!m_isInitialized) {
176 if (this->initialize(log) != StatusCode::SUCCESS) {
177 log << MSG::FATAL << "Could not initialize MdtPrepDataContainerCnv_p1 " << endmsg;
178 return nullptr;
179 }
180 }
181 std::unique_ptr<Muon::MdtPrepDataContainer> trans(new Muon::MdtPrepDataContainer(m_MdtId->module_hash_max()));
182 persToTrans(persObj, trans.get(), log);
183 return(trans.release());
184}
185
186
#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 void persToTrans(const PERS *persCont, TRANS *transCont, MsgStream &log)
virtual void transToPers(const TRANS *transCont, PERS *persCont, MsgStream &log)
virtual Muon::MdtPrepDataContainer * createTransient(const Muon::MuonPRD_Container_p1 *persObj, MsgStream &log)
const MuonGM::MdtReadoutElement * getReadOutElement(const Identifier &id) const
Class to represent measurements from the Monitored Drift Tubes.
Definition MdtPrepData.h:33
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.
MuonPrepDataContainerT< MdtPrepData > MdtPrepDataContainer
MuonPrepDataCollection< MdtPrepData > MdtPrepDataCollection
void initialize()