Belle II Software development
TransformDataGlobalAligned Class Reference

Transformation data (global, aligned): singleton version. More...

#include <TransformDataGlobalAligned.h>

Inheritance diagram for TransformDataGlobalAligned:
TransformData

Public Types

enum  Displacement {
  c_None ,
  c_Displacement ,
  c_Alignment
}
 Source of displacement (alignment) data. More...
 

Public Member Functions

const HepGeom::Transform3D * getSectionTransform (int section) const
 Get section transformation.
 
const HepGeom::Transform3D * getLayerTransform (int section, int layer) const
 Get layer transformation.
 
const HepGeom::Transform3D * getSectorTransform (int section, int layer, int sector) const
 Get sector transformation.
 
const HepGeom::Transform3D * getPlaneTransform (int section, int layer, int sector, int plane) const
 Get plane transformation.
 
const HepGeom::Transform3D * getPlaneDisplacement (int section, int layer, int sector, int plane) const
 Get additional displacement for plane internal volumes.
 
const HepGeom::Transform3D * getSegmentTransform (int section, int layer, int sector, int plane, int segment) const
 Get segment transformation.
 
const HepGeom::Transform3D * getStripLocalToGlobal (KLMDigit *hit) const
 Get strip local to global transformation by hit.
 
const HepGeom::Transform3D * getStripGlobalToLocal (KLMDigit *hit) const
 Get strip global to local transformation by hit.
 
const HepGeom::Transform3D * getStripGlobalToLocal (int section, int layer, int sector, int plane, int strip) const
 Get strip global to local transformation by hit.
 
const HepGeom::Transform3D * getStripTransform (int section, int layer, int sector, int plane, int strip) const
 Get strip transformation.
 
bool intersection (KLMDigit *hit1, KLMDigit *hit2, HepGeom::Point3D< double > *cross, double *d1, double *d2, double *sd, bool segments=true) const
 Check if strips intersect, and find intersection point if yes.
 
int getSectorByPosition (int section, const HepGeom::Point3D< double > &position) const
 Get sector by position.
 
int getStripsByIntersection (const HepGeom::Point3D< double > &intersection, int *strip1, int *strip2) const
 Find strips by intersection.
 

Static Public Member Functions

static const TransformDataGlobalAlignedInstance ()
 Instantiation.
 

Private Member Functions

 TransformDataGlobalAligned ()
 Constructor.
 
 ~TransformDataGlobalAligned ()
 Destructor.
 
void transformsToGlobal ()
 Make transformations global from local.
 

Private Attributes

const EKLMElementNumbersm_ElementNumbers
 Element numbers.
 
const GeometryDatam_GeoDat
 Geometry data.
 
HepGeom::Transform3D * m_Section
 Section transformations.
 
HepGeom::Transform3D ** m_Layer
 Layer transformations.
 
HepGeom::Transform3D *** m_Sector
 Sector transformations.
 
HepGeom::Transform3D **** m_Plane
 Plane transformations.
 
HepGeom::Transform3D **** m_PlaneDisplacement
 Plane internal volumes displacements.
 
HepGeom::Transform3D ***** m_Segment
 Segment transformations.
 
HepGeom::Transform3D ***** m_Strip
 Strip transformations.
 
HepGeom::Transform3D ***** m_StripInverse
 Inverse strip transformations.
 

Detailed Description

Transformation data (global, aligned): singleton version.

Definition at line 25 of file TransformDataGlobalAligned.h.

Member Enumeration Documentation

◆ Displacement

enum Displacement
inherited

Source of displacement (alignment) data.

Enumerator
c_None 

Displacement is not used.

c_Displacement 

Use displacement data (for geometry).

c_Alignment 

Use alignment data (for everything else).

Definition at line 42 of file TransformData.h.

42 {
43 c_None,
44 c_Displacement,
45 c_Alignment,
46 };

Constructor & Destructor Documentation

◆ TransformDataGlobalAligned()

Constructor.

Definition at line 21 of file TransformDataGlobalAligned.cc.

