Project
Loading...
Searching...
No Matches
O2Tessellated.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_BASE_O2TESSELLATED_
13#define ALICEO2_BASE_O2TESSELLATED_
14
15#include "TGeoShape.h"
16#include "TGeoBBox.h"
17#include "TGeoVector3.h"
18#include "TGeoTypedefs.h"
19#include "TGeoTessellated.h"
20
21namespace o2
22{
23namespace base
24{
25
26class O2Tessellated : public TGeoBBox
27{
28
29 public:
30 using Vertex_t = Tessellated::Vertex_t;
31
32 private:
33 int fNfacets = 0; // Number of facets
34 int fNvert = 0; // Number of vertices
35 int fNseg = 0; // Number of segments
36 bool fDefined = false;
37 bool fClosedBody = false; // The faces are making a closed body
38
39 // for now separate vectors but might be better to group per face
40 std::vector<Vertex_t> fVertices; // List of vertices
41 std::vector<TGeoFacet> fFacets; // List of facets
42 std::vector<Vertex_t> fOutwardNormals; // Vector of outward-facing normals (to be streamed !)
43
44 std::multimap<long, int> fVerticesMap;
45 bool fIsClosed = false;
46 void* fBVH = nullptr;
47
48 O2Tessellated(const O2Tessellated&) = delete;
49 O2Tessellated& operator=(const O2Tessellated&) = delete;
50
51 // bvh helper functions
52 void BuildBVH();
53 void CalculateNormals();
54
55 public:
56 // constructors
58 O2Tessellated(const char* name, int nfacets = 0);
59 O2Tessellated(const char* name, const std::vector<Vertex_t>& vertices);
60 // from a TGeoTessellated
61 O2Tessellated(TGeoTessellated const&, bool check = false);
62
63 // destructor
64 ~O2Tessellated() override {}
65
66 void ComputeBBox() override;
67 void CloseShape(bool check = true, bool fixFlipped = true, bool verbose = true);
68
69 bool AddFacet(const Vertex_t& pt0, const Vertex_t& pt1, const Vertex_t& pt2);
70 bool AddFacet(const Vertex_t& pt0, const Vertex_t& pt1, const Vertex_t& pt2, const Vertex_t& pt3);
71 bool AddFacet(int i1, int i2, int i3);
72 bool AddFacet(int i1, int i2, int i3, int i4);
73 int AddVertex(const Vertex_t& vert);
74
75 bool FacetCheck(int ifacet) const;
76 Vertex_t FacetComputeNormal(int ifacet, bool& degenerated) const;
77
78 int GetNfacets() const { return fFacets.size(); }
79 int GetNsegments() const { return fNseg; }
80 int GetNvertices() const { return fNvert; }
81 bool IsClosedBody() const { return fClosedBody; }
82 bool IsDefined() const { return fDefined; }
83
84 const TGeoFacet& GetFacet(int i) const { return fFacets[i]; }
85 const Vertex_t& GetVertex(int i) const { return fVertices[i]; }
86
87 int DistancetoPrimitive(int, int) override { return 99999; }
88 const TBuffer3D& GetBuffer3D(int reqSections, Bool_t localFrame) const override;
89 void GetMeshNumbers(int& nvert, int& nsegs, int& npols) const override;
90 int GetNmeshVertices() const override { return fNvert; }
91
93 Bool_t GetPointsOnSegments(Int_t npoints, Double_t* array) const override;
94
95 void InspectShape() const override {}
96 TBuffer3D* MakeBuffer3D() const override;
97 void Print(Option_t* option = "") const override;
98 void SavePrimitive(std::ostream&, Option_t*) override {}
99 void SetPoints(double* points) const override;
100 void SetPoints(Float_t* points) const override;
101 void SetSegsAndPols(TBuffer3D& buff) const override;
102 void Sizeof3D() const override {}
103
105 void ResizeCenter(double maxsize);
106
109 {
110 for (auto facet : fFacets)
111 facet.Flip();
112 }
113
114 bool CheckClosure(bool fixFlipped = true, bool verbose = true);
115
117 static O2Tessellated* ImportFromObjFormat(const char* objfile, bool check = false, bool verbose = false);
118
119 // navigation functions used by TGeoNavigator (attention: only the iact == 3 cases implemented for now)
120 Double_t DistFromOutside(const Double_t* point, const Double_t* dir, Int_t iact = 1,
121 Double_t step = TGeoShape::Big(), Double_t* safe = nullptr) const override;
122 Double_t DistFromInside(const Double_t* point, const Double_t* dir, Int_t iact = 1, Double_t step = TGeoShape::Big(),
123 Double_t* safe = nullptr) const override;
124 bool Contains(const Double_t* point) const override;
125 Double_t Safety(const Double_t* point, Bool_t in = kTRUE) const override;
126 void ComputeNormal(const Double_t* point, const Double_t* dir, Double_t* norm) const override;
127
128 // these are trivial implementations, just for debugging
129 Double_t DistFromInside_Loop(const Double_t* point, const Double_t* dir) const;
130 Double_t DistFromOutside_Loop(const Double_t* point, const Double_t* dir) const;
131 bool Contains_Loop(const Double_t* point) const;
132
133 Double_t Capacity() const override;
134
135 private:
136 // a safety kernel used in multiple implementations
137 template <bool closest_facet = false>
138 Double_t SafetyKernel(const Double_t* point, bool in, int* closest_facet_id = nullptr) const;
139
140 // cached values for safety
141 mutable float mLast_x;
142 mutable float mLast_y;
143 mutable float mLast_z;
144 mutable float mCachedSafety;
145 mutable size_t cached_counter = 0;
146 mutable size_t call_counter = 0;
147
148 ClassDefOverride(O2Tessellated, 1) // tessellated shape class
149};
150
151} // namespace base
152} // namespace o2
153
154#endif
int32_t i
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in maximum chi2 per attached tracklet for TRD tracks take into account the full likelihood of the slope including exponential tails Tracks with less attached tracklets are discarded after the tracking Post trigger Pile up integration time in BCs fits all iterations but the last one in projections Use material lookup table for TPC refit Apply workarounds to avoid cyclic merge should not be needed tpc dyn configStandalone Processing proc_rtc Replace constant variables static by constexpr expressions Compile RTC in deterministic with NO_FAST_MATH flags and GPUCA_DETERMINISTIC_MODE define Use RTC to optimize GPU code h configStandalone Processing proc_rtctech Use a file lock to serialize access to the cache folder Print launch bounds used for RTC code as debugging option
Tessellated::Vertex_t Vertex_t
const TGeoFacet & GetFacet(int i) const
void SetSegsAndPols(TBuffer3D &buff) const override
Fills TBuffer3D structure for segments and polygons.
Double_t Safety(const Double_t *point, Bool_t in=kTRUE) const override
Safety.
bool Contains(const Double_t *point) const override
Contains.
int GetNmeshVertices() const override
void GetMeshNumbers(int &nvert, int &nsegs, int &npols) const override
Returns numbers of vertices, segments and polygons composing the shape mesh.
Double_t DistFromOutside_Loop(const Double_t *point, const Double_t *dir) const
trivial (non-BVH) DistFromOutside function
bool AddFacet(const Vertex_t &pt0, const Vertex_t &pt1, const Vertex_t &pt2)
Adding a triangular facet from vertex positions in absolute coordinates.
bool FacetCheck(int ifacet) const
Check validity of facet.
const TBuffer3D & GetBuffer3D(int reqSections, Bool_t localFrame) const override
Fills a static 3D buffer and returns a reference.
Double_t Capacity() const override
Capacity.
void Sizeof3D() const override
void ComputeBBox() override
Compute bounding box.
void InspectShape() const override
void CloseShape(bool check=true, bool fixFlipped=true, bool verbose=true)
Close the shape: calculate bounding box and compact vertices.
void FlipFacets()
Flip all facets.
int DistancetoPrimitive(int, int) override
static O2Tessellated * ImportFromObjFormat(const char *objfile, bool check=false, bool verbose=false)
Reader from .obj format.
Double_t DistFromInside_Loop(const Double_t *point, const Double_t *dir) const
trivial (non-BVH) DistFromInside function
bool CheckClosure(bool fixFlipped=true, bool verbose=true)
Check closure of the solid and check/fix flipped normals.
void ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm) const override
ComputeNormal interface.
void Print(Option_t *option="") const override
Prints basic info.
const Vertex_t & GetVertex(int i) const
void ResizeCenter(double maxsize)
Resize and center the shape in a box of size maxsize.
TBuffer3D * MakeBuffer3D() const override
int AddVertex(const Vertex_t &vert)
Add a vertex checking for duplicates, returning the vertex index.
Bool_t GetPointsOnSegments(Int_t npoints, Double_t *array) const override
Fill array with npoints points on this solid's boundary: every vertex, then deterministic R2 samples ...
Vertex_t FacetComputeNormal(int ifacet, bool &degenerated) const
Compute normal for a given facet.
bool Contains_Loop(const Double_t *point) const
trivial (non-BVH) Contains
Tessellated::Vertex_t Vertex_t
Double_t DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
DistFromOutside.
void SetPoints(double *points) const override
Fill tessellated points to an array.
Double_t DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1, Double_t step=TGeoShape::Big(), Double_t *safe=nullptr) const override
DistFromOutside.
void SavePrimitive(std::ostream &, Option_t *) override
GLuint const GLchar * name
Definition glcorearb.h:781
void check(const std::vector< std::string > &arguments, const std::vector< ConfigParamSpec > &workflowOptions, const std::vector< DeviceSpec > &deviceSpecs, CheckMatrix &matrix)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...