Project
Loading...
Searching...
No Matches
IDCGroupHelperRegion.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
13#include "TPCBase/Mapper.h"
15#include "TFile.h"
16#include <numeric>
17#include <fmt/format.h>
18
19unsigned int o2::tpc::IDCGroupHelperRegion::getGlobalPadNumber(const unsigned int ulrow, const unsigned int pad) const
20{
21 return Mapper::getGlobalPadNumber(ulrow, pad, mRegion);
22}
23
24unsigned int o2::tpc::IDCGroupHelperRegion::getGroupedRow(const unsigned int ulrow, const unsigned int groupRows, const unsigned int groupedrows)
25{
26 const unsigned int row = ulrow / groupRows;
27 return (row >= groupedrows) ? (groupedrows - 1) : row;
28}
29
30unsigned int o2::tpc::IDCGroupHelperRegion::getGroupedPad(const unsigned int upad, const unsigned int ulrow, const unsigned int region, const unsigned int groupPads, const unsigned int groupRows, const unsigned int groupedrows, const unsigned int groupPadsSectorEdges, const std::vector<unsigned int>& padsPerRow)
31{
32 const int relPadHalf = static_cast<int>(std::floor((upad - 0.5f * Mapper::PADSPERROW[region][ulrow]) / groupPads));
33 const unsigned int nGroupedPads = padsPerRow[getGroupedRow(ulrow, groupRows, groupedrows)];
34 const unsigned int nGroupedPadsHalf = (nGroupedPads / 2);
35 if (std::abs(relPadHalf) >= nGroupedPadsHalf) {
36 return std::signbit(relPadHalf) ? 0 : nGroupedPads - 1;
37 }
38 return static_cast<unsigned int>(static_cast<int>(nGroupedPadsHalf) + relPadHalf);
39}
40
41bool o2::tpc::IDCGroupHelperRegion::isSectorEdgePad(const unsigned int upad, const unsigned int ulrow, const unsigned int region, const unsigned int groupPadsSectorEdges)
42{
43 return (upad < ParameterIDCGroup::getTotalGroupPadsSectorEdges(groupPadsSectorEdges) || (upad >= Mapper::PADSPERROW[region][ulrow] - ParameterIDCGroup::getTotalGroupPadsSectorEdges(groupPadsSectorEdges))) ? true : false;
44}
45
46int o2::tpc::IDCGroupHelperRegion::getOffsetForEdgePad(const unsigned int upad, const unsigned int ulrow, const unsigned int groupRows, const unsigned int groupPadsSectorEdges, const unsigned int region, const int lastRow)
47{
48 const auto edgePadGroupingType = ParameterIDCGroup::getEdgePadGroupingType(groupPadsSectorEdges);
49 const auto padsGroupedSecEdge = ParameterIDCGroup::getGroupedPadsSectorEdges(groupPadsSectorEdges);
50 const bool isLeftSide = upad < Mapper::PADSPERROW[region][ulrow] / 2;
51 if (edgePadGroupingType == EdgePadGroupingMethod::NO) {
52 if (ulrow < lastRow) {
53 const int relPadinRow = ulrow % groupRows;
54 const int localPadOffset = relPadinRow * padsGroupedSecEdge; // offset from pads to the left
55 const int totalOff = isLeftSide ? (localPadOffset + getIndexGroupPadsSectorEdges(groupPadsSectorEdges, upad) - padsGroupedSecEdge * groupRows) : (localPadOffset + getIndexGroupPadsSectorEdges(groupPadsSectorEdges, Mapper::PADSPERROW[region][ulrow] - upad - 1) + 1);
56 return totalOff;
57 } else {
58 const int relPadinRow = ulrow - lastRow;
59 const int localPadOffset = relPadinRow * padsGroupedSecEdge; // offset from pads to the left
60 const int totalOff = isLeftSide ? (localPadOffset + getIndexGroupPadsSectorEdges(groupPadsSectorEdges, upad) - padsGroupedSecEdge * (Mapper::ROWSPERREGION[region] - lastRow)) : (localPadOffset + getIndexGroupPadsSectorEdges(groupPadsSectorEdges, Mapper::PADSPERROW[region][ulrow] - upad - 1) + 1);
61 return totalOff;
62 }
63 } else if (edgePadGroupingType == EdgePadGroupingMethod::ROWS) {
64 const int totalOff = isLeftSide ? (getIndexGroupPadsSectorEdges(groupPadsSectorEdges, upad) - padsGroupedSecEdge) : (getIndexGroupPadsSectorEdges(groupPadsSectorEdges, Mapper::PADSPERROW[region][ulrow] - upad - 1) + 1);
65 return totalOff;
66 } else {
67 // wrong type
68 throw std::invalid_argument("Wrong type for EdgePadGroupingMethod");
69 }
70}
71
72void o2::tpc::IDCGroupHelperRegion::setRows(const unsigned int nRows)
73{
74 mRows = nRows;
75 mPadsPerRow.resize(mRows);
76 mOffsRow.resize(mRows);
77}
78
80{
81 const unsigned int nTotRows = Mapper::ROWSPERREGION[mRegion];
82 const unsigned int rowsRemainder = nTotRows % mGroupRows;
83 unsigned int lastRow = nTotRows - rowsRemainder;
84 if (rowsRemainder <= mGroupLastRowsThreshold) {
85 lastRow -= mGroupRows;
86 }
87 return lastRow;
88}
89
90unsigned int o2::tpc::IDCGroupHelperRegion::getLastPad(const unsigned int ulrow, const unsigned int region, const unsigned char groupPads, const unsigned char groupLastPadsThreshold, const unsigned int groupPadsSectorEdges)
91{
92 const unsigned int nPads = Mapper::PADSPERROW[region][ulrow] / 2 - ParameterIDCGroup::getTotalGroupPadsSectorEdges(groupPadsSectorEdges);
93 const unsigned int padsRemainder = nPads % groupPads;
94 int unsigned lastPad = (padsRemainder == 0) ? nPads - groupPads : nPads - padsRemainder;
95 if (padsRemainder && padsRemainder <= groupLastPadsThreshold) {
96 lastPad -= groupPads;
97 }
98 return lastPad;
99}
100
102{
103 const unsigned int nRows = getLastRow() / mGroupRows + 1;
104 setRows(nRows);
105 for (unsigned int irow = 0; irow < nRows; ++irow) {
106 const unsigned int row = irow * mGroupRows;
107 mPadsPerRow[irow] = 2 * (getLastPad(row) / mGroupPads + 1);
108 }
109
110 const auto padsSectorEdge = getEdgePadGroupingType() == EdgePadGroupingMethod::NO ? Mapper::ROWSPERREGION[mRegion] : nRows;
111 const auto rowsSectorEdge = getEdgePadGroupingType() == EdgePadGroupingMethod::NO ? mGroupRows : 1;
112
113 mNIDCsPerCRU = std::accumulate(mPadsPerRow.begin(), mPadsPerRow.end(), decltype(mPadsPerRow)::value_type(0)) + 2 * padsSectorEdge * getGroupedPadsSectorEdges();
114 mOffsRow.front() = getGroupedPadsSectorEdges() * rowsSectorEdge;
115 for (unsigned int i = 1; i < (mRows - 1); ++i) {
116 const unsigned int lastInd = i - 1;
117 mOffsRow[i] = mOffsRow[lastInd] + mPadsPerRow[lastInd] + 2 * getGroupedPadsSectorEdges() * rowsSectorEdge;
118 }
119 if (mRows > 2) {
120 const auto offsIndex = getEdgePadGroupingType() == EdgePadGroupingMethod::NO ? mGroupRows + (Mapper::ROWSPERREGION[mRegion] - getLastRow()) : 2;
121 mOffsRow.back() = mOffsRow[mRows - 2] + mPadsPerRow[mRows - 2] + getGroupedPadsSectorEdges() * offsIndex;
122 }
123}
124
125void o2::tpc::IDCGroupHelperRegion::dumpToFile(const char* outFileName, const char* outName) const
126{
127 TFile fOut(outFileName, "UPDATE");
128 fOut.WriteObject(this, outName);
129 fOut.Close();
130}
131
132unsigned int o2::tpc::IDCGroupHelperRegion::getIndexUngroupedGlob(const unsigned int ugrow, const unsigned int upad, unsigned int integrationInterval) const
133{
134 return getIndexUngrouped(ugrow - o2::tpc::Mapper::ROWOFFSET[mRegion], upad, integrationInterval);
135}
136
141
146
148{
149 return getIndexGroupPadsSectorEdges(mGroupPadsSectorEdges, urelpad);
150}
151
152unsigned int o2::tpc::IDCGroupHelperRegion::getIndexGroupPadsSectorEdges(const unsigned int groupPadsSectorEdges, const unsigned int urelpad, const unsigned int count)
153{
154 const auto totalUngroupedPads = groupPadsSectorEdges % 10 + count;
155 if (urelpad < totalUngroupedPads) {
156 return 0;
157 }
158 return 1 + getIndexGroupPadsSectorEdges(groupPadsSectorEdges / 10, urelpad, totalUngroupedPads);
159}
160
161unsigned int o2::tpc::IDCGroupHelperRegion::getIndexGroupPadsSectorEdges(const unsigned int groupPadsSectorEdges, const unsigned int urelpad)
162{
163 return urelpad >= ParameterIDCGroup::getTotalGroupPadsSectorEdges(groupPadsSectorEdges) ? throw std::invalid_argument(fmt::format("relativ pad position {} is large than maximum value of {}", urelpad, ParameterIDCGroup::getTotalGroupPadsSectorEdges(groupPadsSectorEdges))) : getIndexGroupPadsSectorEdges(groupPadsSectorEdges / 10, urelpad, 0);
164}
165
170
171unsigned int o2::tpc::IDCGroupHelperRegion::getPadsInGroupSectorEdges(const unsigned indexGroup) const
172{
173 return ParameterIDCGroup::getPadsInGroupSectorEdges(mGroupPadsSectorEdges, indexGroup);
174}
int32_t i
helper class for grouping of pads and rows for one region
Definition of the parameter for the grouping of the IDCs.
static unsigned int getGroupedPad(const unsigned int upad, const unsigned int ulrow, const unsigned int region, const unsigned int groupPads, const unsigned int groupRows, const unsigned int groupedrows, const unsigned int groupPadsSectorEdges, const std::vector< unsigned int > &padsPerRow)
unsigned int getGroupedPadsSectorEdges() const
void dumpToFile(const char *outFileName="IDCGroupHelperRegion.root", const char *outName="IDCGroupHelperRegion") const
unsigned int getLastPad(const unsigned int ulrow) const
void setRows(const unsigned int nRows)
set number of grouped rows
static unsigned int getGroupedRow(const unsigned int ulrow, const unsigned int groupRows, const unsigned int groupedrows)
unsigned int getTotalGroupPadsSectorEdges() const
static bool isSectorEdgePad(const unsigned int upad, const unsigned int ulrow, const unsigned int region, const unsigned int groupPadsSectorEdges)
unsigned int getIndexUngroupedGlob(const unsigned int ugrow, const unsigned int upad, unsigned int integrationInterval) const
EdgePadGroupingMethod getEdgePadGroupingType() const
static int getOffsetForEdgePad(const unsigned int upad, const unsigned int ulrow, const unsigned int groupRows, const unsigned int groupPadsSectorEdges, const unsigned int region, const int lastRow)
void initIDCGroupHelperRegion()
initialize members
const unsigned int mRegion
region of input IDCs
unsigned int getPadsInGroupSectorEdges(const unsigned indexGroup) const
static unsigned int getIndexGroupPadsSectorEdges(const unsigned int groupPadsSectorEdges, const unsigned int urelpad)
unsigned int getGlobalPadNumber(const unsigned int ulrow, const unsigned int pad) const
static constexpr unsigned int ROWOFFSET[NREGIONS]
offset to calculate local row from global row
Definition Mapper.h:533
static GlobalPadNumber getGlobalPadNumber(const unsigned int lrow, const unsigned int pad, const unsigned int region)
Definition Mapper.h:64
static const std::vector< unsigned int > PADSPERROW[NREGIONS]
number of pads per row in region
Definition Mapper.h:567
static constexpr unsigned int ROWSPERREGION[NREGIONS]
number of pad rows for region
Definition Mapper.h:532
GLint GLsizei count
Definition glcorearb.h:399
@ NO
no grouping in row direction
@ ROWS
grouping in row direction
static EdgePadGroupingMethod getEdgePadGroupingType(unsigned int groupPadsSectorEdges)
static unsigned int getGroupedPadsSectorEdges(unsigned int groupPadsSectorEdges)
static unsigned int getPadsInGroupSectorEdges(unsigned int groupPadsSectorEdges, const unsigned int group)
static unsigned int getTotalGroupPadsSectorEdges(unsigned int groupPadsSectorEdges)
std::vector< int > row