96 int nHStaves = gm->getNumberOfHalfStaves(
id);
97 int nStaves = gm->getNumberOfStaves(
id);
100 int nCh = gm->getNumberOfChipsPerLayer(
id), chip0 = gm->getFirstChipIndex(
id);
101 int nChMod = gm->getNumberOfChipsPerModule(
id), nChModH = nChMod / 2;
102 nLadders = nHStaves > 1 ? nStaves * nHStaves * 2 : nStaves;
103 ladders.resize(nLadders);
105 for (
auto lad : ladders) {
106 lad.chips.reserve(gm->getNumberOfChipsPerHalfStave(
id) / (
id > 2 ? 2 : 1));
108 for (
int ich = 0; ich < nCh; ich++) {
109 int chipID = chip0 + ich, lay, sta, ssta, mod, chipInMod;
110 gm->getChipId(chipID, lay, sta, ssta, mod, chipInMod);
113 int modUpper = chipInMod / nChModH;
114 ladID = sta * 4 + ssta * 2 + modUpper;
116 auto& ladder = ladders[ladID];
117 auto& chip = ladder.chips.emplace_back();
119 gm->getSensorXAlphaRefPlane(chipID, chip.xRef, chip.alp);
120 o2::math_utils::sincos(chip.alp, chip.snAlp, chip.csAlp);
123 auto edgeTra = gm->getMatrixT2L(chipID) ^ (edgeLoc);
124 chip.updateLimits(edgeTra);
125 auto edgeGloM = gm->getMatrixT2GRot(chipID)(edgeTra);
126 updateLimits(edgeGloM);
127 ladder.updateLimits(edgeGloM);
129 edgeLoc.SetXYZ(dxH, 0.f, dzH);
130 edgeTra = gm->getMatrixT2L(chipID) ^ (edgeLoc);
131 chip.updateLimits(edgeTra);
132 auto edgeGloP = gm->getMatrixT2GRot(chipID)(edgeTra);
133 updateLimits(edgeGloP);
134 ladder.updateLimits(edgeGloP);
135 chip.xyEdges.setEdges(edgeGloM.X(), edgeGloM.Y(), edgeGloP.X(), edgeGloP.Y());
139 std::sort(ladders.begin(), ladders.end(), [](
auto&
a,
auto&
b) {
140 float pha = a.phiMean, phb = b.phiMean;
141 o2::math_utils::bringTo02Pi(pha);
142 o2::math_utils::bringTo02Pi(phb);
147 for (
int i = nLadders;
i--;) {
148 auto& lad = ladders[
i];
149 std::sort(lad.chips.begin(), lad.chips.end(), [](
auto&
a,
auto&
b) { return a.zRange.getMin() < b.zRange.getMin(); });
154 for (
int i = nLadders;
i--;) {
155 auto& lad = ladders[
i];
156 auto& plad =
i > 0 ? ladders[
i - 1] : ladders[nLadders - 1];
158 int tlay, tsta, tssta, tmod, tchipInMod;
159 int play, psta, pssta, pmod, pchipInMod;
160 gm->getChipId(lad.chips.front().id, tlay, tsta, tssta, tmod, tchipInMod);
161 gm->getChipId(plad.chips.front().id, play, psta, pssta, pmod, pchipInMod);
162 if (tsta == psta && tssta == pssta) {
169 float phi0 = std::atan2(lad.xyEdges.getY0(), lad.xyEdges.getX0());
170 float phi1 = std::atan2(lad.xyEdges.getY1(), lad.xyEdges.getX1());
171 o2::math_utils::bringTo02Pi(phi0);
172 o2::math_utils::bringTo02Pi(phi1);
174 lad.xyEdges.getX0() * lad.xyEdges.getX0() + lad.xyEdges.getY0() * lad.xyEdges.getY0()
175 : lad.xyEdges.getX1() * lad.xyEdges.getX1() + lad.xyEdges.getY1() * lad.xyEdges.getY1();
177 phi0 = std::atan2(plad.xyEdges.getY0(), plad.xyEdges.getX0());
178 phi1 = std::atan2(plad.xyEdges.getY1(), plad.xyEdges.getX1());
179 o2::math_utils::bringTo02Pi(phi0);
180 o2::math_utils::bringTo02Pi(phi1);
182 plad.xyEdges.getX1() * plad.xyEdges.getX1() + plad.xyEdges.getY1() * plad.xyEdges.getY1()
183 : plad.xyEdges.getX0() * plad.xyEdges.getX0() + plad.xyEdges.getY0() * plad.xyEdges.getY0();
188 int nPhiBins = nLadders * 3;
189 phi2ladder.resize(nPhiBins + 1);
192 for (
int i = 0;
i < nPhiBins;
i++) {
193 float phi = (0.5 +
i) * dphi;
195 while (laddId < nLadders) {
196 const auto& lad = ladders[laddId];
197 auto rel = lad.isPhiOutside(phi);
203 phi2ladder[
i] = laddId % nLadders;
205 phi2ladder[nPhiBins] = phi2ladder[0];
207 lastChipInLadder = ladders[0].chips.size();
208 z2chipID = lastChipInLadder / zRange.delta();
210 rInv = 1. / rRange.mean();