Belle II Software  release-05-01-25
TransformData Class Reference

Transformation data. More...

#include <TransformData.h>

Inheritance diagram for TransformData:
Collaboration diagram for TransformData:

Public Types

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

Public Member Functions

 TransformData (bool global, Displacement displacementType)
 Constructor. More...
 
 TransformData (const TransformData &)=delete
 Copy constructor (disabled).
 
TransformDataoperator= (const TransformData &)=delete
 Operator = (disabled).
 
 ~TransformData ()
 Destructor.
 
const HepGeom::Transform3D * getSectionTransform (int section) const
 Get section transformation. More...
 
const HepGeom::Transform3D * getLayerTransform (int section, int layer) const
 Get layer transformation. More...
 
const HepGeom::Transform3D * getSectorTransform (int section, int layer, int sector) const
 Get sector transformation. More...
 
const HepGeom::Transform3D * getPlaneTransform (int section, int layer, int sector, int plane) const
 Get plane transformation. More...
 
const HepGeom::Transform3D * getPlaneDisplacement (int section, int layer, int sector, int plane) const
 Get additional displacement for plane internal volumes. More...
 
const HepGeom::Transform3D * getSegmentTransform (int section, int layer, int sector, int plane, int segment) const
 Get segment transformation. More...
 
const HepGeom::Transform3D * getStripLocalToGlobal (KLMDigit *hit) const
 Get strip local to global transformation by hit. More...
 
const HepGeom::Transform3D * getStripGlobalToLocal (KLMDigit *hit) const
 Get strip global to local transformation by hit. More...
 
const HepGeom::Transform3D * getStripTransform (int section, int layer, int sector, int plane, int strip) const
 Get strip transformation. More...
 
const HepGeom::Transform3D * getStripGlobalToLocal (int section, int layer, int sector, int plane, int strip) const
 Get strip global to local transformation by hit. More...
 
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. More...
 
int getSectorByPosition (int section, const HepGeom::Point3D< double > &position) const
 Get sector by position. More...
 
int getStripsByIntersection (const HepGeom::Point3D< double > &intersection, int *strip1, int *strip2) const
 Find strips by intersection. More...
 

Private Member Functions

void transformsToGlobal ()
 Make transformations global from local. More...
 

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.

All data and function results are in CLHEP units unless noted otherwise.

Definition at line 37 of file TransformData.h.

Member Enumeration Documentation

◆ Displacement

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 44 of file TransformData.h.

44  {
45  c_None,
47  c_Alignment,
48  };

Constructor & Destructor Documentation

◆ TransformData()

TransformData ( bool  global,
Displacement  displacementType 
)

Constructor.

Parameters
[in]globalIf true, load global transformations (false - local).
[in]displacementTypeDisplacement type.

Definition at line 27 of file TransformData.cc.