21 :
22 EKLM::TransformData(true, EKLM::TransformData::c_Alignment)
23{
24}
@ c_Alignment
Use alignment data (for everything else).

◆ ~TransformDataGlobalAligned()

Destructor.

Definition at line 26 of file TransformDataGlobalAligned.cc.

27{
28}

Member Function Documentation

◆ getLayerTransform()

const HepGeom::Transform3D * getLayerTransform ( int section,
int layer ) const
inherited

Get layer transformation.

Parameters
[in]sectionSection number.
[in]layerLayer number.

Definition at line 293 of file TransformData.cc.

294{
295 return &m_Layer[section - 1][layer - 1];
296}

◆ getPlaneDisplacement()

const HepGeom::Transform3D * getPlaneDisplacement ( int section,
int layer,
int sector,
int plane ) const
inherited

Get additional displacement for plane internal volumes.

Parameters
[in]sectionSection number.
[in]layerLayer number.
[in]sectorSector number.
[in]planePlane number.

Definition at line 310 of file TransformData.cc.

312{
313 return &m_PlaneDisplacement[section - 1][layer - 1][sector - 1][plane - 1];
314}

◆ getPlaneTransform()

const HepGeom::Transform3D * getPlaneTransform ( int section,
int layer,
int sector,
int plane ) const
inherited

Get plane transformation.

Parameters
[in]sectionSection number.
[in]layerLayer number.
[in]sectorSector number.
[in]planePlane number.

Definition at line 304 of file TransformData.cc.

306{
307 return &m_Plane[section - 1][layer - 1][sector - 1][plane - 1];
308}

◆ getSectionTransform()

const HepGeom::Transform3D * getSectionTransform ( int section) const
inherited

Get section transformation.

Parameters
[in]sectionSection number.

Definition at line 287 of file TransformData.cc.

288{
289 return &m_Section[section - 1];
290}

◆ getSectorByPosition()

int getSectorByPosition ( int section,
const HepGeom::Point3D< double > & position ) const
inherited

Get sector by position.

Parameters
[in]sectionSection number.
[in]positionPosition.

Definition at line 419 of file TransformData.cc.

421{
422 int sector;
423 double x;
424 if (section == 1) {
425 x = position.x();
426 } else {
427 x = -position.x();
428 }
429 if (position.y() > 0) {
430 if (x > 0)
431 sector = 1;
432 else
433 sector = 2;
434 } else {
435 if (x > 0)
436 sector = 4;
437 else
438 sector = 3;
439 }
440 return sector;
441}

◆ getSectorTransform()

const HepGeom::Transform3D * getSectorTransform ( int section,
int layer,
int sector ) const
inherited

Get sector transformation.

Parameters
[in]sectionSection number.
[in]layerLayer number.
[in]sectorSector number.

Definition at line 298 of file TransformData.cc.

300{
301 return &m_Sector[section - 1][layer - 1][sector - 1];
302}

◆ getSegmentTransform()

const HepGeom::Transform3D * getSegmentTransform ( int section,
int layer,
int sector,
int plane,
int segment ) const
inherited

Get segment transformation.

Parameters
[in]sectionSection number.
[in]layerLayer number.
[in]sectorSector number.
[in]planePlane number.
[in]segmentSegment number.

Definition at line 316 of file TransformData.cc.

319{
320 return &m_Segment[section - 1][layer - 1][sector - 1][plane - 1][segment - 1];
321}

◆ getStripGlobalToLocal() [1/2]

const HepGeom::Transform3D * getStripGlobalToLocal ( int section,
int layer,
int sector,
int plane,
int strip ) const
inherited

Get strip global to local transformation by hit.

Parameters
[in]sectionSection number.
[in]layerLayer number.
[in]sectorSector number.
[in]planePlane number.
[in]stripStrip number.
Returns
Transformation.

Definition at line 344 of file TransformData.cc.

346{
347 return &(m_StripInverse[section - 1][layer - 1][sector - 1][plane - 1]
348 [strip - 1]);
349}

◆ getStripGlobalToLocal() [2/2]

