Skip to content
Snippets Groups Projects

Ca: rewrite and restructure of the hit data stored in 2D grids, move grid data to /algo

Merged Sergey Gorbunov requested to merge se.gorbunov/cbmroot:CaGrid into master
21 files
+ 701
756
Compare changes
  • Side-by-side
  • Inline
Files
21
+ 121
0
/* Copyright (C) 2017-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
SPDX-License-Identifier: GPL-3.0-only
Authors: Maksym Zyzak [committer], Valentina Akishina */
/// \file L1Grid.cxx
/// \brief Class for storing 2d objects in a grid
#include "CaGrid.h"
#include <algorithm>
#include <string.h>
#include "CaHit.h"
using namespace cbm::algo::ca;
using namespace cbm::algo;
void Grid::BuildBins(fscal xMin, fscal xMax, fscal yMin, fscal yMax, fscal binWidthX, fscal binWidthY)
{
fMinX = std::min(xMin, xMax);
fMinY = std::min(yMin, yMax);
xMax = std::max(xMin, xMax);
yMax = std::max(yMin, yMax);
fBinWidthX = binWidthX;
fBinWidthY = binWidthY;
// some sanity checks
if (fBinWidthX < 0.001) { fBinWidthX = 0.001; }
if (fBinWidthY < 0.001) { fBinWidthY = 0.001; }
fBinWidthXinv = 1. / fBinWidthX;
fBinWidthYinv = 1. / fBinWidthY;
fNx = static_cast<int>(std::ceil((xMax - fMinX) / fBinWidthX));
fNy = static_cast<int>(std::ceil((yMax - fMinY) / fBinWidthY));
// some sanity checks
if (fNx < 1) fNx = 1;
if (fNy < 1) fNy = 1;
fN = fNx * fNy;
fEntries.clear();
fFirstBinEntryIndex.reset(fN + 1, 0);
fNofBinEntries.reset(fN + 1, 0);
}
void Grid::StoreHits(const Vector<ca::Hit>& hits, ca::HitIndex_t hitStartIndex, ca::HitIndex_t nHits,
const Vector<unsigned char>& hitKeyFlags)
{
fFirstBinEntryIndex.reset(fN + 1, 0);
fNofBinEntries.reset(fN + 1, 0);
int nEntries = 0;
for (ca::HitIndex_t ih = 0; ih < nHits; ih++) {
const ca::Hit& hit = hits[hitStartIndex + ih];
if (!(hitKeyFlags[hit.f] || hitKeyFlags[hit.b])) {
fNofBinEntries[GetBin(hit.x, hit.y)]++;
nEntries++;
}
}
fEntries.reset(nEntries);
for (int bin = 0; bin < fN; bin++) {
fFirstBinEntryIndex[bin + 1] = fFirstBinEntryIndex[bin] + fNofBinEntries[bin];
fNofBinEntries[bin] = 0;
}
fNofBinEntries[fN] = 0;
fMaxRangeX = 0.;
fMaxRangeY = 0.;
fMaxRangeT = 0.;
for (ca::HitIndex_t ih = 0; ih < nHits; ih++) {
const ca::Hit& hit = hits[hitStartIndex + ih];
if (!(hitKeyFlags[hit.f] || hitKeyFlags[hit.b])) {
int bin = GetBin(hit.x, hit.y);
fEntries[fFirstBinEntryIndex[bin] + fNofBinEntries[bin]].Set(hit, hitStartIndex + ih);
fNofBinEntries[bin]++;
fMaxRangeX = std::max(fMaxRangeX, hit.rangeX);
fMaxRangeY = std::max(fMaxRangeY, hit.rangeY);
fMaxRangeT = std::max(fMaxRangeT, hit.rangeT);
}
}
}
void Grid::RemoveUsedHits(const Vector<ca::Hit>& hits, const Vector<unsigned char>& hitKeyFlags)
{
int nEntries = 0;
fMaxRangeX = 0.;
fMaxRangeY = 0.;
fMaxRangeT = 0.;
for (int bin = 0; bin < fN; bin++) {
ca::HitIndex_t firstEntryOld = fFirstBinEntryIndex[bin];
fFirstBinEntryIndex[bin] = nEntries;
fNofBinEntries[bin] = 0;
for (ca::HitIndex_t i = firstEntryOld; i < fFirstBinEntryIndex[bin + 1]; i++) {
const ca::Hit& hit = hits[fEntries[i].GetObjectId()];
if (!(hitKeyFlags[hit.f] || hitKeyFlags[hit.b])) {
fEntries[nEntries] = fEntries[i];
nEntries++;
fNofBinEntries[bin]++;
fMaxRangeX = std::max(fMaxRangeX, hit.rangeX);
fMaxRangeY = std::max(fMaxRangeY, hit.rangeY);
fMaxRangeT = std::max(fMaxRangeT, hit.rangeT);
}
}
}
fFirstBinEntryIndex[fN] = nEntries;
fNofBinEntries[fN] = 0;
fEntries.reduce(nEntries);
}
Loading