Skip to content

Commit 0dd4156

Browse files
committed
Fix matLUT compactification + extraction of layers group
1 parent 928fd90 commit 0dd4156

5 files changed

Lines changed: 73 additions & 7 deletions

File tree

Detectors/Base/include/DetectorsBase/MatCell.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ struct MatCell {
3333
GPUd() MatCell() : meanRho(0.f), meanX2X0(0.f) {}
3434
GPUdDefault() MatCell(const MatCell& src) CON_DEFAULT;
3535

36+
GPUd() void set(const MatCell& c)
37+
{
38+
meanRho = c.meanRho;
39+
meanX2X0 = c.meanX2X0;
40+
}
41+
3642
GPUd() void scale(float scale)
3743
{
3844
meanRho *= scale;

Detectors/Base/include/DetectorsBase/MatLayerCyl.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,13 @@ class MatLayerCyl : public o2::gpu::FlatObject
9090
GPUd() const MatCell& getCellPhiBin(int iphi, int iz) const { return mCells[getCellIDPhiBin(iphi, iz)]; }
9191
GPUd() const MatCell& getCell(int iphiSlice, int iz) const { return mCells[getCellID(iphiSlice, iz)]; }
9292

93+
#ifndef GPUCA_ALIGPUCODE // this part is unvisible on GPU version
94+
GPUd() MatCell& getCellPhiBin(int iphi, int iz)
95+
{
96+
return mCells[getCellIDPhiBin(iphi, iz)];
97+
}
98+
#endif
99+
93100
// ---------------------- Z slice manipulation
94101
// convert Z to Zslice
95102
GPUd() RangeStatus isZOutside(float z) const { return z < getZMin() ? Below : (z > getZMax() ? Above : Within); }
@@ -156,6 +163,8 @@ class MatLayerCyl : public o2::gpu::FlatObject
156163
/// Gives minimal alignment in bytes required for the flat buffer
157164
static constexpr size_t getBufferAlignmentBytes() { return 8; }
158165
#endif
166+
// linearized cell ID from phi bin and z bin
167+
GPUd() int getCellIDPhiBin(int iphi, int iz) const { return getCellID(phiBin2Slice(iphi), iz); }
159168

160169
protected:
161170
GPUd() int getNCells() const { return getNZBins() * getNPhiSlices(); }
@@ -165,9 +174,6 @@ class MatLayerCyl : public o2::gpu::FlatObject
165174
// linearized cell ID from phi slice and z bin
166175
GPUd() int getCellID(int iphi, int iz) const { return iphi * getNZBins() + iz; }
167176

168-
// linearized cell ID from phi bin and z bin
169-
GPUd() int getCellIDPhiBin(int iphi, int iz) const { return getCellID(phiBin2Slice(iphi), iz); }
170-
171177
// convert Phi (in 0:2pi convention) to PhiBinID
172178
GPUd() int getPhiBinID(float phi) const
173179
{

Detectors/Base/include/DetectorsBase/MatLayerCylSet.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ class MatLayerCylSet : public o2::gpu::FlatObject
8181

8282
void flatten();
8383

84+
MatLayerCyl& getLayer(int i) { return get()->mLayers[i]; }
85+
MatLayerCylSet* extractCopy(float rmin, float rmax, float tol = 1e-3) const;
86+
void finalizeStructures();
87+
8488
#endif // !GPUCA_ALIGPUCODE
8589

8690
#ifndef GPUCA_ALIGPUCODE // this part is unvisible on GPU version

Detectors/Base/src/MatLayerCyl.cxx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,20 +193,25 @@ void MatLayerCyl::optimizePhiSlices(float maxRelDiff)
193193
return;
194194
}
195195
int newSl = 0;
196+
std::vector<int> phi2SlNew(getNPhiBins());
197+
for (int i = 0; i < getNPhiBins(); i++) {
198+
phi2SlNew[i] = mPhiBin2Slice[i];
199+
}
196200
for (int is = 1; is < getNPhiSlices(); is++) {
197201
if (!canMergePhiSlices(is - 1, is, maxRelDiff)) {
198202
newSl++;
203+
} else {
204+
mPhiBin2Slice[is] = mPhiBin2Slice[is - 1];
199205
}
200-
mPhiBin2Slice[is] = newSl;
206+
phi2SlNew[is] = newSl; // new numbering
201207
}
202-
LOG(info) << newSl + 1 << " slices out of " << getNPhiBins();
203208
if (newSl + 1 == getNPhiSlices()) {
204209
return;
205210
}
206211
newSl = 0;
207212
int slMin = 0, slMax = 0, is = 0;
208213
while (is++ < getNPhiSlices()) {
209-
while (is < getNPhiSlices() && mPhiBin2Slice[is] == newSl) { // select similar slices
214+
while (is < getNPhiSlices() && phi2SlNew[is] == newSl) { // select similar slices
210215
slMax++;
211216
is++;
212217
}
@@ -229,6 +234,9 @@ void MatLayerCyl::optimizePhiSlices(float maxRelDiff)
229234
newSl++;
230235
slMin = slMax = is;
231236
}
237+
for (int i = 0; i < getNPhiBins(); i++) {
238+
mPhiBin2Slice[i] = phi2SlNew[i];
239+
}
232240
mNPhiSlices = newSl;
233241

234242
// relocate arrays to avoid spaces after optimization

Detectors/Base/src/MatLayerCylSet.cxx

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
//#define _DBG_LOC_ // for local debugging only
2424

2525
#endif // !GPUCA_ALIGPUCODE
26-
26+
#undef NDEBUG
2727
using namespace o2::base;
2828

2929
using flatObject = o2::gpu::FlatObject;
@@ -90,7 +90,15 @@ void MatLayerCylSet::populateFromTGeo(int ntrPerCell)
9090
get()->mLayers[i].print();
9191
get()->mLayers[i].populateFromTGeo(ntrPerCell);
9292
}
93+
finalizeStructures();
94+
}
95+
96+
//________________________________________________________________________________
97+
void MatLayerCylSet::finalizeStructures()
98+
{
9399
// build layer search structures
100+
assert(mConstructionMask == InProgress);
101+
int nlr = getNLayers();
94102
int nR2Int = 2 * (nlr + 1);
95103
o2::gpu::resizeArray(get()->mR2Intervals, 0, nR2Int);
96104
o2::gpu::resizeArray(get()->mInterval2LrID, 0, nR2Int);
@@ -525,3 +533,37 @@ void MatLayerCylSet::fixPointers(char* oldPtr, char* newPtr, bool newPtrValid)
525533
}
526534
}
527535
#endif // !GPUCA_GPUCODE
536+
537+
#ifndef GPUCA_ALIGPUCODE // this part is unvisible on GPU version
538+
539+
MatLayerCylSet* MatLayerCylSet::extractCopy(float rmin, float rmax, float tolerance) const
540+
{
541+
Ray ray(std::max(getRMin(), rmin), 0., 0., std::min(getRMax(), rmax), 0., 0.);
542+
short lmin, lmax;
543+
if (!getLayersRange(ray, lmin, lmax)) {
544+
LOGP(warn, "No layers found for {} < r < {}", rmin, rmax);
545+
return nullptr;
546+
}
547+
LOGP(info, "Will extract layers {}:{} (out of {} layers) for {} < r < {}", lmin, lmax, getNLayers(), rmin, rmax);
548+
MatLayerCylSet* copy = new MatLayerCylSet();
549+
int lrCount = 0;
550+
for (int il = lmin; il <= lmax; il++) {
551+
const auto& lr = getLayer(il);
552+
float drphi = lr.getDPhi() * (lr.getRMin() + lr.getRMax()) / 2. * 0.999;
553+
copy->addLayer(lr.getRMin(), lr.getRMax(), lr.getZMax(), lr.getDZ(), drphi);
554+
auto& lrNew = copy->getLayer(lrCount);
555+
for (int iz = 0; iz < lrNew.getNZBins(); iz++) {
556+
for (int ip = 0; ip < lrNew.getNPhiBins(); ip++) {
557+
lrNew.getCellPhiBin(ip, iz).set(lr.getCellPhiBin(ip, iz));
558+
}
559+
}
560+
lrCount++;
561+
}
562+
563+
copy->finalizeStructures();
564+
copy->optimizePhiSlices(tolerance);
565+
copy->flatten();
566+
return copy;
567+
}
568+
569+
#endif

0 commit comments

Comments
 (0)