const HepGeom::Transform3D * getStripGlobalToLocal ( KLMDigit * hit) const
inherited

Get strip global to local transformation by hit.

Parameters
[in]hitHit.
Returns
Transformation.

Definition at line 337 of file TransformData.cc.

338{
339 return &(m_StripInverse[hit->getSection() - 1][hit->getLayer() - 1]
340 [hit->getSector() - 1][hit->getPlane() - 1][hit->getStrip() - 1]);
341}
int getLayer() const
Get layer number.
Definition KLMDigit.h:126
int getSection() const
Get section number.
Definition KLMDigit.h:90
int getPlane() const
Get plane number.
Definition KLMDigit.h:144
int getStrip() const
Get strip number.
Definition KLMDigit.h:162
int getSector() const
Get sector number.
Definition KLMDigit.h:108

◆ getStripLocalToGlobal()

const HepGeom::Transform3D * getStripLocalToGlobal ( KLMDigit * hit) const
inherited

Get strip local to global transformation by hit.

Parameters
[in]hitHit.
Returns
Transformation.

Definition at line 330 of file TransformData.cc.

331{
332 return &(m_Strip[hit->getSection() - 1][hit->getLayer() - 1]
333 [hit->getSector() - 1][hit->getPlane() - 1][hit->getStrip() - 1]);
334}

◆ getStripsByIntersection()

int getStripsByIntersection ( const HepGeom::Point3D< double > & intersection,
int * strip1,
int * strip2 ) const
inherited

Find strips by intersection.

Parameters
[in]intersectionIntersection point.
[out]strip1Strip 1 global number.
[out]strip2Strip 2 global number.
Returns
0 on success, -1 on error.

Definition at line 443 of file TransformData.cc.