28 {
29  /* cppcheck-suppress variableScope */
30  int iSection, iLayer, iSector, iPlane, iSegment, iStrip, sector, segment;
31  int nSections, nLayers, nSectors, nPlanes, nStrips, nSegments, nStripsSegment;
32  int nDetectorLayers;
33  AlignmentChecker alignmentChecker(true);
36  nSections = m_GeoDat->getNSections();
37  nSectors = m_GeoDat->getNSectors();
38  nLayers = m_GeoDat->getNLayers();
39  nPlanes = m_GeoDat->getNPlanes();
40  nStrips = m_GeoDat->getNStrips();
41  nSegments = m_GeoDat->getNSegments();
42  nStripsSegment = m_ElementNumbers->getNStripsSegment();
43  m_Section = new HepGeom::Transform3D[nSections];
44  m_Layer = new HepGeom::Transform3D*[nSections];
45  m_Sector = new HepGeom::Transform3D** [nSections];
46  m_Plane = new HepGeom::Transform3D** *[nSections];
47  m_PlaneDisplacement = new HepGeom::Transform3D** *[nSections];
48  m_Segment = new HepGeom::Transform3D**** [nSections];
49  m_Strip = new HepGeom::Transform3D**** [nSections];
50  m_StripInverse = new HepGeom::Transform3D**** [nSections];
51  for (iSection = 0; iSection < nSections; iSection++) {
52  m_GeoDat->getSectionTransform(&m_Section[iSection], iSection);
53  nDetectorLayers = m_GeoDat->getNDetectorLayers(iSection + 1);
54  m_Layer[iSection] = new HepGeom::Transform3D[nLayers];
55  m_Sector[iSection] = new HepGeom::Transform3D*[nLayers];
56  m_Plane[iSection] = new HepGeom::Transform3D** [nLayers];
57  m_PlaneDisplacement[iSection] = new HepGeom::Transform3D** [nLayers];
58  m_Segment[iSection] = new HepGeom::Transform3D** *[nLayers];
59  m_Strip[iSection] = new HepGeom::Transform3D** *[nLayers];
60  m_StripInverse[iSection] = new HepGeom::Transform3D** *[nLayers];
61  for (iLayer = 0; iLayer < nLayers; iLayer++) {
62  m_GeoDat->getLayerTransform(&m_Layer[iSection][iLayer], iLayer);
63  m_Sector[iSection][iLayer] = new HepGeom::Transform3D[nSectors];
64  if (iLayer < nDetectorLayers) {
65  m_Plane[iSection][iLayer] = new HepGeom::Transform3D*[nSectors];
66  m_PlaneDisplacement[iSection][iLayer] =
67  new HepGeom::Transform3D*[nSectors];
68  m_Segment[iSection][iLayer] = new HepGeom::Transform3D** [nSectors];
69  m_Strip[iSection][iLayer] = new HepGeom::Transform3D** [nSectors];
70  m_StripInverse[iSection][iLayer] = new HepGeom::Transform3D** [nSectors];
71  }
72  for (iSector = 0; iSector < nSectors; iSector++) {
73  m_GeoDat->getSectorTransform(&m_Sector[iSection][iLayer][iSector],
74  iSector);
75  if (iLayer >= nDetectorLayers)
76  continue;
77  m_Plane[iSection][iLayer][iSector] = new HepGeom::Transform3D[nPlanes];
78  m_PlaneDisplacement[iSection][iLayer][iSector] =
79  new HepGeom::Transform3D[nPlanes];
80  m_Segment[iSection][iLayer][iSector] =
81  new HepGeom::Transform3D*[nPlanes];
82  m_Strip[iSection][iLayer][iSector] = new HepGeom::Transform3D*[nPlanes];
83  m_StripInverse[iSection][iLayer][iSector] =
84  new HepGeom::Transform3D*[nPlanes];
85  for (iPlane = 0; iPlane < nPlanes; iPlane++) {
87  &m_Plane[iSection][iLayer][iSector][iPlane], iPlane);
88  m_PlaneDisplacement[iSection][iLayer][iSector][iPlane] =
89  HepGeom::Translate3D(0, 0, 0);
90  m_Segment[iSection][iLayer][iSector][iPlane] =
91  new HepGeom::Transform3D[nSegments];
92  for (iSegment = 0; iSegment < nSegments; iSegment++) {
93  m_Segment[iSection][iLayer][iSector][iPlane][iSegment] =
94  HepGeom::Translate3D(0, 0, 0);
95  }
96  m_Strip[iSection][iLayer][iSector][iPlane] =
97  new HepGeom::Transform3D[nStrips];
98  m_StripInverse[iSection][iLayer][iSector][iPlane] =
99  new HepGeom::Transform3D[nStrips];
100  for (iStrip = 0; iStrip < nStrips; iStrip++) {
102  &m_Strip[iSection][iLayer][iSector][iPlane][iStrip], iStrip);
103  }
104  }
105  }
106  }
107  }
108  /* Read alignment data from the database and modify transformations. */
109  if (displacementType != c_None) {
110  std::string payload, segmentPayload;
111  if (displacementType == c_Displacement) {
112  payload = "EKLMDisplacement";
113  segmentPayload = "EKLMSegmentDisplacement";
114  } else {
115  payload = "EKLMAlignment";
116  segmentPayload = "EKLMSegmentAlignment";
117  }
118  DBObjPtr<EKLMAlignment> alignment(payload);
119  DBObjPtr<EKLMSegmentAlignment> segmentAlignment(segmentPayload);
120  if (!alignment.isValid())
121  B2FATAL("No EKLM displacement (alignment) data.");
122  if (displacementType == c_Displacement) {
123  if (!alignmentChecker.checkAlignment(&(*alignment), &(*segmentAlignment)))
124  B2FATAL("EKLM displacement data are incorrect, overlaps exist.");
125  }
126  for (iSection = 1; iSection <= nSections; iSection++) {
127  nDetectorLayers = m_GeoDat->getNDetectorLayers(iSection);
128  for (iLayer = 1; iLayer <= nDetectorLayers; iLayer++) {
129  for (iSector = 1; iSector <= nSectors; iSector++) {
130  sector = m_ElementNumbers->sectorNumber(iSection, iLayer, iSector);
131  const KLMAlignmentData* sectorAlignment =
132  alignment->getModuleAlignment(sector);
133  if (sectorAlignment == nullptr)
134  B2FATAL("Incomplete EKLM displacement (alignment) data.");
135  for (iPlane = 1; iPlane <= nPlanes; iPlane++) {
136  /* First plane is rotated. */
137  if (iPlane == 1) {
138  m_PlaneDisplacement[iSection - 1][iLayer - 1][iSector - 1][iPlane - 1] =
139  HepGeom::Translate3D(
140  sectorAlignment->getDeltaV() * CLHEP::cm / Unit::cm,
141  sectorAlignment->getDeltaU() * CLHEP::cm / Unit::cm, 0) *
142  HepGeom::RotateZ3D(-sectorAlignment->getDeltaGamma() *
143  CLHEP::rad / Unit::rad);
144  } else {
145  m_PlaneDisplacement[iSection - 1][iLayer - 1][iSector - 1][iPlane - 1] =
146  HepGeom::Translate3D(
147  sectorAlignment->getDeltaU() * CLHEP::cm / Unit::cm,
148  sectorAlignment->getDeltaV() * CLHEP::cm / Unit::cm, 0) *
149  HepGeom::RotateZ3D(sectorAlignment->getDeltaGamma() *
150  CLHEP::rad / Unit::rad);
151  }
152  for (iSegment = 1; iSegment <= nSegments; iSegment++) {
153  segment = m_ElementNumbers->segmentNumber(
154  iSection, iLayer, iSector, iPlane, iSegment);
155  const KLMAlignmentData* segmentAlignmentData =
156  segmentAlignment->getSegmentAlignment(segment);
157  if (segmentAlignmentData == nullptr)
158  B2FATAL("Incomplete EKLM displacement (alignment) data.");
159  m_Segment[iSection - 1][iLayer - 1][iSector - 1][iPlane - 1]
160  [iSegment - 1] =
161  HepGeom::Translate3D(
162  segmentAlignmentData->getDeltaU() * CLHEP::cm / Unit::cm,
163  segmentAlignmentData->getDeltaV() * CLHEP::cm / Unit::cm, 0) *
164  m_Segment[iSection - 1][iLayer - 1][iSector - 1][iPlane - 1]
165  [iSegment - 1] *
166  HepGeom::RotateZ3D(segmentAlignmentData->getDeltaGamma() *
167  CLHEP::rad / Unit::rad);
168  for (iStrip = 1; iStrip <= nStripsSegment; iStrip++) {
169  m_Strip[iSection - 1][iLayer - 1][iSector - 1][iPlane - 1]
170  [nStripsSegment * (iSegment - 1) + iStrip - 1] =
171  HepGeom::Translate3D(
172  segmentAlignmentData->getDeltaU() * CLHEP::cm / Unit::cm,
173  segmentAlignmentData->getDeltaV() * CLHEP::cm / Unit::cm,
174  0) *
175  m_Strip[iSection - 1][iLayer - 1][iSector - 1][iPlane - 1]
176  [nStripsSegment * (iSegment - 1) + iStrip - 1] *
177  HepGeom::RotateZ3D(segmentAlignmentData->getDeltaGamma() *
178  CLHEP::rad / Unit::rad);
179  }
180  }
181  }
182  }
183  }
184  }
185  }
186  if (global)
188 }

