Project
Loading...
Searching...
No Matches
LayerMask.h
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
12#ifndef ALICEO2_ITSMFT_TRACKING_LAYERMASK_H_
13#define ALICEO2_ITSMFT_TRACKING_LAYERMASK_H_
14
15#include <cstdint>
16#include <type_traits>
17
18#ifndef GPUCA_GPUCODE
19#include <fmt/format.h>
20#include <string>
21#endif
22
23#include "GPUCommonDef.h"
24#include "GPUCommonMath.h"
26
28{
29
30struct LayerMask {
31 GPUhdDefault() constexpr LayerMask() noexcept = default;
32 GPUhdDefault() constexpr LayerMask(uint32_t mask) noexcept : mBits{mask} {}
33 GPUhdDefault() constexpr LayerMask(int layer0, int layer1, int layer2) noexcept
34 : mBits{(uint32_t(1) << layer0) | (uint32_t(1) << layer1) | (uint32_t(1) << layer2)}
35 {
36 }
37 GPUhdi() constexpr operator uint32_t() const noexcept { return mBits; }
38 GPUhdi() constexpr uint32_t value() const noexcept { return mBits; }
39 GPUhdi() constexpr void set(int layer) noexcept { mBits |= (uint32_t(1) << layer); }
40 GPUhdi() constexpr void reset(int layer) noexcept { mBits &= ~(uint32_t(1) << layer); }
41
42 GPUhdi() LayerMask operator~() const noexcept { return LayerMask{~mBits}; }
43 GPUhdi() LayerMask operator&(LayerMask other) const noexcept { return LayerMask{mBits & other.mBits}; }
44 GPUhdi() LayerMask operator|(LayerMask other) const noexcept { return LayerMask{mBits | other.mBits}; }
46 {
47 mBits &= other.mBits;
48 return *this;
49 }
51 {
52 mBits |= other.mBits;
53 return *this;
54 }
55
56 GPUhdi() bool empty() const noexcept { return mBits == 0; }
57 GPUhdi() bool has(int layer) const noexcept { return mBits & (uint32_t(1) << layer); }
58 GPUhdi() bool isSubsetOf(LayerMask allowed) const noexcept { return (*this & ~allowed).empty(); }
59 GPUhdi() bool isAllowedHoleMask(int maxHoles, LayerMask allowedHoleMask) const noexcept
60 {
61 const int allowedHoles = maxHoles > 0 ? maxHoles : 0;
62 return count() <= allowedHoles && isSubsetOf(allowedHoleMask);
63 }
64 GPUhdi() bool isAllowed(int maxHoles, LayerMask allowedHoleMask) const noexcept
65 {
66 return holeMask().isAllowedHoleMask(maxHoles, allowedHoleMask);
67 }
68 GPUhdi() int length() const noexcept { return empty() ? 0 : last() - first() + 1; }
69 GPUhdi() int count() const noexcept { return static_cast<int>(o2::gpu::GPUCommonMath::Popcount(mBits)); }
70 GPUhdi() int first() const noexcept { return mBits ? static_cast<int>(o2::gpu::GPUCommonMath::Ctz(mBits)) : o2::its::constants::UnusedIndex; }
71 GPUhdi() int last() const noexcept { return mBits ? 31 - static_cast<int>(o2::gpu::GPUCommonMath::Clz(mBits)) : o2::its::constants::UnusedIndex; }
72 GPUhdi() LayerMask holeMask() const noexcept
73 {
74 return empty() ? LayerMask{0} : (span(first(), last()) & ~(*this));
75 }
76
77 GPUhdi() int slot(int layer) const noexcept
78 {
79 if (!has(layer)) {
81 }
82 const uint32_t lowerLayers = (uint32_t(1) << layer) - 1;
83 return static_cast<int>(o2::gpu::GPUCommonMath::Popcount(static_cast<uint32_t>(mBits) & lowerLayers));
84 }
85
86 static GPUhdi() LayerMask span(int fromLayer, int toLayer) noexcept
87 {
88 if (fromLayer > toLayer) {
89 return 0;
90 }
91 const uint32_t upper = toLayer >= 31 ? uint32_t{0xffffffff} : (uint32_t(1) << (toLayer + 1)) - 1;
92 const uint32_t lower = (uint32_t(1) << fromLayer) - 1;
93 return upper & ~lower;
94 }
95
96 static GPUhdi() LayerMask skipped(int fromLayer, int toLayer) noexcept
97 {
98 return (toLayer - fromLayer <= 1) ? LayerMask{0} : span(fromLayer + 1, toLayer - 1);
99 }
100
101#ifndef GPUCA_GPUCODE
102 std::string asString() const { return fmt::format("{:032b}", mBits); }
103#endif
104
105 private:
106 uint32_t mBits{0};
107};
108
109} // namespace o2::itsmft::tracking
110
111#endif /* ALICEO2_ITSMFT_TRACKING_LAYERMASK_H_ */
std::string asString(TDataMember const &dm, char *pointer)
double lower[3]
double upper[3]
GLint GLsizei count
Definition glcorearb.h:399
GLint first
Definition glcorearb.h:399
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLint GLuint mask
Definition glcorearb.h:291
constexpr int UnusedIndex
Definition Constants.h:32
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
void empty(int)
GPUhdi() const expr void reset(int layer) noexcept
Definition LayerMask.h:40
GPUhdi() LayerMask operator~() const noexcept
Definition LayerMask.h:42
GPUhdi() LayerMask operator|(LayerMask other) const noexcept
Definition LayerMask.h:44
GPUhdi() const expr void set(int layer) noexcept
Definition LayerMask.h:39
GPUhdi() LayerMask operator&(LayerMask other) const noexcept
Definition LayerMask.h:43
GPUhdDefault() const expr LayerMask() noexcept=default
GPUhdi() LayerMask &operator&
GPUhdDefault() const expr LayerMask(int layer0
GPUhdi() const expr uint32_t value() const noexcept
Definition LayerMask.h:38
VectorOfTObjectPtrs other