445{
446 /* cppcheck-suppress variableScope */
447 int section, layer, sector, plane, segment, strip, stripSegment, stripGlobal;
448 /* cppcheck-suppress variableScope */
449 int nLayers, nPlanes, nSegments, nStripsSegment, minDistanceSegment;
450 double solenoidCenter, firstLayerCenter, layerShift;
451 /* cppcheck-suppress variableScope */
452 double x, y, z, l, minY, maxY;
453 double minDistance = 0, minDistanceNew, stripWidth;
454 HepGeom::Point3D<double> intersectionClhep, intersectionLocal;
455 intersectionClhep = intersection * CLHEP::cm / Unit::cm;
456 solenoidCenter = m_GeoDat->getSolenoidZ() / CLHEP::cm * Unit::cm;
457 if (intersection.z() < solenoidCenter)
458 section = 1;
459 else
460 section = 2;
461 firstLayerCenter =
462 (m_GeoDat->getSectionPosition()->getZ()
463 - 0.5 * m_GeoDat->getSectionPosition()->getLength()
464 + m_GeoDat->getLayerShiftZ()
465 - 0.5 * m_GeoDat->getLayerPosition()->getLength()) /
466 CLHEP::cm * Unit::cm;
467 layerShift = m_GeoDat->getLayerShiftZ() / CLHEP::cm * Unit::cm;
468 z = fabs(intersection.z() - solenoidCenter);
469 layer = round((z - firstLayerCenter) / layerShift) + 1;
470 if (layer <= 0)
471 layer = 1;
472 nLayers = m_GeoDat->getNDetectorLayers(section);
473 if (layer > nLayers)
474 layer = nLayers;
475 sector = getSectorByPosition(section, intersection);
476 nPlanes = m_GeoDat->getNPlanes();
477 nSegments = m_GeoDat->getNSegments();
478 nStripsSegment = m_ElementNumbers->getNStripsSegment();
479 stripWidth = m_GeoDat->getStripGeometry()->getWidth() / CLHEP::cm * Unit::cm;
480 minY = -stripWidth / 2;
481 maxY = (double(nStripsSegment) - 0.5) * stripWidth;
482 for (plane = 1; plane <= nPlanes; plane++) {
483 minDistanceSegment = 1;
484 for (segment = 1; segment <= nSegments; segment++) {
485 strip = (segment - 1) * nStripsSegment;
486 intersectionLocal = m_StripInverse[section - 1][layer - 1]
487 [sector - 1][plane - 1][strip] * intersectionClhep;
488 y = intersectionLocal.y() / CLHEP::cm * Unit::cm;
489 if (y < minY) {
490 minDistanceNew = minY - y;
491 } else if (y > maxY) {
492 minDistanceNew = y - maxY;
493 } else {
494 minDistance = 0;
495 minDistanceSegment = segment;
496 break;
497 }
498 if (segment == 1) {
499 minDistance = minDistanceNew;
500 } else if (minDistanceNew < minDistance) {
501 minDistance = minDistanceNew;
502 minDistanceSegment = segment;
503 }
504 }
505 /*
506 * The intersection is required to be strictly within a segment,
507 * this condition might be adjusted later.
508 */
509 if (minDistance > 0)
510 return -1;
511 strip = (minDistanceSegment - 1) * nStripsSegment;
512 intersectionLocal = m_StripInverse[section - 1][layer - 1]
513 [sector - 1][plane - 1][strip] * intersectionClhep;
514 y = intersectionLocal.y() / CLHEP::cm * Unit::cm;
515 stripSegment = ceil((y - 0.5 * stripWidth) / stripWidth);
516 if (stripSegment <= 0)
517 stripSegment = 1;
518 else if (stripSegment > nStripsSegment)
519 stripSegment = nStripsSegment;
520 strip = stripSegment + (minDistanceSegment - 1) * nStripsSegment;
521 intersectionLocal = m_StripInverse[section - 1][layer - 1]
522 [sector - 1][plane - 1][strip - 1] * intersectionClhep;
523 x = intersectionLocal.x();
524 l = m_GeoDat->getStripLength(strip);
525 /*
526 * The intersection is required to be strictly within the strip length,
527 * this condition might be adjusted later.
528 */
529 if (fabs(x) > 0.5 * l)
530 return -1;
531 stripGlobal = m_ElementNumbers->stripNumber(
532 section, layer, sector, plane, strip);
533 if (plane == 1)
534 *strip1 = stripGlobal;
535 else
536 *strip2 = stripGlobal;
537 }
538 return 0;
539}
static const double cm
Standard units with the value = 1.
Definition Unit.h:47

◆ getStripTransform()

const HepGeom::Transform3D * getStripTransform ( int section,
int layer,
int sector,
int plane,
int strip ) const
inherited

Get strip transformation.

Parameters
[in]sectionSection number.
[in]layerLayer number.
[in]sectorSector number.
[in]planePlane number.
[in]stripStrip number.

Definition at line 323 of file TransformData.cc.

325{
326 return &m_Strip[section - 1][layer - 1][sector - 1][plane - 1][strip - 1];
327}

◆ Instance()

const EKLM::TransformDataGlobalAligned & Instance ( )
static

Instantiation.

Definition at line 15 of file TransformDataGlobalAligned.cc.

16{
17 static EKLM::TransformDataGlobalAligned t;
18 return t;
19}

◆ intersection()

bool intersection ( KLMDigit * hit1,
KLMDigit * hit2,
HepGeom::Point3D< double > * cross,
double * d1,
double * d2,
double * sd,
bool segments = true ) const
inherited

Check if strips intersect, and find intersection point if yes.

Parameters
[in]hit1First hit.
[in]hit2Second hit.
[out]crossCrossing point (coordinate unit is cm).
[out]d1Distance from hit to SiPM of strip 1, cm.
[out]d2Distance from hit to SiPM of strip 2, cm.
[out]sdShortest distance between strips, cm. Or if second strip is closer to interaction point, then (- shortest distance).
[in]segmentsCheck if segments intersect (may need to turn this check off for debugging).
Returns
True if strips intersect.