Member Function Documentation

◆ getLayerTransform()

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

Get layer transformation.

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

Definition at line 292 of file TransformData.cc.

◆ getPlaneDisplacement()

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

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.

◆ getPlaneTransform()

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

Get plane transformation.

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

Definition at line 304 of file TransformData.cc.

◆ getSectionTransform()

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

Get section transformation.

Parameters
[in]sectionSection number.

Definition at line 286 of file TransformData.cc.

◆ getSectorByPosition()

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

Get sector by position.

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

Definition at line 418 of file TransformData.cc.

◆ getSectorTransform()

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

Get sector transformation.

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

Definition at line 298 of file TransformData.cc.

◆ getSegmentTransform()

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

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.

◆ getStripGlobalToLocal() [1/2]

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

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 343 of file TransformData.cc.

◆ getStripGlobalToLocal() [2/2]

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

Get strip global to local transformation by hit.

Parameters
[in]hitHit.
Returns
Transformation.

Definition at line 336 of file TransformData.cc.

◆ getStripLocalToGlobal()

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

Get strip local to global transformation by hit.

Parameters
[in]hitHit.
Returns
Transformation.

Definition at line 329 of file TransformData.cc.

◆ getStripsByIntersection()

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

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 442 of file TransformData.cc.

◆ getStripTransform()

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

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.

