12#include <TGeoManager.h>
13#include <TGeoPhysicalNode.h>
25 uint32_t gLbl{0}, det{0};
27 AlignableVolume *volHB{
nullptr}, *volSt{
nullptr}, *volHSt{
nullptr}, *volMod{
nullptr};
28 std::unordered_map<std::string, AlignableVolume*> sym2vol;
30 auto root = std::make_unique<AlignableVolume>(geom->composeSymNameITS(), gLbl++, det,
false);
31 sym2vol[root->getSymName()] = root.get();
32 for (
int ilr = 0; ilr < geom->getNumberOfLayers(); ilr++) {
33 for (
int ihb = 0; ihb < geom->getNumberOfHalfBarrels(); ihb++) {
34 volHB = root->addChild(geom->composeSymNameHalfBarrel(ilr, ihb), gLbl++, det,
false);
35 sym2vol[volHB->getSymName()] = volHB;
36 int nstavesHB = geom->getNumberOfStaves(ilr) / 2;
37 for (
int ist = 0; ist < nstavesHB; ist++) {
38 volSt = volHB->addChild(geom->composeSymNameStave(ilr, ihb, ist), gLbl++, det,
false);
39 sym2vol[volSt->getSymName()] = volSt;
40 for (
int ihst = 0; ihst < geom->getNumberOfHalfStaves(ilr); ihst++) {
41 volHSt = volSt->addChild(geom->composeSymNameHalfStave(ilr, ihb, ist, ihst), gLbl++, det,
false);
42 sym2vol[volHSt->getSymName()] = volHSt;
43 for (
int imd = 0; imd < geom->getNumberOfModules(ilr); imd++) {
44 volMod = volHSt->addChild(geom->composeSymNameModule(ilr, ihb, ist, ihst, imd), gLbl++, det,
false);
45 sym2vol[volMod->getSymName()] = volMod;
53 int lay = 0, hba = 0, sta = 0, ssta = 0, modd = 0, chip = 0;
54 for (
int ich = 0; ich < geom->getNumberOfChips(); ich++) {
55 geom->getChipId(ich, lay, hba, sta, ssta, modd, chip);
57 AlignableVolume* parVol = sym2vol[modd < 0 ? geom->composeSymNameStave(lay, hba, sta) : geom->composeSymNameModule(lay, hba, sta, ssta, modd)];
59 LOGP(fatal,
"did not find parent for chip {}", ich);
61 int nch = modd < 0 ? geom->getNumberOfChipsPerStave(lay) : geom->getNumberOfChipsPerModule(lay);
65 sensorMap[lbl] = chip;
72 uint32_t gLbl{0}, det{0};
74 AlignableVolume *volHB{
nullptr}, *volSt{
nullptr}, *volHSt{
nullptr}, *volMod{
nullptr};
75 std::unordered_map<std::string, AlignableVolume*> sym2vol;
77 auto root = std::make_unique<AlignableVolume>(geom->composeSymNameITS(), gLbl++, det,
false);
78 sym2vol[root->getSymName()] = root.get();
79 for (
int ilr = 0; ilr < geom->getNumberOfLayers(); ilr++) {
80 const bool isLayITS3 = (ilr < 3);
81 for (
int ihb = 0; ihb < geom->getNumberOfHalfBarrels(); ihb++) {
82 volHB = root->addChild(geom->composeSymNameHalfBarrel(ilr, ihb, isLayITS3), gLbl++, det,
false);
83 sym2vol[volHB->getSymName()] = volHB;
85 volHB->setSensorId((2 * ilr) + ihb);
88 int nstavesHB = geom->getNumberOfStaves(ilr) / 2;
89 for (
int ist = 0; ist < nstavesHB; ist++) {
90 volSt = volHB->addChild(geom->composeSymNameStave(ilr, ihb, ist), gLbl++, det,
false);
91 sym2vol[volSt->getSymName()] = volSt;
92 for (
int ihst = 0; ihst < geom->getNumberOfHalfStaves(ilr); ihst++) {
93 volHSt = volSt->addChild(geom->composeSymNameHalfStave(ilr, ihb, ist, ihst), gLbl++, det,
false);
94 sym2vol[volHSt->getSymName()] = volHSt;
95 for (
int imd = 0; imd < geom->getNumberOfModules(ilr); imd++) {
96 volMod = volHSt->addChild(geom->composeSymNameModule(ilr, ihb, ist, ihst, imd), gLbl++, det,
false);
97 sym2vol[volMod->getSymName()] = volMod;
104 int lay = 0, hba = 0, sta = 0, ssta = 0, modd = 0, chip = 0;
105 for (
int ich = 0; ich < geom->getNumberOfChips(); ich++) {
106 geom->getChipId(ich, lay, hba, sta, ssta, modd, chip);
107 const bool isLayITS3 = (lay < 3);
111 AlignableVolume* parVol = sym2vol[geom->composeSymNameHalfBarrel(lay, hba,
true)];
113 LOGP(fatal,
"did not find parent for chip {}", ich);
117 tile->setSensorId(ich);
118 sensorMap[lbl] = tile;
120 AlignableVolume* parVol = sym2vol[modd < 0 ? geom->composeSymNameStave(lay, hba, sta) : geom->composeSymNameModule(lay, hba, sta, ssta, modd)];
122 LOGP(fatal,
"did not find parent for chip {}", ich);
124 int nch = modd < 0 ? geom->getNumberOfChipsPerStave(lay) : geom->getNumberOfChipsPerModule(lay);
128 sensorMap[lbl] = chip;
134void AlignableSensorITS::defineMatrixL2G()
137 const auto* chipL2G =
mPN->GetMatrix();
140 TGeoTranslation tra(0., 0.5 * delta, 0.);
144void AlignableSensorITS::defineMatrixT2L()
146 double locA[3] = {-100., 0., 0.}, locB[3] = {100., 0., 0.}, gloA[3], gloB[3];
147 mL2G.LocalToMaster(locA, gloA);
148 mL2G.LocalToMaster(locB, gloB);
149 double dx = gloB[0] - gloA[0], dy = gloB[1] - gloA[1];
150 double t = (gloB[0] * dx + gloB[1] * dy) / (dx * dx + dy * dy);
151 double xp = gloB[0] - (dx * t), yp = gloB[1] - (dy * t);
152 double alp = std::atan2(yp, xp);
153 o2::math_utils::bringTo02Pid(alp);
154 mT2L.RotateZ(alp * TMath::RadToDeg());
155 const TGeoHMatrix l2gI =
mL2G.Inverse();
156 mT2L.MultiplyLeft(l2gI);
159void AlignableSensorITS::computeJacobianL2T(
const double* posLoc,
Matrix66& jac)
const
162 Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>> rotT2L(
mT2L.GetRotationMatrix());
163 Eigen::Matrix3d skew, rotL2T = rotT2L.transpose();
164 skew << 0, -posLoc[2], posLoc[1], posLoc[2], 0, -posLoc[0], -posLoc[1], posLoc[0], 0;
165 jac.topLeftCorner<3, 3>() = rotL2T;
166 jac.topRightCorner<3, 3>() = -rotL2T * skew;
167 jac.bottomRightCorner<3, 3>() = rotL2T;
170void AlignableSensorIT3::defineMatrixL2G()
175void AlignableSensorIT3::defineMatrixT2L()
177 double locA[3] = {-100., 0., 0.}, locB[3] = {100., 0., 0.}, gloA[3], gloB[3];
178 mL2G.LocalToMaster(locA, gloA);
179 mL2G.LocalToMaster(locB, gloB);
180 double dx = gloB[0] - gloA[0], dy = gloB[1] - gloA[1];
181 double t = (gloB[0] * dx + gloB[1] * dy) / (dx * dx + dy * dy);
182 double xp = gloB[0] - (dx * t), yp = gloB[1] - (dy * t);
183 double alp = std::atan2(yp, xp);
184 o2::math_utils::bringTo02Pid(alp);
185 mT2L.RotateZ(alp * TMath::RadToDeg());
186 const TGeoHMatrix l2gI =
mL2G.Inverse();
187 mT2L.MultiplyLeft(l2gI);
190void AlignableSensorIT3::computeJacobianL2T(
const double* posLoc,
Matrix66& jac)
const
193 Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor>> rotT2L(
mT2L.GetRotationMatrix());
194 Eigen::Matrix3d skew, rotL2T = rotT2L.transpose();
195 skew << 0, -posLoc[2], posLoc[1], posLoc[2], 0, -posLoc[0], -posLoc[1], posLoc[0], 0;
196 jac.topLeftCorner<3, 3>() = rotL2T;
197 jac.topRightCorner<3, 3>() = -rotL2T * skew;
198 jac.bottomRightCorner<3, 3>() = rotL2T;
Definition of the GeometryTGeo class.
Definition of the SegmentationAlpide class.
void setSensorId(int id) noexcept
AlignableVolume * addChild(const char *symName, uint32_t label, uint32_t det, bool sens)
std::unique_ptr< AlignableVolume > Ptr
void setPseudo(bool p) noexcept
std::map< GlobalLabel, AlignableVolume * > SensorMapping
static GeometryTGeo * Instance()
static constexpr float SensorLayerThickness
static constexpr float SensorLayerThicknessEff
AlignableVolume::Ptr buildHierarchyITS(AlignableVolume::SensorMapping &sensorMap)
Eigen::Matrix< double, 6, 6 > Matrix66
AlignableVolume::Ptr buildHierarchyIT3(AlignableVolume::SensorMapping &sensorMap)