Line parametric equations: (s1_1g) + (s1_2g - s1_1g) * t1 = a1 + v1 * t1, (s2_1g) + (s2_2g - s2_1g) * t2 = a2 + v2 * t2. Points of closest approach: t1 = ((v1,v2)*(d,v2) - v2^2*(d,v1)) / (v1^2*v2^2 - (v1,v2)^2) t2 = - ((v1,v2)*(d,v1) - v1^2*(d,v2)) / (v1^2*v2^2 - (v1,v2)^2) where d = a1 - a2.

Definition at line 351 of file TransformData.cc.

355{
356 /* Hits must be from the same sector, */
357 if (hit1->getSection() != hit2->getSection())
358 return false;
359 if (hit1->getLayer() != hit2->getLayer())
360 return false;
361 if (hit1->getSector() != hit2->getSector())
362 return false;
363 /* but different planes. */
364 if (hit1->getPlane() == hit2->getPlane())
365 return false;
366 /* Coordinates of strip 1 ends. */
367 double l1 = m_GeoDat->getStripLength(hit1->getStrip());
368 HepGeom::Point3D<double> s1_1(-0.5 * l1, 0.0, 0.0);
369 HepGeom::Point3D<double> s1_2(0.5 * l1, 0.0, 0.0);
370 const HepGeom::Transform3D* tr1 = getStripLocalToGlobal(hit1);
371 HepGeom::Point3D<double> s1_1g = (*tr1) * s1_1;
372 HepGeom::Point3D<double> s1_2g = (*tr1) * s1_2;
373 /* Coordinates of strip 2 ends. */
374 double l2 = m_GeoDat->getStripLength(hit2->getStrip());
375 HepGeom::Point3D<double> s2_1(-0.5 * l2, 0.0, 0.0);
376 HepGeom::Point3D<double> s2_2(0.5 * l2, 0.0, 0.0);
377 const HepGeom::Transform3D* tr2 = getStripLocalToGlobal(hit2);
378 HepGeom::Point3D<double> s2_1g = (*tr2) * s2_1;
379 HepGeom::Point3D<double> s2_2g = (*tr2) * s2_2;
389 HepGeom::Vector3D<double> v1 = s1_2g - s1_1g;
390 HepGeom::Vector3D<double> v2 = s2_2g - s2_1g;
391 HepGeom::Vector3D<double> d = s1_1g - s2_1g;
392 double v1sq = v1.mag2();
393 double v2sq = v2.mag2();
394 double v1dv2 = v1.dot(v2);
395 double ddv1 = d.dot(v1);
396 double ddv2 = d.dot(v2);
397 double den = v1sq * v2sq - v1dv2 * v1dv2;
398 double t1 = (v1dv2 * ddv2 - v2sq * ddv1) / den;
399 double t2 = (- v1dv2 * ddv1 + v1sq * ddv2) / den;
400 /* Segments do not intersect. */
401 if (segments) {
402 if (t1 < 0.0 || t1 > 1.0)
403 return false;
404 if (t2 < 0.0 || t2 > 1.0)
405 return false;
406 }
407 /* Segments intersect, set return values. */
408 HepGeom::Point3D<double> s1_cg = s1_1g + v1 * t1;
409 HepGeom::Point3D<double> s2_cg = s2_1g + v2 * t2;
410 *d1 = s1_2g.distance(s1_cg) / CLHEP::mm * Unit::mm;
411 *d2 = s2_2g.distance(s2_cg) / CLHEP::mm * Unit::mm;
412 *cross = 0.5 * (s1_cg + s2_cg) / CLHEP::mm * Unit::mm;
413 *sd = s1_cg.distance(s2_cg) / CLHEP::mm * Unit::mm;
414 if (s2_cg.mag2() < s1_cg.mag2())
415 *sd = - *sd;
416 return true;
417}
static const double mm
[millimeters]
Definition Unit.h:70

◆ transformsToGlobal()

void transformsToGlobal ( )
privateinherited

Make transformations global from local.

Definition at line 241 of file TransformData.cc.