◆ intersection()

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.

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 350 of file TransformData.cc.

◆ transformsToGlobal()

void transformsToGlobal ( )
private

Make transformations global from local.

Parameters
[in,out]datTransformation data.

Definition at line 241 of file TransformData.cc.


The documentation for this class was generated from the following files:
Belle2::Unit::cm
static const double cm
Standard units with the value = 1.
Definition: Unit.h:57
Belle2::EKLMGeometry::getNSegments
int getNSegments() const
Get number of segments.
Definition: EKLMGeometry.h:1725
Belle2::EKLMGeometry::getNLayers
int getNLayers() const
Get number of layers.
Definition: EKLMGeometry.h:1695
Belle2::EKLM::TransformData::m_Segment
HepGeom::Transform3D ***** m_Segment
Segment transformations.
Definition: TransformData.h:235
Belle2::EKLM::TransformData::c_Alignment
@ c_Alignment
Use alignment data (for everything else).
Definition: TransformData.h:47
Belle2::EKLMGeometry::getNPlanes
int getNPlanes() const
Get number of planes.
Definition: EKLMGeometry.h:1717
Belle2::EKLM::GeometryData::getLayerTransform
void getLayerTransform(HepGeom::Transform3D *t, int n) const
Get layer transformation.
Definition: GeometryData.cc:662
Belle2::KLMAlignmentData::getDeltaV
float getDeltaV() const
Get shift in V.
Definition: KLMAlignmentData.h:104
Belle2::EKLM::TransformData::m_PlaneDisplacement
HepGeom::Transform3D **** m_PlaneDisplacement
Plane internal volumes displacements.
Definition: TransformData.h:232
Belle2::EKLMElementNumbers::sectorNumber
int sectorNumber(int section, int layer, int sector) const
Get sector number.
Definition: EKLMElementNumbers.cc:145
Belle2::DBObjPtr
Class for accessing objects in the database.
Definition: DBObjPtr.h:31
Belle2::EKLM::TransformData::m_Layer
HepGeom::Transform3D ** m_Layer
Layer transformations.
Definition: TransformData.h:223
Belle2::Unit::rad
static const double rad
Standard of [angle].
Definition: Unit.h:60
Belle2::KLMAlignmentData::getDeltaU
float getDeltaU() const
Get shift in U.
Definition: KLMAlignmentData.h:87
Belle2::EKLMGeometry::getNStrips
int getNStrips() const
Get number of strips.
Definition: EKLMGeometry.h:1741
Belle2::EKLM::GeometryData::getPlaneTransform
void getPlaneTransform(HepGeom::Transform3D *t, int n) const
Get plane transformation.
Definition: GeometryData.cc:690
Belle2::EKLM::TransformData::m_StripInverse
HepGeom::Transform3D ***** m_StripInverse
Inverse strip transformations.
Definition: TransformData.h:241
Belle2::EKLM::TransformData::m_Section
HepGeom::Transform3D * m_Section
Section transformations.
Definition: TransformData.h:220
Belle2::EKLMElementNumbers::segmentNumber
int segmentNumber(int section, int layer, int sector, int plane, int segment) const
Get segment number.
Definition: EKLMElementNumbers.cc:191
Belle2::EKLMElementNumbers::Instance
static const EKLMElementNumbers & Instance()
Instantiation.
Definition: EKLMElementNumbers.cc:20
Belle2::EKLMGeometry::getNDetectorLayers
int getNDetectorLayers(int section) const
Get number of detector layers.
Definition: EKLMGeometry.cc:295
Belle2::KLMAlignmentData::getDeltaGamma
float getDeltaGamma() const
Get rotation in alpha.
Definition: KLMAlignmentData.h:172
Belle2::EKLM::TransformData::m_Strip
HepGeom::Transform3D ***** m_Strip
Strip transformations.
Definition: TransformData.h:238
Belle2::EKLM::TransformData::m_GeoDat
const GeometryData * m_GeoDat
Geometry data.
Definition: TransformData.h:217
Belle2::EKLM::TransformData::m_Plane
HepGeom::Transform3D **** m_Plane
Plane transformations.
Definition: TransformData.h:229
Belle2::EKLMElementNumbers::getNStripsSegment
static constexpr int getNStripsSegment()
Get number of strips in a segment.
Definition: EKLMElementNumbers.h:401
Belle2::EKLM::GeometryData::getStripTransform
void getStripTransform(HepGeom::Transform3D *t, int n) const
Get strip transformation.
Definition: GeometryData.cc:703
Belle2::EKLM::TransformData::m_ElementNumbers
const EKLMElementNumbers * m_ElementNumbers
Element numbers.
Definition: TransformData.h:214
Belle2::EKLM::TransformData::c_Displacement
@ c_Displacement
Use displacement data (for geometry).
Definition: TransformData.h:46
Belle2::KLMAlignmentData
KLM Alignment data.
Definition: KLMAlignmentData.h:33
Belle2::EKLMGeometry::getNSections
int getNSections() const
Get number of sections.
Definition: EKLMGeometry.h:1687
Belle2::EKLM::GeometryData::getSectorTransform
void getSectorTransform(HepGeom::Transform3D *t, int n) const
Get sector transformation.
Definition: GeometryData.cc:670
Belle2::EKLMGeometry::getNSectors
int getNSectors() const
Get number of sectors.
Definition: EKLMGeometry.h:1709
Belle2::EKLM::TransformData::m_Sector
HepGeom::Transform3D *** m_Sector
Sector transformations.
Definition: TransformData.h:226
Belle2::EKLM::GeometryData::getSectionTransform
void getSectionTransform(HepGeom::Transform3D *t, int n) const
Get section transformation.
Definition: GeometryData.cc:650
Belle2::EKLM::GeometryData::Instance
static const GeometryData & Instance(enum DataSource dataSource=c_Database, const GearDir *gearDir=nullptr)
Instantiation.
Definition: GeometryData.cc:35
Belle2::EKLM::TransformData::transformsToGlobal
void transformsToGlobal()
Make transformations global from local.
Definition: TransformData.cc:241
Belle2::EKLM::TransformData::c_None
@ c_None
Displacement is not used.
Definition: TransformData.h:45