ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_ClusterContainerCnv_p3.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// Athena
9#include "Identifier/Identifier.h"
17
18// Gaudi
19#include "GaudiKernel/Bootstrap.h"
20#include "GaudiKernel/ISvcLocator.h"
21#include "GaudiKernel/MsgStream.h"
22#include "GaudiKernel/Service.h"
23#include "GaudiKernel/StatusCode.h"
24
25void SCT_ClusterContainerCnv_p3::transToPers(const InDet::SCT_ClusterContainer* transCont, InDet::SCT_ClusterContainer_p3* persCont, MsgStream &log) {
26
27 // The transient model has a container holding collections and the
28 // collections hold channels.
29 //
30 // The persistent model flattens this so that the persistent
31 // container has two vectors:
32 // 1) all collections, and
33 // 2) all PRD
34 //
35 // The persistent collections, then only maintain indexes into the
36 // container's vector of all channels.
37 //
38 // So here we loop over all collection and add their channels
39 // to the container's vector, saving the indexes in the
40 // collection.
41
42 using TRANS = InDet::SCT_ClusterContainer;
43
44 // this is the id of the latest collection read in
45 // This starts from the base of the TRT identifiers
46 unsigned int idLast(0);
47
48 //
49
50 TRANS::const_iterator it_Coll = transCont->begin();
51 TRANS::const_iterator it_CollEnd = transCont->end();
52 unsigned int collIndex;
53 unsigned int chanBegin = 0;
54 unsigned int chanEnd = 0;
55
56 //to retrieve the SCT_ID helper
57 if(!m_isInitialized) {
58 if (this->initialize(log) != StatusCode::SUCCESS) {
59 log << MSG::FATAL << "Could not initialize SCT_ClusterContainerCnv_p2 " << endmsg;
60 }
61 }
62
64
65 persCont->m_collections.resize(transCont->numberOfCollections());
66
67 // to avoid the inside-loop resize
68 int totSize = 0;
69 //for ( ; it_Coll != it_CollEnd; it_Coll++) {
70 for ( it_Coll=transCont->begin(); it_Coll != it_CollEnd; ++it_Coll) {
71 const InDet::SCT_ClusterCollection& collection = (**it_Coll);
72 totSize+=collection.size();
73 }
74 persCont->m_rawdata.resize(totSize);
75 persCont->m_prdDeltaId.resize(totSize);
76
77 // if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " Preparing " << persCont->m_collections.size() << "Collections" << endmsg;
78 //for (collIndex = 0; it_Coll != it_CollEnd; ++collIndex, it_Coll++) {
79 for (collIndex = 0, it_Coll=transCont->begin(); it_Coll != it_CollEnd; ++collIndex, ++it_Coll) {
80 // Add in new collection
81 const InDet::SCT_ClusterCollection& collection = (**it_Coll);
82 chanBegin = chanEnd;
83 chanEnd += collection.size();
84 InDet::InDetPRD_Collection_p2& pcollection = persCont->m_collections[collIndex];
85 unsigned int deltaId = (collection.identifyHash()-idLast);
86
87 pcollection.m_hashId = deltaId;
88 idLast=collection.identifyHash();
89 pcollection.m_size = collection.size();
90 // Add in channels
91
92 for (unsigned int i = 0; i < collection.size(); ++i) {
93 InDet::SCT_Cluster_p3* pchan = &(persCont->m_rawdata[i + chanBegin]);
94 const InDet::SCT_Cluster* chan = dynamic_cast<const InDet::SCT_Cluster*>(collection[i]);
95 chanCnv.transToPers(chan, pchan, log);
96
97 persCont->m_prdDeltaId[i+chanBegin]=m_sctId->calc_offset(collection.identify(), chan->identify() );
98 }
99 }
100
101}
102
103void SCT_ClusterContainerCnv_p3::persToTrans(const InDet::SCT_ClusterContainer_p3* persCont, InDet::SCT_ClusterContainer* transCont, MsgStream &log)
104{
105 if(!m_isInitialized) {
106 if (this->initialize(log) != StatusCode::SUCCESS) {
107 log << MSG::FATAL << "Could not initialize SCT_ClusterContainerCnv_p3 from persToTrans" << endmsg;
108 }
109 }
110
111 // The transient model has a container holding collections and the
112 // collections hold channels.
113 //
114 // The persistent model flattens this so that the persistent
115 // container has two vectors:
116 // 1) all collections, and
117 // 2) all channels
118 //
119 // The persistent collections, then only maintain indexes into the
120 // container's vector of all channels.
121 //
122 // So here we loop over all collection and extract their channels
123 // from the vector.
124
125 const InDetDD::SiDetectorElementCollection* elements(nullptr);
127 try {
129 elements = sctDetEleHandle1.cptr();
130 } catch (const SG::ExcNoCondCont& e) {
131 log << MSG::DEBUG << m_SCTDetEleCollKey << " is not available - probably RUN4, trying "<<m_ITkStripDetEleCollKey<<" instead."<< endmsg;
132 // If the first key fails, try the second key
133 try {
135 elements = sctDetEleHandle2.cptr();
136 } catch (const SG::ExcNoCondCont& e) {
137 log << MSG::FATAL << "No valid SCT detector element collection keys available." << endmsg;
138 return;
139 }
140 }
141 }
142
143 InDet::SCT_ClusterCollection* coll = nullptr;
144
145 //SCT_ClusterCnv_p2 chanCnv;
146 SCT_ClusterCnv_p3 chanCnv(m_sctId);
147 unsigned int collBegin(0);
148 // this is the id of the latest collection read in
149 // This starts from the base of the TRT identifiers
150 unsigned int idLast(0);
151 // if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << " Reading " << persCont->m_collections.size() << "Collections" << endmsg;
152 for (unsigned int icoll = 0; icoll < persCont->m_collections.size(); ++icoll) {
153
154 // Create trans collection - in NOT owner of SCT_DriftCircle (SG::VIEW_ELEMENTS)
155 // IDet collection don't have the Ownership policy c'tor
156 const InDet::InDetPRD_Collection_p2& pcoll = persCont->m_collections[icoll];
157 idLast += pcoll.m_hashId;
158 // Identifier collID= Identifier(idLast);
159 IdentifierHash collIDHash=IdentifierHash((unsigned int) idLast);
160 Identifier collID = m_sctId->wafer_id(collIDHash);
161 coll = new InDet::SCT_ClusterCollection(collIDHash);
162 coll->setIdentifier(Identifier(collID));
163 unsigned int nchans = pcoll.m_size;
164 coll->resize(nchans);
165 const InDetDD::SiDetectorElement * de = (elements==nullptr ? nullptr : elements->getDetectorElement(collIDHash));
166 // Fill with channels:
167 // This is used to read the vector of errMat
168 // values and lenght of the value are specified in separate vectors
169 // if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << "Reading collection with " << nchans << "Channels " << endmsg;
170 for (unsigned int ichan = 0; ichan < nchans; ++ ichan) {
171 const InDet::SCT_Cluster_p3* pchan = &(persCont->m_rawdata[ichan + collBegin]);
172 //chan->m_clusId=Identifier(collID.get_compact()+persCont->m_prdDeltaId[ichan + collBegin]);
173 Identifier clusId=m_sctId->strip_id_offset(coll->identify() , persCont->m_prdDeltaId[ichan + collBegin]);
175 (chanCnv.createSCT_Cluster (pchan, clusId, de, log));
176
177 // chan->m_rdoList.resize(1);
178 // chan->m_rdoList[0]=chan->m_clusId;
179 //DC Bugfix: Set the idhash for this channel
180 chan->setHashAndIndex(collIDHash,ichan);
181 (*coll)[ichan] = chan;
182 }
183 collBegin += pcoll.m_size;
184
185 // register the PRD collection in IDC with hash - faster addCollection
186 StatusCode sc = transCont->addCollection(coll, collIDHash);
187 if (sc.isFailure()) {
188 throw std::runtime_error("Failed to add collection to ID Container");
189 }
190
191 }
192
193
194}
195
196
197
198//================================================================
199InDet::SCT_ClusterContainer* SCT_ClusterContainerCnv_p3::createTransient(const InDet::SCT_ClusterContainer_p3* persObj, MsgStream& log) {
200 // if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << "SCT_ClusterContainerCnv_p2::createTransient called " << endmsg;
201 if(!m_isInitialized) {
202 if (this->initialize(log) != StatusCode::SUCCESS) {
203 log << MSG::FATAL << "Could not initialize SCT_ClusterContainerCnv_p3 " << endmsg;
204 }
205 }
206 std::unique_ptr<InDet::SCT_ClusterContainer> trans(std::make_unique<InDet::SCT_ClusterContainer>(m_sctId->wafer_hash_max()));
207 persToTrans(persObj, trans.get(), log);
208 return(trans.release());
209}
210
211
213 // Do not initialize again:
214 m_isInitialized=true;
215
216 // Get Storegate, ID helpers, and so on
217 SmartIF<StoreGateSvc> detStore{Gaudi::svcLocator()->service("DetectorStore")};
218 CHECK( detStore.isValid() );
219
220 // Get the sct helper from the detector store
221 CHECK( detStore->retrieve(m_sctId, "SCT_ID") );
222
225
226 return StatusCode::SUCCESS;
227}
228
229// Methods for test/SCT_ClusterContainerCnv_p3_test.cxx
231 m_sctId = sct_id;
232}
233
234void SCT_ClusterContainerCnv_p3::setUseDetectorElement(const bool useDetectorElement) {
235 m_useDetectorElement = useDetectorElement;
236}
#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
This is an Identifier helper class for the SCT subdetector.
size_type size() const noexcept
This is a "hash" representation of an Identifier.
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
std::vector< InDet::SCT_Cluster_p3 > m_rawdata
std::vector< Identifier::diff_type > m_prdDeltaId
std::vector< InDet::InDetPRD_Collection_p2 > m_collections
void transToPers(const InDet::SCT_Cluster *, InDet::SCT_Cluster_p3 *, MsgStream &)
InDet::SCT_Cluster createSCT_Cluster(const InDet::SCT_Cluster_p3 *persObj, Identifier clusId, const InDetDD::SiDetectorElement *detEl, MsgStream &log)
virtual void transToPers(const InDet::SCT_ClusterContainer *transCont, InDet::SCT_ClusterContainer_p3 *persCont, MsgStream &log)
virtual InDet::SCT_ClusterContainer * createTransient(const InDet::SCT_ClusterContainer_p3 *persObj, MsgStream &log)
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_ITkStripDetEleCollKey
virtual void persToTrans(const InDet::SCT_ClusterContainer_p3 *persCont, InDet::SCT_ClusterContainer *transCont, MsgStream &log)
StatusCode initialize(MsgStream &log)
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
void setIdHelper(const SCT_ID *sct_id)
void setUseDetectorElement(const bool useDetectorElement)
This is an Identifier helper class for the SCT subdetector.
Definition SCT_ID.h:68
Exception — Can't retrieve CondCont from ReadCondHandle.
const_pointer_type cptr()
void initialize()