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