242{
243 int iSection, iLayer, iSector, iPlane, iSegment, iStrip;
244 /* cppcheck-suppress variableScope */
245 int nSections, nLayers, nDetectorLayers, nSectors, nPlanes, nSegments, nStrips;
246 nSections = m_GeoDat->getNSections();
247 nLayers = m_GeoDat->getNLayers();
248 nSectors = m_GeoDat->getNSectors();
249 nPlanes = m_GeoDat->getNPlanes();
250 nSegments = m_GeoDat->getNSegments();
251 nStrips = m_GeoDat->getNStrips();
252 for (iSection = 0; iSection < nSections; iSection++) {
253 nDetectorLayers = m_GeoDat->getNDetectorLayers(iSection + 1);
254 for (iLayer = 0; iLayer < nLayers; iLayer++) {
255 m_Layer[iSection][iLayer] = m_Section[iSection] * m_Layer[iSection][iLayer];
256 for (iSector = 0; iSector < nSectors; iSector++) {
257 m_Sector[iSection][iLayer][iSector] =
258 m_Layer[iSection][iLayer] * m_Sector[iSection][iLayer][iSector];
259 if (iLayer >= nDetectorLayers)
260 continue;
261 for (iPlane = 0; iPlane < nPlanes; iPlane++) {
262 [[clang::suppress]]
263 m_Plane[iSection][iLayer][iSector][iPlane] =
264 m_Sector[iSection][iLayer][iSector] *
265 m_Plane[iSection][iLayer][iSector][iPlane];
266 for (iSegment = 0; iSegment < nSegments; iSegment++) {
267 m_Segment[iSection][iLayer][iSector][iPlane][iSegment] =
268 m_Plane[iSection][iLayer][iSector][iPlane] *
269 m_PlaneDisplacement[iSection][iLayer][iSector][iPlane] *
270 m_Segment[iSection][iLayer][iSector][iPlane][iSegment];
271 }
272 for (iStrip = 0; iStrip < nStrips; iStrip++) {
273 m_Strip[iSection][iLayer][iSector][iPlane][iStrip] =
274 m_Plane[iSection][iLayer][iSector][iPlane] *
275 m_PlaneDisplacement[iSection][iLayer][iSector][iPlane] *
276 m_Strip[iSection][iLayer][iSector][iPlane][iStrip];
277 m_StripInverse[iSection][iLayer][iSector][iPlane][iStrip] =
278 m_Strip[iSection][iLayer][iSector][iPlane][iStrip].inverse();
279 }
280 }
281 }
282 }
283 }
284}

Member Data Documentation

◆ m_ElementNumbers

const EKLMElementNumbers* m_ElementNumbers
privateinherited

Element numbers.

Definition at line 211 of file TransformData.h.

◆ m_GeoDat

const GeometryData* m_GeoDat
privateinherited

Geometry data.

Definition at line 214 of file TransformData.h.

◆ m_Layer

HepGeom::Transform3D** m_Layer
privateinherited

Layer transformations.

Definition at line 220 of file TransformData.h.

◆ m_Plane

HepGeom::Transform3D**** m_Plane
privateinherited

Plane transformations.

Definition at line 226 of file TransformData.h.

◆ m_PlaneDisplacement

HepGeom::Transform3D**** m_PlaneDisplacement
privateinherited

Plane internal volumes displacements.

Definition at line 229 of file TransformData.h.

◆ m_Section

HepGeom::Transform3D* m_Section
privateinherited

Section transformations.

Definition at line 217 of file TransformData.h.

◆ m_Sector

HepGeom::Transform3D*** m_Sector
privateinherited

Sector transformations.

Definition at line 223 of file TransformData.h.

◆ m_Segment

HepGeom::Transform3D***** m_Segment
privateinherited

Segment transformations.

Definition at line 232 of file TransformData.h.

◆ m_Strip

HepGeom::Transform3D***** m_Strip
privateinherited

Strip transformations.

Definition at line 235 of file TransformData.h.

◆ m_StripInverse

HepGeom::Transform3D***** m_StripInverse
privateinherited

Inverse strip transformations.

Definition at line 238 of file TransformData.h.


The documentation for this class was generated from the following files: