Project
Loading...
Searching...
No Matches
Mapping.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16#include "MIDBase/Mapping.h"
17
18#include <cassert>
19#include <iostream>
22
23namespace o2
24{
25namespace mid
26{
27//______________________________________________________________________________
28Mapping::Mapping() : mDetectionElements(), mBoardIndexes()
29{
31 init();
32}
33
34//______________________________________________________________________________
35void Mapping::init()
36{
38
39 buildDETypeLarge(0, {{1, 17, 39, 61, 77, 93, 109}});
40 buildDETypeMedium(1, {{2, 18, 40, 62, 78, 94, 110}}, true);
41 buildDETypeMedium(2, {{4, 20, 42, 64, 80, 96, 111}}, false);
42 buildDETypeCut(3, {{6, 22, 44, 66, 82, 98, 112}}, true);
43 buildDETypeShort(4, {{0, 26, 48, 68, 84, 100, 113}});
44 buildDETypeCut(5, {{9, 30, 52, 70, 86, 102, 114}}, false);
45 buildDETypeMedium(6, {{12, 34, 56, 72, 88, 104, 115}}, false);
46 buildDETypeMedium(7, {{14, 36, 58, 74, 90, 106, 116}}, true);
47 buildDETypeLarge(8, {{16, 38, 60, 76, 92, 108, 117}});
48}
49
50//______________________________________________________________________________
51void Mapping::setupSegmentation(int rpcLine, int column, int nStripsNBP, int stripPitchNBP, int nBoardsBP,
52 int firstBoardId, bool isBelowBeamPipe)
53{
55 MpColumn& columnStruct{mDetectionElements[rpcLine].columns[column]};
56 columnStruct.nStripsNBP = nStripsNBP;
57 columnStruct.stripPitchNBP = stripPitchNBP;
58 columnStruct.stripPitchBP = (nBoardsBP > 0) ? 4 / nBoardsBP : 0;
59 int nBoardsBPtot = nBoardsBP;
60 if (nBoardsBP == 3) {
61 nBoardsBPtot = 4;
62 if (!isBelowBeamPipe) {
63 --firstBoardId;
64 }
65 }
66
67 for (int iboard = 0; iboard < nBoardsBPtot; ++iboard) {
68 int boardIdx = firstBoardId + iboard - 1;
69 if (nBoardsBP == 3) {
70 if ((isBelowBeamPipe && iboard == 3) || (!isBelowBeamPipe && iboard == 0)) {
71 boardIdx = 117;
72 }
73 }
74 columnStruct.boardsBP.push_back(boardIdx);
75 mBoardIndexes[boardIdx].deType = (boardIdx < 117) ? rpcLine : 0;
76 mBoardIndexes[boardIdx].column = (boardIdx < 117) ? column : 0;
77 mBoardIndexes[boardIdx].line = (boardIdx < 117) ? iboard : 0;
78 }
79}
80
81//______________________________________________________________________________
82void Mapping::setupSegmentationLastColumn(int rpcLine, int boardId)
83{
86 setupSegmentation(rpcLine, 6, 16, 4, 1, boardId);
87}
88
89//______________________________________________________________________________
90void Mapping::buildDETypeLarge(int rpcLine, std::array<int, 7> boards)
91{
93 for (int icolumn = 0; icolumn < 6; ++icolumn) {
94 setupSegmentation(rpcLine, icolumn, 8, 4, 1, boards[icolumn]);
95 }
96 setupSegmentationLastColumn(rpcLine, boards[6]);
97}
98
99//______________________________________________________________________________
100void Mapping::buildDETypeMedium(int rpcLine, std::array<int, 7> boards, bool largeNonBend)
101{
103 int stripPitchNBP = largeNonBend ? 4 : 2;
104 int nStripsNBP = 32 / stripPitchNBP;
105 for (int icolumn = 0; icolumn < 5; ++icolumn) {
106 setupSegmentation(rpcLine, icolumn, nStripsNBP, stripPitchNBP, 2, boards[icolumn]);
107 }
108 setupSegmentation(rpcLine, 5, 8, 4, 2, boards[5]);
109 setupSegmentationLastColumn(rpcLine, boards[6]);
110}
111
112//______________________________________________________________________________
113void Mapping::buildDETypeCut(int rpcLine, std::array<int, 7> boards, bool isBelowBeamPipe)
114{
116 setupSegmentation(rpcLine, 0, 16, 2, 3, boards[0], isBelowBeamPipe);
117 for (int icolumn = 1; icolumn < 6; ++icolumn) {
118 int nBoardsBP = (icolumn < 3) ? 4 : 2;
119 int stripPitchNBP = (icolumn < 5) ? 2 : 4;
120 setupSegmentation(rpcLine, icolumn, 32 / stripPitchNBP, stripPitchNBP, nBoardsBP, boards[icolumn]);
121 }
122 setupSegmentationLastColumn(rpcLine, boards[6]);
123}
124
125//______________________________________________________________________________
126void Mapping::buildDETypeShort(int rpcLine, std::array<int, 7> boards)
127{
129 setupSegmentation(rpcLine, 0, 0, 0, 0, boards[0]);
130 setupSegmentation(rpcLine, 1, 8, 2, 4, boards[1]);
131 for (int icolumn = 2; icolumn < 6; ++icolumn) {
132 int nBoardsBP = (icolumn < 3) ? 4 : 2;
133 int stripPitchNBP = (icolumn < 5) ? 2 : 4;
134 setupSegmentation(rpcLine, icolumn, 32 / stripPitchNBP, stripPitchNBP, nBoardsBP, boards[icolumn]);
135 }
136 setupSegmentationLastColumn(rpcLine, boards[6]);
137}
138
139//______________________________________________________________________________
140double Mapping::getStripSize(int strip, int cathode, int column, int deId) const
141{
147 int rpcLine = detparams::getRPCLine(deId);
148 int ichamber = detparams::getChamber(deId);
149 int stripPitch = (cathode == 0) ? mDetectionElements[rpcLine].columns[column].stripPitchBP
150 : mDetectionElements[rpcLine].columns[column].stripPitchNBP;
151 if (cathode == 0) {
152 strip = 0;
153 }
154
155 return getStripSize(ichamber, stripPitch, strip);
156}
157
158//______________________________________________________________________________
159int Mapping::getNStripsNBP(int column, int deId) const
160{
164 int rpcLine = detparams::getRPCLine(deId);
165 return mDetectionElements[rpcLine].columns[column].nStripsNBP;
166}
167
168//______________________________________________________________________________
169int Mapping::getFirstColumn(int deId) const
170{
173 int rpcLine = detparams::getRPCLine(deId);
174 return (rpcLine == 4) ? 1 : 0;
175}
176
177//______________________________________________________________________________
178int Mapping::getFirstBoardBP(int column, int deId) const
179{
183 int rpcLine = detparams::getRPCLine(deId);
184 return ((mDetectionElements[rpcLine].columns[column].boardsBP[0] == 117) ? 1 : 0);
185}
186
187//______________________________________________________________________________
188int Mapping::getLastBoardBP(int column, int deId) const
189{
193 int rpcLine = detparams::getRPCLine(deId);
194 int lastBoard = mDetectionElements[rpcLine].columns[column].boardsBP.size() - 1;
195 if (column == 0 && rpcLine == 3) {
196 --lastBoard;
197 }
198 return lastBoard;
199}
200
201//______________________________________________________________________________
202int Mapping::getBoardId(int line, int column, int deId, bool warn) const
203{
209 int rpcLine = detparams::getRPCLine(deId);
210 if (line < mDetectionElements[rpcLine].columns[column].boardsBP.size()) {
211 int boardIdx = mDetectionElements[rpcLine].columns[column].boardsBP[line];
212 if (boardIdx < 117) {
213 int boardId = boardIdx + 1;
214 if (deId >= 36) {
215 boardId += 117;
216 }
217 return boardId;
218 }
219 }
220 if (warn) {
221 std::cerr << "Cannot find local board in DE " << deId << " column " << column << " line " << line << std::endl;
222 }
223 return 0;
224}
225
226//______________________________________________________________________________
227std::vector<Mapping::MpStripIndex> Mapping::getNeighbours(const Mapping::MpStripIndex& stripIndex, int cathode,
228 int deId) const
229{
234
235 int rpcLine = detparams::getRPCLine(deId);
236 return (cathode == 0) ? getNeighboursBP(stripIndex, rpcLine) : getNeighboursNBP(stripIndex, rpcLine);
237}
238
239//______________________________________________________________________________
240std::vector<Mapping::MpStripIndex> Mapping::getNeighboursNBP(const Mapping::MpStripIndex& stripIndex, int rpcLine) const
241{
243 std::vector<MpStripIndex> neighbours;
244 MpStripIndex neigh;
245 for (int delta = -1; delta <= 1; delta += 2) {
246 neigh.column = stripIndex.column;
247 neigh.line = stripIndex.line;
248 neigh.strip = stripIndex.strip + delta;
249 if (neigh.strip < 0) {
250 if (stripIndex.column == 0 || (stripIndex.column == 1 && rpcLine == 4)) {
251 continue;
252 }
253 --neigh.column;
254 if (!isValidLine(neigh.line, neigh.column, rpcLine)) {
255 // This is useful for cut RPCs
256 continue;
257 }
258 neigh.strip = mDetectionElements[rpcLine].columns[neigh.column].nStripsNBP - 1;
259 } else if (neigh.strip >= mDetectionElements[rpcLine].columns[stripIndex.column].nStripsNBP) {
260 if (stripIndex.column == 6) {
261 continue;
262 }
263 ++neigh.column;
264 neigh.strip = 0;
265 }
266 neighbours.push_back(neigh);
267 }
268 return neighbours;
269}
270
271//______________________________________________________________________________
272std::vector<Mapping::MpStripIndex> Mapping::getNeighboursBP(const Mapping::MpStripIndex& stripIndex, int rpcLine) const
273{
275 std::vector<MpStripIndex> neighbours;
276 MpStripIndex neigh;
277 // First search in the same column
278 for (int delta = -1; delta <= 1; delta += 2) {
279 neigh.column = stripIndex.column;
280 neigh.line = stripIndex.line;
281 neigh.strip = stripIndex.strip + delta;
282 if (neigh.strip < 0) {
283 --neigh.line;
284 if (!isValidLine(neigh.line, neigh.column, rpcLine)) {
285 continue;
286 }
287 neigh.strip = 15;
288 } else if (neigh.strip >= detparams::NStripsBP) {
289 ++neigh.line;
290 if (!isValidLine(neigh.line, neigh.column, rpcLine)) {
291 continue;
292 }
293 neigh.strip = 0;
294 }
295 neighbours.push_back(neigh);
296 }
297
298 // Then search in the neighbour columns
299 int stripPitch = mDetectionElements[rpcLine].columns[stripIndex.column].stripPitchBP;
300 for (int delta = -1; delta <= 1; delta += 2) {
301 neigh.column = stripIndex.column + delta;
302 if (!isValidColumn(neigh.column, rpcLine)) {
303 continue;
304 }
305 int stripPitchNeigh = mDetectionElements[rpcLine].columns[neigh.column].stripPitchBP;
306 int absStripNeigh = (detparams::NStripsBP * stripIndex.line + stripIndex.strip) * stripPitch / stripPitchNeigh;
307 neigh.line = absStripNeigh / detparams::NStripsBP;
308 if (!isValidLine(neigh.line, neigh.column, rpcLine)) {
309 continue;
310 }
311 neigh.strip = absStripNeigh % detparams::NStripsBP;
312 neighbours.push_back(neigh);
313 if (stripPitch > stripPitchNeigh) {
314 neigh.strip = (neigh.strip % 2 == 0) ? neigh.strip + 1 : neigh.strip - 1;
315 neighbours.push_back(neigh);
316 }
317 }
318
319 return neighbours;
320}
321
322//______________________________________________________________________________
323Mapping::MpStripIndex Mapping::nextStrip(const MpStripIndex& stripIndex, int cathode, int deId, bool descending) const
324{
330 MpStripIndex neigh = stripIndex;
331 int rpcLine = detparams::getRPCLine(deId);
332 int step = (descending) ? -1 : 1;
333 neigh.strip = stripIndex.strip + step;
334 int nStrips = (cathode == 0) ? detparams::NStripsBP : mDetectionElements[rpcLine].columns[neigh.column].nStripsNBP;
335 if (neigh.strip < 0 || neigh.strip >= nStrips) {
336 bool isOk = false;
337 if (cathode == 0) {
338 neigh.line += step;
339 isOk = isValidLine(neigh.line, neigh.column, rpcLine);
340 } else {
341 neigh.column += step;
342 isOk = isValidColumn(neigh.column, rpcLine);
343 }
344 if (isOk) {
345 if (neigh.strip < 0) {
346 if (cathode == 1) {
347 nStrips = mDetectionElements[rpcLine].columns[neigh.column].nStripsNBP;
348 }
349 neigh.strip = nStrips - 1;
350 } else {
351 neigh.strip = 0;
352 }
353 } else {
354 neigh.column = 100;
355 }
356 }
357 return neigh;
358}
359
360//______________________________________________________________________________
361bool Mapping::isValid(int deId, int column, int cathode, int line, int strip) const
362{
369 if (deId < 0 || deId >= 72) {
370 return false;
371 }
372 int rpcLine = detparams::getRPCLine(deId);
373 if (!isValidColumn(column, rpcLine)) {
374 return false;
375 }
376 if (!isValidLine(line, column, rpcLine)) {
377 return false;
378 }
379
380 int nStrips = (cathode == 0) ? detparams::NStripsBP : mDetectionElements[rpcLine].columns[column].nStripsNBP;
381 if (strip < 0 || strip >= nStrips) {
382 return false;
383 }
384
385 return true;
386}
387
388//______________________________________________________________________________
389bool Mapping::isValidColumn(int column, int rpcLine) const
390{
392 if (column < 0 || column > 6 || (rpcLine == 4 && column == 0)) {
393 return false;
394 }
395
396 return true;
397}
398
399//______________________________________________________________________________
400bool Mapping::isValidLine(int line, int column, int rpcLine) const
401{
403 auto& columnStruct{mDetectionElements[rpcLine].columns[column]};
404
405 if (line >= columnStruct.boardsBP.size() || columnStruct.boardsBP[line] == 117) {
406 return false;
407 }
408
409 return true;
410}
411
412//______________________________________________________________________________
413double Mapping::getStripSize(int chamber, int stripPitch, int strip) const
414{
416 if (strip > 7 && stripPitch == 4) {
417 stripPitch = 2;
418 }
419 return geoparams::getStripUnitPitchSize(chamber) * stripPitch;
420}
421
422//______________________________________________________________________________
423double Mapping::getColumnLeftPosition(int column, int chamber, int rpcLine) const
424{
426 double xCenter = geoparams::getRPCHalfLength(chamber, rpcLine);
427 double col = (double)column;
428 if (rpcLine == 4) {
429 col += (column == 1) ? -1. : -1.5;
430 }
431 return geoparams::getLocalBoardWidth(chamber) * col - xCenter;
432}
433
434//______________________________________________________________________________
435double Mapping::getColumnBottomPosition(int column, int chamber, int rpcLine) const
436{
438 double nBoardsDown = (rpcLine == 5 && column == 0) ? 1. : 2.;
439 return -geoparams::getLocalBoardHeight(chamber) * nBoardsDown;
440}
441
442//______________________________________________________________________________
443double Mapping::getColumnHeight(int column, int chamber, int rpcLine) const
444{
446 double sizeFactor = 1.;
447 if (column == 0 && (rpcLine == 3 || rpcLine == 5)) {
448 sizeFactor = 0.75;
449 }
450 return 4 * geoparams::getLocalBoardHeight(chamber) * sizeFactor;
451}
452
453//______________________________________________________________________________
454double Mapping::getColumnWidth(int column, int chamber, int rpcLine) const
455{
457 double sizeFactor = 1.;
458 if (column == 6) {
459 sizeFactor = 1.5;
460 } else if (column == 1 && rpcLine == 4) {
461 sizeFactor = 0.5;
462 }
463 return geoparams::getLocalBoardWidth(chamber) * sizeFactor;
464}
465
466//______________________________________________________________________________
467double Mapping::getStripLowEdge(int strip, int stripPitch, int line, int chamber) const
468{
470 return (geoparams::getStripUnitPitchSize(chamber) * stripPitch * (strip + detparams::NStripsBP * line) -
471 2. * geoparams::getLocalBoardHeight(chamber));
472}
473
474//______________________________________________________________________________
475double Mapping::getStripLeftEdge(int strip, int stripPitch, int column, int chamber, int rpcLine) const
476{
478 if (column == 6 && strip > 7) {
479 column = 7;
480 strip = strip - 8;
481 stripPitch = 2;
482 }
483 return getStripSize(chamber, stripPitch) * strip + getColumnLeftPosition(column, chamber, rpcLine);
484}
485
486//______________________________________________________________________________
487MpArea Mapping::stripByLocation(int strip, int cathode, int line, int column, int deId, bool warn) const
488{
496 int deType = detparams::getRPCLine(deId);
497 int chamber = detparams::getChamber(deId);
498 assert(strip < 16);
499 auto& columnStruct{mDetectionElements[deType].columns[column]};
500
501 double x1 = 0., y1 = 0., x2 = 0., y2 = 0.;
502
503 if (cathode == 0) {
504 x1 = getColumnLeftPosition(column, chamber, deType);
505 x2 = x1 + getColumnWidth(column, chamber, deType);
506 // y1 = ((boardIndex.line - column.boardsBP.size() / 2) * 8 + strip) * stripSizeBP;
507 y1 = getStripLowEdge(strip, columnStruct.stripPitchBP, line, chamber);
508 y2 = y1 + getStripSize(chamber, columnStruct.stripPitchBP);
509 } else if (strip < columnStruct.nStripsNBP) {
510 // double yDim = 0.5 * column.boardsBP.size() * 16. * getStripSize(chamber, column.stripPitchBP);
511 y1 = getColumnBottomPosition(column, chamber, deType);
512 // y2 = y1 + 16 * getStripSize(chamber, column.stripPitchBP) * column.boardsBP.size();
513 y2 = y1 + getColumnHeight(column, chamber, deType);
514 // double stripSizeNBP = getStripSize(chamber, column.stripPitchNBP,strip);
515 // x1 = column.xCenter + (strip - column.nStripsNBP / 2) * pitchNBP;
516 x1 = getStripLeftEdge(strip, columnStruct.stripPitchNBP, column, chamber, deType);
517 x2 = x1 + getStripSize(chamber, columnStruct.stripPitchNBP, strip);
518 } else if (warn) {
519 std::cout << "Warning: no non-bending strip " << strip << " in column " << column << " of DE " << deId << std::endl;
520 }
521
522 return MpArea(x1, y1, x2, y2);
523}
524
525//______________________________________________________________________________
526MpArea Mapping::stripByLocationInBoard(int strip, int cathode, int boardId, int chamber, bool warn) const
527{
534 assert(boardId <= 234);
535 auto& boardIndex{mBoardIndexes[(boardId - 1) % 117]};
536 int deId = boardIndex.deType + 9 * chamber;
537 if (boardId > 117) {
538 deId += 36;
539 }
540 return stripByLocation(strip, cathode, boardIndex.line, boardIndex.column, deId, warn);
541}
542
543//______________________________________________________________________________
544int Mapping::getColumn(double xPos, int chamber, int rpcLine) const
545{
547 double xShift = xPos + geoparams::getRPCHalfLength(chamber, rpcLine);
548 int invalid = 7;
549 if (xShift < 0) {
550 return invalid;
551 }
552 double boardUnitWidth = geoparams::getLocalBoardWidth(chamber);
553 if (rpcLine == 4) {
554 xShift += 1.5 * boardUnitWidth;
555 }
556 double column = xShift / boardUnitWidth;
557 if (column > 7.5) {
558 return invalid;
559 } else if (column > 6) {
560 return 6;
561 }
562
563 return (int)column;
564}
565
566//______________________________________________________________________________
567int Mapping::getLine(double yPos, const MpColumn& column, int chamber) const
568{
570 unsigned long int nBoards = column.boardsBP.size();
571 int invalid = 4;
572 if (nBoards == 0) {
573 return invalid;
574 }
575 double boardUnitHeight = geoparams::getLocalBoardHeight(chamber);
576 double yShift = yPos + 2. * boardUnitHeight;
577 if (yShift < 0) {
578 return invalid;
579 }
580 double boardHeight = boardUnitHeight * 4 / nBoards;
581 int iline = (int)(yShift / boardHeight);
582 if (iline >= nBoards) {
583 return invalid;
584 }
585 if (column.boardsBP[iline] == 117) {
586 return invalid;
587 }
588 return iline;
589}
590
591//______________________________________________________________________________
592Mapping::MpStripIndex Mapping::stripByPosition(double xPos, double yPos, int cathode, int deId, bool warn) const
593{
600 assert(deId < detparams::NDetectionElements);
601 int rpcLine = detparams::getRPCLine(deId);
602 int chamber = detparams::getChamber(deId);
603 MpStripIndex stripIndex;
604 stripIndex.column = getColumn(xPos, chamber, rpcLine);
605 stripIndex.line = 4;
606 stripIndex.strip = 16;
607
608 if (stripIndex.column >= 7) {
609 if (warn) {
610 std::cout << "Warning: xPos " << xPos << " not inside RPC " << deId << std::endl;
611 }
612 return stripIndex;
613 }
614
615 const auto& column{mDetectionElements[rpcLine].columns[stripIndex.column]};
616 stripIndex.line = getLine(yPos, column, chamber);
617 if (stripIndex.line >= 4) {
618 if (warn) {
619 std::cout << "Warning: yPos " << yPos << " not inside RPC " << deId << std::endl;
620 }
621 return stripIndex;
622 }
623
624 if (cathode == 0) {
625 double yBoardLow = geoparams::getLocalBoardHeight(chamber) * (stripIndex.line * 4 / column.boardsBP.size() - 2.);
626 double stripSize = getStripSize(chamber, column.stripPitchBP);
627 stripIndex.strip = (int)((yPos - yBoardLow) / stripSize);
628 } else {
629 double xBoardLeft = getColumnLeftPosition(stripIndex.column, chamber, rpcLine);
630 double stripSize = getStripSize(chamber, column.stripPitchNBP);
631 double diff = xPos - xBoardLeft;
632 int stripOffset = 0;
633 if (stripIndex.column == 6) {
634 double offset = 8. * stripSize;
635 if (diff > offset) {
636 diff -= offset;
637 stripSize = stripSize / 2.;
638 stripOffset = 8;
639 }
640 }
641 stripIndex.strip = (int)(diff / stripSize) + stripOffset;
642 }
643 return stripIndex;
644}
645
646} // namespace mid
647} // namespace o2
Useful detector parameters for MID.
Useful geometrical parameters for MID.
Mapping for MID.
uint32_t col
Definition RawData.h:4
int getNStripsNBP(int column, int deId) const
Definition Mapping.cxx:159
int getBoardId(int line, int column, int deId, bool warn=true) const
Definition Mapping.cxx:202
int getFirstColumn(int deId) const
Definition Mapping.cxx:169
bool isValid(int deId, int column, int cathode=0, int line=0, int strip=0) const
Definition Mapping.cxx:361
MpStripIndex stripByPosition(double xPos, double yPos, int cathode, int deId, bool warn=true) const
Definition Mapping.cxx:592
MpArea stripByLocationInBoard(int strip, int cathode, int boardId, int chamber, bool warn=true) const
Definition Mapping.cxx:526
int getLastBoardBP(int column, int deId) const
Definition Mapping.cxx:188
int getFirstBoardBP(int column, int deId) const
Definition Mapping.cxx:178
double getStripSize(int strip, int cathode, int column, int deId) const
Definition Mapping.cxx:140
MpArea stripByLocation(int strip, int cathode, int line, int column, int deId, bool warn=true) const
Definition Mapping.cxx:487
std::vector< MpStripIndex > getNeighbours(const Mapping::MpStripIndex &stripIndex, int cathode, int deId) const
Definition Mapping.cxx:227
MpStripIndex nextStrip(const MpStripIndex &stripIndex, int cathode, int deId, bool descending=false) const
Definition Mapping.cxx:323
GLuint GLfloat GLfloat GLfloat GLfloat y1
Definition glcorearb.h:5034
GLuint GLfloat GLfloat GLfloat x1
Definition glcorearb.h:5034
GLintptr offset
Definition glcorearb.h:660
constexpr int NDetectionElements
Number of RPCs.
constexpr int NStripsBP
Number of strips in the Bending Plane.
double getLocalBoardWidth(int chamber)
double getLocalBoardHeight(int chamber)
double getStripUnitPitchSize(int chamber)
double getRPCHalfLength(int chamber, int rpc)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Indexes required to define a strip in the detection element.
Definition Mapping.h:34
int strip
Line of the local board in the column.
Definition Mapping.h:39
int line
Column in the DE.
Definition Mapping.h:38