ATLAS Offline Software
Loading...
Searching...
No Matches
FPGAClusterConverter.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
4
9
12
16
18
19FPGAClusterConverter::FPGAClusterConverter(const std::string& type, const std::string& name, const IInterface* parent):
20 base_class(type, name, parent) {}
21
23
24 ATH_MSG_DEBUG("Initializing FPGAClusterConverter...");
25
26 // Get SCT & pixel Identifier helpers
27 ATH_CHECK(detStore()->retrieve(m_pixelId, "PixelID"));
28 ATH_CHECK(detStore()->retrieve(m_SCTId, "SCT_ID"));
29 ATH_CHECK(detStore()->retrieve(m_pixelManager));
30 ATH_CHECK(detStore()->retrieve(m_SCTManager));
33
34 ATH_CHECK( m_FPGAClusterKey.initialize() );
35
36 return StatusCode::SUCCESS;
37
38}
39
40// Functions converting collections of FPGATrackSim Hits or Clusters into InDet or xAOD cluster collections / containers
41
43 InDet::PixelClusterCollection& pixelColl,
44 InDet::SCT_ClusterCollection& SCTColl) const {
45 ATH_MSG_DEBUG("Found " << hits.size() << " FPGATrackSimHits [InDet]");
46 // reserve some memory
47 pixelColl.reserve(hits.size());
48 SCTColl.reserve(hits.size());
49 for(const FPGATrackSimHit* hit : hits) {
50 const FPGATrackSimHit & h = *hit;
51 std::vector<Identifier> rdoList{Identifier(h.getRdoIdentifier())};
52
53 std::unique_ptr<InDet::PixelCluster> pixelCl{};
54 std::unique_ptr<InDet::SCT_Cluster> SCTCl{};
55
56 if (h.isPixel()) {
57 ATH_CHECK(createPixelCluster(h, rdoList, pixelCl));
58 if (pixelCl) pixelColl.push_back(std::move(pixelCl));
59 }
60 if (h.isStrip()) {
61 ATH_CHECK(createSCTCluster(h, rdoList, SCTCl));
62 if (SCTCl) SCTColl.push_back(std::move(SCTCl));
63 }
64 }
65
66 ATH_MSG_DEBUG("pixelColl size: " << pixelColl.size() << " SCTColl size: " << SCTColl.size() );
67
68 return StatusCode::SUCCESS;
69}
70
71// To be used in Track conversion
72StatusCode FPGAClusterConverter::convertHits(const std::vector<const FPGATrackSimHit*>& hits,
73 InDet::PixelClusterCollection& pixelColl,
74 InDet::SCT_ClusterCollection& SCTColl) const {
75 ATH_MSG_DEBUG("Found " << hits.size() << " FPGATrackSimHits [InDet]");
76
77 // *** Match FPGATrackSimHit to FPGATrackSimCluster
79 if (!FPGAClustersHandle.isValid()) {
80 ATH_MSG_FATAL("Failed to retrieve FPGATrackSimClusterCollection");
81 return StatusCode::FAILURE;
82 }
83 const FPGATrackSimClusterCollection *FPGAClusterColl = FPGAClustersHandle.cptr();
84
85 for(const FPGATrackSimHit *h : hits){
86 IdentifierHash hash = h->getIdentifierHash();
88 for (const FPGATrackSimCluster& cluster: *FPGAClusterColl){
89 FPGATrackSimHit clusterEq = cluster.getClusterEquiv();
90 if (hash == clusterEq.getIdentifierHash()) {
91 cl = cluster;
92 break;
93 }
94 }
95 FPGATrackSimHit clEq = cl.getClusterEquiv();
96
97 // --- DEBUG
98 ATH_MSG_DEBUG("Hit identifier " << h->getIdentifierHash());
99 ATH_MSG_DEBUG("Cluster identifier " << clEq.getIdentifierHash());
100 // ---
101
102 // *** FPGATrackSimCluster matched
103
104 std::vector<Identifier> rdoList;
105 ATH_CHECK(getRdoList(rdoList,cl));
106
107 std::unique_ptr<InDet::PixelCluster> pixelCl{};
108 std::unique_ptr<InDet::SCT_Cluster> SCTCl{};
109
110 if (clEq.isPixel()) {
111 ATH_CHECK(createPixelCluster(clEq, rdoList, pixelCl));
112 if (pixelCl) pixelColl.push_back(std::move(pixelCl));
113 }
114 if (clEq.isStrip()) {
115 ATH_CHECK(createSCTCluster(clEq, rdoList, SCTCl));
116 if (SCTCl) SCTColl.push_back(std::move(SCTCl));
117 }
118
119 }
120
121 ATH_MSG_DEBUG("pixelColl size: " << pixelColl.size() << " SCTColl size: " << SCTColl.size());
122
123 return StatusCode::SUCCESS;
124
125}
126
127
130 xAOD::StripClusterContainer& SCTCont) const {
131 ATH_MSG_DEBUG("Found " << hits.size() << " FPGATrackSimHits [xAOD]");
132 // reserve some memory
133 pixelCont.reserve(hits.size());
134 SCTCont.reserve(hits.size());
135 for(const FPGATrackSimHit* hit : hits) {
136 const FPGATrackSimHit & h = *hit;
137 std::vector<Identifier> rdoList{Identifier(h.getIdentifier())};
138
139 if (h.isPixel()) {
140 xAOD::PixelCluster *xaod_pcl = new xAOD::PixelCluster();
141 pixelCont.push_back(xaod_pcl);
142 ATH_CHECK(createPixelCluster(h, rdoList, *xaod_pcl));
143 }
144 if (h.isStrip()) {
145 xAOD::StripCluster *xaod_scl = new xAOD::StripCluster();
146 SCTCont.push_back(xaod_scl);
147 ATH_CHECK(createSCTCluster(h, rdoList, *xaod_scl));
148 if(!xaod_scl->rdoList().size())
149 SCTCont.pop_back();
150 }
151 }
152
153 ATH_MSG_DEBUG("xAOD pixelCont size: " << pixelCont.size() << " xAOD pixelCont size: " << SCTCont.size());
154
155 return StatusCode::SUCCESS;
156}
157
158
159
160StatusCode FPGAClusterConverter::convertClusters(const std::vector<FPGATrackSimCluster>& clusters,
161 InDet::PixelClusterCollection& pixelColl,
162 InDet::SCT_ClusterCollection& SCTColl) const {
163 ATH_MSG_DEBUG("Found " << clusters.size() << " FPGATrackSimClusters [InDet]");
164 // reserve some memory
165 pixelColl.reserve(clusters.size());
166 SCTColl.reserve(clusters.size());
167 for(const FPGATrackSimCluster& cl : clusters) {
168
169 FPGATrackSimHit clEq = cl.getClusterEquiv();
170 std::vector<Identifier> rdoList;
171 ATH_CHECK(getRdoList(rdoList, cl));
172
173 std::unique_ptr<InDet::PixelCluster> pixelCl{};
174 std::unique_ptr<InDet::SCT_Cluster> SCTCl{};
175
176 if (clEq.isPixel()) {
177 ATH_CHECK(createPixelCluster(clEq, rdoList, pixelCl));
178 if (pixelCl) pixelColl.push_back(std::move(pixelCl));
179 }
180 if (clEq.isStrip()) {
181 ATH_CHECK(createSCTCluster(clEq, rdoList, SCTCl));
182 if (SCTCl) SCTColl.push_back(std::move(SCTCl));
183 }
184 }
185
186 ATH_MSG_DEBUG("pixelColl size: " << pixelColl.size() << " SCTColl size: " << SCTColl.size());
187
188 return StatusCode::SUCCESS;
189}
190
191StatusCode FPGAClusterConverter::convertClusters(const std::vector<FPGATrackSimCluster>& clusters,
193 xAOD::StripClusterContainer& SCTCont) const {
194 ATH_MSG_DEBUG("Found " << clusters.size() << " FPGATrackSimClusters [xAOD]");
195 // reserve some memory
196 pixelCont.reserve(clusters.size());
197 SCTCont.reserve(clusters.size());
198
199 for(const FPGATrackSimCluster& cl : clusters) {
200
201 FPGATrackSimHit clEq = cl.getClusterEquiv();
202
203 std::vector<Identifier> rdoList;
204 ATH_CHECK(getRdoList(rdoList, cl));
205
206 if (clEq.isPixel()) {
207 xAOD::PixelCluster *xaod_pcl = new xAOD::PixelCluster();
208 pixelCont.push_back(xaod_pcl);
209 ATH_CHECK(createPixelCluster(clEq, rdoList, *xaod_pcl));
210 }
211 if (clEq.isStrip()) {
212 xAOD::StripCluster *xaod_scl = new xAOD::StripCluster();
213 SCTCont.push_back(xaod_scl);
214 ATH_CHECK(createSCTCluster(clEq, rdoList, *xaod_scl));
215 }
216 }
217
218 ATH_MSG_DEBUG("xAOD pixelCont size: " << pixelCont.size() << " xAOD SCTCont size: " << SCTCont.size());
219
220 return StatusCode::SUCCESS;
221}
222
223StatusCode FPGAClusterConverter::convertSpacePoints(const std::vector<FPGATrackSimCluster>& fpgaSPs,
224 xAOD::SpacePointContainer& SPStripCont,
225 xAOD::SpacePointContainer& SPPixelCont,
226 xAOD::StripClusterContainer& stripClusterCont,
227 xAOD::PixelClusterContainer& pixelClusterCont) const {
228 ATH_MSG_INFO("Converting Pixel SPs");
229 SPPixelCont.reserve(pixelClusterCont.size());
230 ATH_CHECK(createPixelSPs(SPPixelCont, pixelClusterCont));
231
233 ATH_MSG_INFO("Converting Strip SPs");
234 SPStripCont.reserve(fpgaSPs.size());
235 for (const FPGATrackSimCluster& cl : fpgaSPs) {
236 xAOD::SpacePoint* xaod_sp = new xAOD::SpacePoint();
237 SPStripCont.push_back(xaod_sp);
238 ATH_CHECK(createSP(cl, *xaod_sp, stripClusterCont));
239 if (!xaod_sp->elementIdList().size()) SPStripCont.pop_back();
240 }
241 }
242
243 return StatusCode::SUCCESS;
244}
245
246StatusCode FPGAClusterConverter::createPixelCluster(const FPGATrackSimHit& h, const std::vector<Identifier>& rdoList, std::unique_ptr<InDet::PixelCluster>& cl) const {
247 ATH_MSG_DEBUG("\tCreate InDet::PixelCluster from FPGATrackSimHit");
248
249 IdentifierHash hash = h.getIdentifierHash();
250
251 float etaWidth = h.getEtaWidth();
252 float phiWidth = h.getPhiWidth();
253 int phiIndex = h.getPhiIndex();
254 int etaIndex = h.getEtaIndex();
255
256 const InDetDD::SiDetectorElement* pDE = m_pixelManager->getDetectorElement(hash);
257
258 if( !pDE ) {
259 ATH_MSG_ERROR("Detector Element doesn't exist " << hash);
260 return StatusCode::FAILURE;
261 }
262
263 // *** Get cell from id
264 Identifier wafer_id = m_pixelId->wafer_id(hash);
265 Identifier hit_id = m_pixelId->pixel_id(wafer_id, phiIndex, etaIndex);
266 InDetDD::SiCellId cell = pDE->cellIdFromIdentifier(hit_id);
267 if(!cell.isValid()) {
268 ATH_MSG_DEBUG("\t\tcell not valid");
269 return StatusCode::FAILURE;
270 }
271 const InDetDD::PixelModuleDesign* design (dynamic_cast<const InDetDD::PixelModuleDesign*>(&pDE->design()));
272
273 // **** Get InDet::SiWidth
274
275 int colMin = static_cast<int>(etaIndex-0.5*etaWidth);
276 int colMax = colMin+etaWidth;
277
278 int rowMin = static_cast<int>(phiIndex-0.5*phiWidth);
279 int rowMax = rowMin+phiWidth;
280
281 double etaW = design->widthFromColumnRange(colMin, colMax-1);
282 double phiW = design->widthFromRowRange(rowMin, rowMax-1);
283
284 InDet::SiWidth siWidth(Amg::Vector2D(phiWidth,etaWidth),Amg::Vector2D(phiW,etaW));
285
286 // **** Get SiLocalPosition from cell id and define Amg::Vector2D position
288 Amg::Vector2D localPos(silPos);
289
290 //TODO: understand if shift is needed
291 if (m_doShift) {
292 double shift = m_lorentzAngleToolPixel->getLorentzShift(hash,Gaudi::Hive::currentContext());
293 Amg::Vector2D localPosShift(localPos[Trk::locX]+shift,localPos[Trk::locY]);
294 localPos = localPosShift;
295 }
296
297 Amg::Vector3D globalPos = pDE->globalPosition(localPos);
298 ATH_MSG_DEBUG("\t\tLocal position: x=" << localPos.x() << " y=" << localPos.y() );
299 ATH_MSG_DEBUG("\t\tGlobal position: x=" << globalPos.x() << " y=" << globalPos.y() << " z=" << globalPos.z() );
300
301 Amg::MatrixX cov(2,2);
302 cov.setZero();
303
304 if (m_broadErrors) {
305 cov(0,0) = siWidth.phiR()*siWidth.phiR()/12;
306 cov(1,1) = siWidth.z()*siWidth.z()/12;
307 }
308 else {
309 cov(0,0) = siWidth.phiR()*siWidth.phiR()/(12*siWidth.colRow().x()*siWidth.colRow().x());
310 cov(1,1) = siWidth.z()*siWidth.z()/(12*siWidth.colRow().y()*siWidth.colRow().y());
311 }
312
313 float dummy_omegax = 0.5;
314 float dummy_omegay = 0.5;
315 bool split = false;
316 float splitProb1 = 0;
317 float splitProb2 = 0;
318
319 cl = std::make_unique<InDet::PixelCluster>(hit_id, localPos, std::vector<Identifier>(rdoList), siWidth, pDE, Amg::MatrixX(cov), dummy_omegax, dummy_omegay, split, splitProb1, splitProb2);
320
321 return StatusCode::SUCCESS;
322}
323
324StatusCode FPGAClusterConverter::createPixelCluster(const FPGATrackSimHit& h,const std::vector<Identifier>& rdoList, xAOD::PixelCluster &cl) const {
325 ATH_MSG_DEBUG("\tCreate xAOD::PixelCluster from FPGATrackSimHit");
326
327 IdentifierHash hash = h.getIdentifierHash();
328
329 const InDetDD::SiDetectorElement* pDE = m_pixelManager->getDetectorElement(hash);
330
331 if( !pDE ) {
332 ATH_MSG_ERROR("Detector Element doesn't exist " << hash);
333 return StatusCode::FAILURE;
334 }
335
336 // *** Get cell from id
337 Identifier wafer_id = m_pixelId->wafer_id(hash);
338 Identifier hit_id = m_pixelId->pixel_id(wafer_id, h.getPhiIndex(), h.getEtaIndex());
339 InDetDD::SiCellId cell = pDE->cellIdFromIdentifier(hit_id);
340 if(!cell.isValid()) {
341 ATH_MSG_DEBUG("\t\tcell not valid");
342 return StatusCode::FAILURE;
343 }
344 const InDetDD::PixelModuleDesign* design (dynamic_cast<const InDetDD::PixelModuleDesign*>(&pDE->design()));
345
346 // **** Get InDet::SiWidth
347 int rowmin = h.getMinPhiIndex();
348 int rowmax = h.getMaxPhiIndex();
349 int colmin = h.getMinEtaIndex();
350 int colmax = h.getMaxEtaIndex();
351
352 // Quick test to check that none of these 4 hit some number limits
353 // Check for uninitialized values (still at int min/max)
354 if (colmin == std::numeric_limits<int>::max() || colmax == std::numeric_limits<int>::min() ||
355 rowmin == std::numeric_limits<int>::max() || rowmax == std::numeric_limits<int>::min()) {
356 ATH_MSG_ERROR("Pixel cluster indices appear uninitialized: colmin=" << colmin << ", colmax=" << colmax
357 << ", rowmin=" << rowmin << ", rowmax=" << rowmax);
358 return StatusCode::FAILURE;
359 }
360 // Check for negative indices
361 if (colmin < 0 || colmax < 0 || rowmin < 0 || rowmax < 0) {
362 ATH_MSG_ERROR("Pixel cluster indices out of range: colmin=" << colmin << ", colmax=" << colmax
363 << ", rowmin=" << rowmin << ", rowmax=" << rowmax);
364 return StatusCode::FAILURE;
365 }
366 // Check for max < min
367 if (colmax < colmin || rowmax < rowmin) {
368 ATH_MSG_ERROR("Pixel cluster index max < min: colmin=" << colmin << ", colmax=" << colmax
369 << ", rowmin=" << rowmin << ", rowmax=" << rowmax);
370 return StatusCode::FAILURE;
371 }
372
373 double zWidth = design->widthFromColumnRange(colmin, colmax);
374 double phiRWidth = design->widthFromRowRange(rowmin, rowmax);
375
376 InDet::SiWidth siWidth(Amg::Vector2D(h.getPhiWidth(),h.getEtaWidth()), Amg::Vector2D(phiRWidth,zWidth));
377
378
379 // **** Get SiLocalPosition from cell id and define Amg::Vector2D position
381 Amg::Vector2D localPos(silPos);
382
384 // replace localPos with the one stored in the FPGATrackSimHit
385 localPos(0,0) = h.getPhiCoord();
386 localPos(1,0) = h.getEtaCoord();
387 }
388 //TODO: understand if shift is needed
389 if (m_doShift) {
390 double shift = m_lorentzAngleToolPixel->getLorentzShift(hash,Gaudi::Hive::currentContext());
391 Amg::Vector2D localPosShift(localPos[Trk::locX]+shift,localPos[Trk::locY]);
392 localPos = localPosShift;
393 }
394
395 ATH_MSG_DEBUG("\t\tLocal position: x=" << localPos.x() << " y=" << localPos.y() );
396
397 Amg::MatrixX cov(2,2);
398 cov.setZero();
399
400 if (m_broadErrors) {
401 cov(0,0) = siWidth.phiR()*siWidth.phiR()/12;
402 cov(1,1) = siWidth.z()*siWidth.z()/12;
403 }
404 else {
405 cov(0,0) = siWidth.phiR()*siWidth.phiR()/(12*siWidth.colRow().x()*siWidth.colRow().x());
406 cov(1,1) = siWidth.z()*siWidth.z()/(12*siWidth.colRow().y()*siWidth.colRow().y());
407 }
408
409 Eigen::Matrix<float,2,1> localPosition(localPos.x(), localPos.y());
410 Eigen::Matrix<float,2,2> localCovariance;
411 localCovariance.setZero();
412 localCovariance(0, 0) = cov(0, 0);
413 localCovariance(1, 1) = cov(1, 1);
414
415 Eigen::Matrix<float,3,1> globalPosition(h.getX(),h.getY(),h.getZ());
416 ATH_MSG_DEBUG("\t\tGlobal position: x=" << globalPosition.x() << " y=" << globalPosition.y() << " z=" << globalPosition.z() );
417
418 cl.setMeasurement<2>(hash, localPosition, localCovariance);
419 ATH_MSG_DEBUG("rdoIdentifier: " << h.getRdoIdentifier());
420 cl.setIdentifier( h.getRdoIdentifier() );
421 cl.setRDOlist(rdoList);
422 cl.globalPosition() = globalPosition;
423 cl.setChannelsInPhiEta(siWidth.colRow()[0], siWidth.colRow()[1]);
424 cl.setWidthInEta(static_cast<float>(siWidth.widthPhiRZ()[1]));
425 ATH_MSG_DEBUG("\t\txaod width in eta " << cl.widthInEta());
426
427 return StatusCode::SUCCESS;
428}
429
430StatusCode FPGAClusterConverter::createSCTCluster(const FPGATrackSimHit& h, const std::vector<Identifier>& rdoList, std::unique_ptr<InDet::SCT_Cluster>& cl) const {
431 ATH_MSG_DEBUG("\t Create InDet::SCTCluster from FPGATrackSimHit ");
432
433
434 IdentifierHash hash = h.getIdentifierHash();
435
436 float phiWidth = h.getPhiWidth();
437 int strip = static_cast<int>(h.getPhiIndex());
438 ATH_CHECK(strip >= 0);
439 const InDetDD::SiDetectorElement* pDE = m_SCTManager->getDetectorElement(hash);
440 ATH_CHECK(pDE != nullptr);
441
442
443 Identifier wafer_id = m_SCTId->wafer_id(hash);
444 Identifier strip_id = m_SCTId->strip_id(wafer_id, strip);
445 InDetDD::SiCellId cell = pDE->cellIdFromIdentifier(strip_id);
446 ATH_MSG_DEBUG("\t\tcell: " << cell);
447 ATH_MSG_DEBUG("\t\tstrip_id " << strip_id);
448 ATH_MSG_DEBUG("\t\tstrip: " << cell);
449 ATH_MSG_DEBUG("\t\tStrip from idHelper: " << m_SCTId->strip(strip_id) );
450
451 const InDetDD::SCT_ModuleSideDesign* design;
452 if (pDE->isBarrel()){
453 design = (static_cast<const InDetDD::SCT_ModuleSideDesign*>(&pDE->design()));
454 } else{
455 design = (static_cast<const InDetDD::StripStereoAnnulusDesign*>(&pDE->design()));
456 }
457
458 const int firstStrip = m_SCTId->strip(rdoList.front());
459 const int lastStrip = m_SCTId->strip(rdoList.back());
460 const int row = m_SCTId->row(rdoList.front());
461 const int firstStrip1D = design->strip1Dim (firstStrip, row );
462 const int lastStrip1D = design->strip1Dim( lastStrip, row );
463 const InDetDD::SiCellId cell1(firstStrip1D);
464 const InDetDD::SiCellId cell2(lastStrip1D);
465 const InDetDD::SiLocalPosition firstStripPos( pDE->rawLocalPositionOfCell(cell1 ));
466 const InDetDD::SiLocalPosition lastStripPos( pDE->rawLocalPositionOfCell(cell2) );
467 const InDetDD::SiLocalPosition centre( (firstStripPos+lastStripPos) * 0.5 );
468 const double width = design->stripPitch() * ( lastStrip - firstStrip + 1 );
469
470 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition> ends( design->endsOfStrip(centre) );
471 const double stripLength( std::abs(ends.first.xEta() - ends.second.xEta()) );
472
473 InDet::SiWidth siWidth(Amg::Vector2D(phiWidth,1), Amg::Vector2D(width,stripLength) ); //TODO: ok??
474 Amg::Vector2D localPos(centre.xPhi(), centre.xEta());
475
476 ATH_MSG_DEBUG("\t\tcentre eta: " << centre.xEta() << " phi: " << centre.xPhi());
477 ATH_MSG_DEBUG("\t\tStrip length: " << stripLength );
478 ATH_MSG_DEBUG("\t\tlocal position before shift: " << localPos.x() << " phi: " << localPos.y());
479 if (m_doShift) {
480 double shift = m_lorentzAngleToolStrip->getLorentzShift(hash,Gaudi::Hive::currentContext());
481 Amg::Vector2D localPosShift(localPos[Trk::locX]+shift,localPos[Trk::locY]);
482 localPos = localPosShift;
483 }
484
485 Amg::Vector3D globalPos = pDE->globalPosition(localPos);
486 ATH_MSG_DEBUG("\t\tLocal position: x=" << localPos.x() << " y=" << localPos.y() );
487 ATH_MSG_DEBUG("\t\tGlobal position: x=" << globalPos.x() << " y=" << globalPos.y() << " z=" << globalPos.z() );
488
489 // Fill cov matrix. TODO: compare with https://gitlab.cern.ch/atlas/athena/-/blob/main/InnerDetector/InDetRecTools/SiClusterizationTool/src/ClusterMakerTool.cxx and xAOD function
490 const double col_x = siWidth.colRow().x();
491 const double col_y = siWidth.colRow().y();
492
493 double scale_factor = 1.;
494 if ( std::abs(col_x-1) < std::numeric_limits<double>::epsilon() )
495 scale_factor = 1.05;
496 else if ( std::abs(col_x-2) < std::numeric_limits<double>::epsilon() )
497 scale_factor = 0.27;
498
499 auto cov = Amg::MatrixX(2,2);
500 cov.setIdentity();
501 cov.fillSymmetric(0, 0, scale_factor * scale_factor * siWidth.phiR() * siWidth.phiR() * (1./12.));
502 cov.fillSymmetric(1, 1, siWidth.z() * siWidth.z() / col_y / col_y * (1./12.));
503
504 // rotation for endcap SCT
505 if(pDE->design().shape() == InDetDD::Trapezoid || pDE->design().shape() == InDetDD::Annulus) {
506 double sn = pDE->sinStereoLocal(localPos);
507 double sn2 = sn*sn;
508 double cs2 = 1.-sn2;
509 double w = pDE->phiPitch(localPos)/pDE->phiPitch();
510 double v0 = (cov)(0,0)*w*w;
511 double v1 = (cov)(1,1);
512 cov.fillSymmetric( 0, 0, cs2 * v0 + sn2 * v1 );
513 cov.fillSymmetric( 0, 1, sn * std::sqrt(cs2) * (v0 - v1) );
514 cov.fillSymmetric( 1, 1, sn2 * v0 + cs2 * v1 );
515 }
516
517 cl = std::make_unique<InDet::SCT_Cluster>(strip_id, localPos, std::vector<Identifier>(rdoList), siWidth, pDE, Amg::MatrixX(cov));
518
519 return StatusCode::SUCCESS;
520}
521
522StatusCode FPGAClusterConverter::createSCTCluster(const FPGATrackSimHit& h, const std::vector<Identifier>& rdoList, xAOD::StripCluster& cl) const {
523 ATH_MSG_DEBUG("\t Create xAOD::StripCluster from FPGATrackSimHit ");
524 //https://gitlab.cern.ch/atlas/athena/-/blob/main/InnerDetector/InDetRecTools/SiClusterizationTool/src/SCT_ClusteringTool.cxx
525
526 IdentifierHash hash = h.getIdentifierHash();
527
528 float phiWidth = h.getPhiWidth();
529 int strip = static_cast<int>(h.getPhiIndex());
530 ATH_CHECK(strip >= 0);
531 const InDetDD::SiDetectorElement* sDE = m_SCTManager->getDetectorElement(hash);
532 ATH_CHECK(sDE != nullptr);
533
534 Identifier wafer_id = m_SCTId->wafer_id(hash);
535 Identifier strip_id = m_SCTId->strip_id(wafer_id, strip);
536 InDetDD::SiCellId cell = sDE->cellIdFromIdentifier(strip_id);
537 ATH_MSG_DEBUG("\t\tcell: " << cell);
538 ATH_MSG_DEBUG("\t\tstrip_id " << strip_id);
539 ATH_MSG_DEBUG("\t\tstrip: " << cell);
540 ATH_MSG_DEBUG("\t\tStrip from idHelper: " << m_SCTId->strip(strip_id) );
541
542 const InDetDD::SCT_ModuleSideDesign* design;
543 if (sDE->isBarrel()){
544 design = (static_cast<const InDetDD::SCT_ModuleSideDesign*>(&sDE->design()));
545 } else{
546 design = (static_cast<const InDetDD::StripStereoAnnulusDesign*>(&sDE->design()));
547 }
548
549 const int firstStrip = m_SCTId->strip(rdoList.front());
550 const int lastStrip = m_SCTId->strip(rdoList.back());
551 const int row = m_SCTId->row(rdoList.front());
552 const int firstStrip1D = design->strip1Dim (firstStrip, row);
553 const int lastStrip1D = design->strip1Dim(lastStrip, row);
554 const InDetDD::SiCellId cell1(firstStrip1D);
555 const InDetDD::SiCellId cell2(lastStrip1D);
556 if (cell2 != design->cellIdInRange(cell2) || cell1 != design->cellIdInRange(cell1)) { // this seems to solve EFTRACK-743
557 ATH_MSG_WARNING("Cell ID out of range. Skip making this Strip cluster");
558 return StatusCode::SUCCESS;
559 }
560 const InDetDD::SiLocalPosition firstStripPos( sDE->rawLocalPositionOfCell(cell1 ));
561 const InDetDD::SiLocalPosition lastStripPos( sDE->rawLocalPositionOfCell(cell2) );
562 const InDetDD::SiLocalPosition centre( (firstStripPos+lastStripPos) * 0.5 );
563 const double width = design->stripPitch() * ( lastStrip - firstStrip + 1 );
564
565 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition> ends( design->endsOfStrip(centre) );
566 const double stripLength( std::abs(ends.first.xEta() - ends.second.xEta()) );
567
568 InDet::SiWidth siWidth(Amg::Vector2D(phiWidth,1), Amg::Vector2D(width,stripLength) ); //TODO: ok??
569 Amg::Vector2D localPos(centre.xPhi(), centre.xEta());
571 // replace localPos with the one stored in the FPGATrackSimHit
572 localPos(0,0) = h.getPhiCoord();
573 }
574 ATH_MSG_DEBUG("\t\tcentre eta: " << centre.xEta() << " phi: " << centre.xPhi());
575 ATH_MSG_DEBUG("\t\tStrip length: " << stripLength );
576 ATH_MSG_DEBUG("\t\tlocal position before shift: " << localPos.x() << " phi: " << localPos.y());
577
578 if (m_doShift) {
579 double shift = m_lorentzAngleToolStrip->getLorentzShift(hash,Gaudi::Hive::currentContext());
580 Amg::Vector2D localPosShift(localPos[Trk::locX]+shift,localPos[Trk::locY]);
581 localPos = localPosShift;
582 }
583
584 ATH_MSG_DEBUG("\t\tLocal position: x=" << localPos.x() << " y=" << localPos.y() );
585
586 /* TODO */
587 Eigen::Matrix<float,1,1> localPosition;
588 Eigen::Matrix<float,1,1> localCovariance;
589 localCovariance.setZero();
590
591 if (sDE->isBarrel()) {
592 localPosition(0, 0) = localPos.x();
593 localCovariance(0, 0) = sDE->phiPitch() * sDE->phiPitch() * (1. / 12.);
594 }
595 else {
596 InDetDD::SiCellId cellId = sDE->cellIdOfPosition(localPos);
597 const InDetDD::StripStereoAnnulusDesign* designNew = dynamic_cast<const InDetDD::StripStereoAnnulusDesign*>(&sDE->design());
598
599 if (!cellId.isValid() || cellId != designNew->cellIdInRange(cellId)) {
600 std::ostringstream msg;
601 msg << "Original cellId: " << cellId << " (strip=" << cellId.strip() << ")\n";
602 msg << "Cell ID invalid or out of range. Resetting to the closest cell of the active area.\n";
603 const InDetDD::SiCellId minCell = InDetDD::SiCellId(0); // get the first cell of the module
604 const Amg::Vector2D localPosMin = sDE->rawLocalPositionOfCell(minCell); // get raw local coordinates in Vector2D of the first cell
605 const InDetDD::SiCellId maxCell = InDetDD::SiCellId(designNew->cells() - 1); // get the last cell of the module
606 const Amg::Vector2D localPosMax = sDE->rawLocalPositionOfCell(maxCell); // get raw local coordinates in Vector2D of the last cell
607 msg << "Active area boundaries [eta,phi]: min [" << localPosMin.x() << ", " << localPosMin.y() << "] , " <<
608 "max [" << localPosMax.x() << ", " << localPosMax.y() << "]\n";
609 msg << "Compared to localPos of invalid cell: [" << localPos.x() << ", " << localPos.y() << "]\n";
610
611 // find the closest cell of the active area and assign it to cellId
612 // this ignores the Lorentz corrections but re-positions the cluster within the active area
613 if (std::abs(localPos[Trk::locR] - localPosMin[Trk::locR]) < std::abs(localPos[Trk::locR] - localPosMax[Trk::locR])) {
614 // this check should suffice instead of something like the following:
615 // (std::sqrt(std::pow(localPos.x() - localPosMin.x(), 2) + std::pow(localPos.y() - localPosMin.y(), 2)) <
616 // std::sqrt(std::pow(localPos.x() - localPosMax.x(), 2) + std::pow(localPos.y() - localPosMax.y(), 2)))
617 msg << " \\___ resetting to minCell [" << localPosMin.x() << ", " << localPosMin.y() << "]";
618 cellId = minCell;
619 } else {
620 msg << " \\___ resetting to maxCell [" << localPosMax.x() << ", " << localPosMax.y() << "]";
621 cellId = maxCell;
622 }
623 ATH_MSG_WARNING(msg.str());
624 }
625 InDetDD::SiLocalPosition localInPolar = designNew->localPositionOfCellPC(cellId);
626 localPosition(0, 0) = localInPolar.xPhi();
627 localCovariance(0, 0) = designNew->phiPitchPhi() * designNew->phiPitchPhi() * (1./12.);
628 }
629
630 Eigen::Matrix<float,3,1> globalPosition(h.getX(),h.getY(),h.getZ());
631 ATH_MSG_DEBUG("\t\tGlobal position: x=" << globalPosition.x() << " y=" << globalPosition.y() << " z=" << globalPosition.z() );
632
633 cl.setMeasurement<1>(hash, localPosition, localCovariance);
634 cl.setIdentifier( h.getRdoIdentifier() );
635 cl.setRDOlist(rdoList);
636 cl.globalPosition() = globalPosition;
637 cl.setChannelsInPhi(siWidth.colRow()[0]);
638
639 return StatusCode::SUCCESS;
640}
641
642StatusCode FPGAClusterConverter::createPixelCluster(const FPGATrackSimCluster& cluster, std::unique_ptr<InDet::PixelCluster>& cl) const {
643 ATH_MSG_DEBUG("\t Create InDet::PixelCluster from FPGATrackSimCluster");
644 FPGATrackSimHit clEq = cluster.getClusterEquiv();
645 std::vector<Identifier> rdoList;
646 ATH_CHECK(getRdoList(rdoList, cluster));
647 ATH_CHECK(createPixelCluster(clEq, rdoList, cl));
648 return StatusCode::SUCCESS;
649}
650
652 ATH_MSG_DEBUG("\t Create xAOD::PixelCluster from FPGATrackSimCluster");
653 FPGATrackSimHit clEq = cluster.getClusterEquiv();
654 std::vector<Identifier> rdoList;
655 ATH_CHECK(getRdoList(rdoList, cluster));
656 ATH_CHECK(createPixelCluster(clEq, rdoList, cl));
657 return StatusCode::SUCCESS;
658}
659
660StatusCode FPGAClusterConverter::createSCTCluster(const FPGATrackSimCluster& cluster, std::unique_ptr<InDet::SCT_Cluster>& cl) const {
661 ATH_MSG_DEBUG("\t Create InDet::SCT_Cluster from FPGATrackSimCluster");
662 FPGATrackSimHit clEq = cluster.getClusterEquiv();
663 std::vector<Identifier> rdoList;
664 ATH_CHECK(getRdoList(rdoList, cluster));
665 ATH_CHECK(createSCTCluster(clEq, rdoList,cl));
666 return StatusCode::SUCCESS;
667}
668
670 ATH_MSG_DEBUG("\t Create xAOD::StripCluster from FPGATrackSimCluster");
671 FPGATrackSimHit clEq = cluster.getClusterEquiv();
672 std::vector<Identifier> rdoList;
673 ATH_CHECK(getRdoList(rdoList, cluster));
674 ATH_CHECK(createSCTCluster(clEq, rdoList, cl));
675 return StatusCode::SUCCESS;
676}
677
678
680
681 for (const xAOD::PixelCluster* p_cl : clustersCont)
682 {
683 pixelSPs.emplace_back(new xAOD::SpacePoint);
684
685 // Global position
686 Eigen::Matrix<float, 3, 1> globalPos(p_cl->globalPosition().x(), p_cl->globalPosition().y(), p_cl->globalPosition().z());
687
688 // Covariance
689 // TODO: check if we need to scale covariance based on rotation matrix like in PixelSpacePointFormationTool.cxx
690 const float cov_r = p_cl->localCovariance<2>()(0,0);
691 const float cov_z = p_cl->localCovariance<2>()(1,0);
692
693 pixelSPs.back()->setSpacePoint(
694 p_cl->identifierHash(),
695 globalPos,
696 cov_r,
697 cov_z,
698 std::vector< const xAOD::UncalibratedMeasurement* >({ p_cl }) // measurement list
699 );
700 }
701
702 return StatusCode::SUCCESS;
703}
704
705
707
708 const FPGATrackSimHit& clEq = cl.getClusterEquiv();
709
710 const IdentifierHash& hash = clEq.getIdentifierHash();
711
712 // Global position and covariance
713
714 Eigen::Matrix<float,3,1> globalPos(clEq.getX(),clEq.getY(),clEq.getZ());
715
716 // Covariance
717 // TODO: update to ITk? Can it be done as for pixel? (L728-729)?
718 // Lines taken from SCT_SpacePoint::setupLocalCovarianceSCT()
719 float deltaY = 0.0004; // roughly pitch of SCT (80 mu) / sqrt(12)
720 float covTerm = 1600.*deltaY;
721 Eigen::Matrix<float, 2, 1> variance(0.1, 8.*covTerm);
722 const InDetDD::SiDetectorElement* element = m_SCTManager->getDetectorElement(hash);
723 // Swap r/z covariance terms for endcap clusters
724 if ( element->isEndcap() )
725 std::swap( variance(0, 0), variance(1, 0) );
726 float cov_r = variance(0,0);
727 float cov_z = variance(1,0);
728
729 // ***** Get Strips related infos *****
730
731 // idHashes and measurements
732 std::vector<unsigned int> idHashList;
733 std::vector<const xAOD::UncalibratedMeasurement_v1*> measurements;
734
735 //Get measurements
736
737 float topHalfStripLength, bottomHalfStripLength;
738 Amg::Vector3D topStripDirection;
739 Amg::Vector3D bottomStripDirection;
740 Amg::Vector3D stripCenter1;
741 Amg::Vector3D stripCenter2;
742 int index = 0;
743 for (const FPGATrackSimHit& h : cl.getHitList()) {
744 idHashList.push_back(h.getIdentifierHash());
745 for (auto orig_cl : clustersCont) {
746 if (h.getIdentifierHash()==orig_cl->identifierHash()) {
747 if (index == 0) {ATH_CHECK(getStripsInfo(*orig_cl, topHalfStripLength, topStripDirection, stripCenter1));}
748 if (index == 1) {ATH_CHECK(getStripsInfo(*orig_cl, bottomHalfStripLength, bottomStripDirection, stripCenter2));}
749 measurements.push_back(orig_cl);
750 index++;
751 }
752 }
753 }
754
755 Amg::Vector3D topStripCenter = stripCenter1;
756 Amg::Vector3D stripCenterDistance = stripCenter1 - stripCenter2;
757
758 ATH_MSG_DEBUG("topHalfStripLength = " << topHalfStripLength << " bottomHalfStripLength = " << bottomHalfStripLength);
759 ATH_MSG_DEBUG("topStripDirection = (" << topStripDirection.x() <<", " << topStripDirection.y() <<", " << topStripDirection.z() <<") " << "bottomStripDirection = (" << bottomStripDirection.x() <<", " << bottomStripDirection.y() <<", " << bottomStripDirection.z() <<") " );
760 ATH_MSG_DEBUG("stripCenterDistance = (" << stripCenterDistance.x() <<", " << stripCenterDistance.y() <<", " << stripCenterDistance.z() << ")" );
761 ATH_MSG_DEBUG("topStripCenter = (" << topStripCenter.x() <<", " << topStripCenter.y() <<", " << topStripCenter.z() << ")" );
762
763 // Fill xAOD::SpacePoint
764 sp.setSpacePoint(
765 std::move(idHashList),
766 globalPos,
767 cov_r,
768 cov_z,
769 std::move(measurements),
770 topHalfStripLength,
771 bottomHalfStripLength,
772 topStripDirection.cast<float>(),
773 bottomStripDirection.cast<float>(),
774 stripCenterDistance.cast<float>(),
775 topStripCenter.cast<float>()
776 );
777
778 return StatusCode::SUCCESS;
779}
780
781StatusCode FPGAClusterConverter::getRdoList(std::vector<Identifier> &rdoList, const FPGATrackSimCluster& cluster) const {
782
783 std::vector<FPGATrackSimHit> hits = cluster.getHitList();
784
785 for (const FPGATrackSimHit& h : hits) {
786 rdoList.emplace_back(h.getRdoIdentifier());
787 }
788
789 return StatusCode::SUCCESS;
790
791}
792
793
794StatusCode FPGAClusterConverter::getStripsInfo(const xAOD::StripCluster& cl, float& halfStripLength, Amg::Vector3D& stripDirection, Amg::Vector3D& stripCenter) const {
795
796 const int &strip = m_SCTId->strip(Identifier(cl.rdoList().front()));
797 const IdentifierHash &hash = cl.identifierHash();
798
799 const InDetDD::SiDetectorElement* sDE = m_SCTManager->getDetectorElement(hash);
800
801 const Identifier &wafer_id = m_SCTId->wafer_id(hash);
802 const Identifier &strip_id = m_SCTId->strip_id(wafer_id, strip);
803 const InDetDD::SiCellId & cell = sDE->cellIdFromIdentifier(strip_id);
804
805 const InDetDD::SiLocalPosition localPos( sDE->rawLocalPositionOfCell(cell ));
806 std::pair<Amg::Vector3D, Amg::Vector3D> end = (sDE->endsOfStrip(localPos));
807 stripCenter = 0.5 * (end.first + end.second);
808 Amg::Vector3D stripDir = end.first - end.second;
809
810 halfStripLength = 0.5 * stripDir.norm();
811 stripDirection = stripDir / (2. * (halfStripLength));
812
813 return StatusCode::SUCCESS;
814}
815
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
std::vector< FPGATrackSimCluster > FPGATrackSimClusterCollection
DataVector< FPGATrackSimHit > FPGATrackSimHitCollection
bool hit(const Container &ids, int pdgId)
static Double_t sp
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
const double width
#define maxCell
#define y
#define x
Header file for AthHistogramAlgorithm.
const T * back() const
Access the last element in the collection as an rvalue.
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type emplace_back(value_type pElem)
Add an element to the end of the collection.
void pop_back()
Remove the last element from the collection.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual StatusCode createPixelCluster(const FPGATrackSimHit &h, const std::vector< Identifier > &rdoList, std::unique_ptr< InDet::PixelCluster > &) const override final
SG::ReadHandleKey< FPGATrackSimClusterCollection > m_FPGAClusterKey
const InDetDD::PixelDetectorManager * m_pixelManager
Gaudi::Property< bool > m_broadErrors
virtual StatusCode getRdoList(std::vector< Identifier > &rdoList, const FPGATrackSimCluster &cluster) const override final
FPGAClusterConverter(const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode createSCTCluster(const FPGATrackSimHit &h, const std::vector< Identifier > &rdoList, std::unique_ptr< InDet::SCT_Cluster > &) const override final
Gaudi::Property< bool > m_skipStripSpacePointFormation
virtual StatusCode createSP(const FPGATrackSimCluster &cl, xAOD::SpacePoint &sp, xAOD::StripClusterContainer &clustersCont) const override final
virtual StatusCode createPixelSPs(xAOD::SpacePointContainer &pixelSPs, xAOD::PixelClusterContainer &clustersCont) const override final
virtual StatusCode initialize() override final
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleToolPixel
virtual StatusCode convertHits(const FPGATrackSimHitCollection &, InDet::PixelClusterCollection &, InDet::SCT_ClusterCollection &) const override final
Gaudi::Property< bool > m_doShift
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleToolStrip
Gaudi::Property< bool > m_useInherentLocalCoordinates
const InDetDD::SCT_DetectorManager * m_SCTManager
virtual StatusCode convertSpacePoints(const std::vector< FPGATrackSimCluster > &fpgaSPs, xAOD::SpacePointContainer &SPStripCont, xAOD::SpacePointContainer &SPPixelCont, xAOD::StripClusterContainer &stripClusterCont, xAOD::PixelClusterContainer &pixelClusterCont) const override final
virtual StatusCode convertClusters(const std::vector< FPGATrackSimCluster > &, InDet::PixelClusterCollection &, InDet::SCT_ClusterCollection &) const override final
virtual StatusCode getStripsInfo(const xAOD::StripCluster &cl, float &halfStripLength, Amg::Vector3D &stripDirection, Amg::Vector3D &stripCenter) const override final
hitVector const & getHitList() const
FPGATrackSimHit const & getClusterEquiv() const
float getY() const
unsigned getIdentifierHash() const
float getX() const
float getZ() const
bool isPixel() const
bool isStrip() const
This is a "hash" representation of an Identifier.
virtual DetectorShape shape() const
Shape of element.
Class used to describe the design of a module (diode segmentation and readout scheme).
double widthFromRowRange(const int rowMin, const int rowMax) const
Method to calculate phi width from a row range.
double widthFromColumnRange(const int colMin, const int colMax) const
Method to calculate eta width from a column range.
Base class for the SCT module side design, extended by the Forward and Barrel module design.
virtual SiCellId cellIdInRange(const SiCellId &cellId) const override
Check if cell is in range.
int cells() const
number of readout stips within module side:
virtual double stripPitch(const SiLocalPosition &chargePos) const =0
give the strip pitch (dependence on position needed for forward)
virtual int strip1Dim(int strip, int row) const override
only relevant for SCT.
virtual std::pair< SiLocalPosition, SiLocalPosition > endsOfStrip(const SiLocalPosition &position) const override=0
give the ends of strips
Identifier for the strip or pixel cell.
Definition SiCellId.h:29
int strip() const
Get strip number. Equivalent to phiIndex().
Definition SiCellId.h:131
bool isValid() const
Test if its in a valid state.
Definition SiCellId.h:136
Class to hold geometrical description of a silicon detector element.
virtual SiCellId cellIdFromIdentifier(const Identifier &identifier) const override final
SiCellId from Identifier.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
double phiPitch() const
Pitch (inline methods).
std::pair< Amg::Vector3D, Amg::Vector3D > endsOfStrip(const Amg::Vector2D &position) const
Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame...
double sinStereoLocal(const Amg::Vector2D &localPos) const
Angle of strip in local frame with respect to the etaAxis.
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
double xPhi() const
position along phi direction:
double xEta() const
position along eta direction:
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
virtual SiCellId cellIdInRange(const SiCellId &) const override
DEPRECATED: only used in a stupid example (2014) Check if cell is in range.
double phiPitchPhi(const SiLocalPosition &localPosition) const
SiLocalPosition localPositionOfCellPC(const SiCellId &cellId) const
This is for debugging only.
double z() const
Definition SiWidth.h:131
double phiR() const
Definition SiWidth.h:126
const Amg::Vector2D & widthPhiRZ() const
Definition SiWidth.h:121
const Amg::Vector2D & colRow() const
Definition SiWidth.h:115
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const std::vector< DetectorIDHashType > & elementIdList() const
Returns the IdentifierHash of the spacepoint (corresponds to the detector element IdentifierHash).
void setSpacePoint(DetectorIDHashType idHash, const Eigen::Matrix< float, 3, 1 > &globPos, float cov_r, float cov_z, std::vector< const xAOD::UncalibratedMeasurement * > &&measurementIndexes)
SG::ConstAccessor< SG::JaggedVecElt< Identifier::value_type > >::element_type rdoList() const
Returns the list of identifiers of the channels building the cluster.
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
@ locY
local cartesian
Definition ParamDefs.h:38
@ locX
Definition ParamDefs.h:37
@ locR
Definition ParamDefs.h:44
Definition index.py:1
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
SpacePointContainer_v1 SpacePointContainer
Define the version of the space point container.
StripClusterContainer_v1 StripClusterContainer
Define the version of the strip cluster container.
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
MsgStream & msg
Definition testRead.cxx:32