12 #ifndef ROOT_TGeoPatternFinder
13 #define ROOT_TGeoPatternFinder
31 class TGeoPatternFinder :
public TObject
43 ThreadData_t(
const ThreadData_t&);
44 ThreadData_t& operator=(
const ThreadData_t&);
46 ThreadData_t& GetThreadData()
const;
47 void ClearThreadData()
const;
48 void CreateThreadData(Int_t nthreads);
51 enum EGeoPatternFlags {
52 kPatternReflected = BIT(14),
53 kPatternSpacedOut = BIT(15)
62 mutable std::vector<ThreadData_t*> fThreadData;
63 mutable Int_t fThreadSize;
64 mutable std::mutex fMutex;
67 TGeoPatternFinder(
const TGeoPatternFinder&);
68 TGeoPatternFinder& operator=(
const TGeoPatternFinder&);
73 TGeoPatternFinder(TGeoVolume *vol, Int_t ndiv);
75 virtual ~TGeoPatternFinder();
77 virtual TGeoMatrix* CreateMatrix()
const = 0;
78 virtual void cd(Int_t ) {}
79 virtual TGeoNode *CdNext();
80 virtual TGeoNode *FindNode(Double_t * ,
const Double_t * =0) {
return 0;}
81 virtual Int_t GetByteCount()
const {
return 36;}
83 Int_t GetDivIndex() {
return fDivIndex;}
84 virtual Int_t GetDivAxis() {
return 1;}
85 virtual TGeoMatrix *GetMatrix();
86 Int_t GetNdiv()
const {
return fNdivisions;}
87 Int_t GetNext()
const;
88 TGeoNode *GetNodeOffset(Int_t idiv) {
return fVolume->GetNode(fDivIndex+idiv);}
89 Double_t GetStart()
const {
return fStart;}
90 Double_t GetStep()
const {
return fStep;}
91 Double_t GetEnd()
const {
return fEnd;}
92 TGeoVolume *GetVolume()
const {
return fVolume;}
93 virtual Bool_t IsOnBoundary(
const Double_t * )
const {
return kFALSE;}
94 Bool_t IsReflected()
const {
return TObject::TestBit(kPatternReflected);}
95 Bool_t IsSpacedOut()
const {
return TObject::TestBit(kPatternSpacedOut);}
97 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE) = 0;
98 void Reflect(Bool_t flag=kTRUE) {TObject::SetBit(kPatternReflected,flag);}
99 void SetDivIndex(Int_t index) {fDivIndex = index;}
100 void SetNext(Int_t index);
101 void SetRange(Double_t start, Double_t step, Int_t ndivisions);
102 void SetSpacedOut(Bool_t flag) {TObject::SetBit(kPatternSpacedOut,flag);}
103 void SetVolume(TGeoVolume *vol) {fVolume = vol;}
104 virtual void UpdateMatrix(Int_t , TGeoHMatrix &)
const {}
106 ClassDef(TGeoPatternFinder, 4)
115 class TGeoTranslation;
117 class TGeoPatternX :
public TGeoPatternFinder
122 TGeoPatternX(TGeoVolume *vol, Int_t ndivisions);
123 TGeoPatternX(TGeoVolume *vol, Int_t ndivisions, Double_t step);
124 TGeoPatternX(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
125 TGeoPatternX(
const TGeoPatternX &pf);
126 TGeoPatternX& operator=(
const TGeoPatternX&);
129 virtual ~TGeoPatternX();
131 virtual TGeoMatrix* CreateMatrix()
const;
132 virtual void cd(Int_t idiv);
133 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
134 virtual Double_t FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext);
135 virtual Int_t GetDivAxis() {
return 1;}
136 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
138 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
139 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
140 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
142 ClassDef(TGeoPatternX, 1)
151 class TGeoPatternY :
public TGeoPatternFinder
156 TGeoPatternY(TGeoVolume *vol, Int_t ndivisions);
157 TGeoPatternY(TGeoVolume *vol, Int_t ndivisions, Double_t step);
158 TGeoPatternY(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
159 TGeoPatternY(
const TGeoPatternY &pf);
160 TGeoPatternY& operator=(
const TGeoPatternY&);
162 virtual ~TGeoPatternY();
164 virtual TGeoMatrix* CreateMatrix()
const;
165 virtual void cd(Int_t idiv);
166 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
167 virtual Double_t FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext);
168 virtual Int_t GetDivAxis() {
return 2;}
169 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
171 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
172 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
173 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
175 ClassDef(TGeoPatternY, 1)
184 class TGeoPatternZ :
public TGeoPatternFinder
189 TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions);
190 TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions, Double_t step);
191 TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
192 TGeoPatternZ(
const TGeoPatternZ &pf);
193 TGeoPatternZ& operator=(
const TGeoPatternZ&);
195 virtual ~TGeoPatternZ();
197 virtual TGeoMatrix* CreateMatrix()
const;
198 virtual void cd(Int_t idiv);
199 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
200 virtual Double_t FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext);
201 virtual Int_t GetDivAxis() {
return 3;}
202 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
204 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
205 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
206 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
208 ClassDef(TGeoPatternZ, 1)
217 class TGeoPatternParaX :
public TGeoPatternFinder
222 TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions);
223 TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions, Double_t step);
224 TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
225 TGeoPatternParaX(
const TGeoPatternParaX &pf);
226 TGeoPatternParaX& operator=(
const TGeoPatternParaX&);
229 virtual ~TGeoPatternParaX();
231 virtual TGeoMatrix* CreateMatrix()
const;
232 virtual void cd(Int_t idiv);
233 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
234 virtual Int_t GetDivAxis() {
return 1;}
235 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
237 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
238 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
239 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
241 ClassDef(TGeoPatternParaX, 1)
250 class TGeoPatternParaY :
public TGeoPatternFinder
258 TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions);
259 TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions, Double_t step);
260 TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
261 TGeoPatternParaY(
const TGeoPatternParaY &pf);
262 TGeoPatternParaY& operator=(
const TGeoPatternParaY&);
265 virtual ~TGeoPatternParaY();
267 virtual TGeoMatrix* CreateMatrix()
const;
268 virtual void cd(Int_t idiv);
269 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
270 virtual Int_t GetDivAxis() {
return 2;}
271 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
273 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
274 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
275 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
277 ClassDef(TGeoPatternParaY, 1)
286 class TGeoPatternParaZ :
public TGeoPatternFinder
295 TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions);
296 TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions, Double_t step);
297 TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
298 TGeoPatternParaZ(
const TGeoPatternParaZ &pf);
299 TGeoPatternParaZ& operator=(
const TGeoPatternParaZ&);
302 virtual ~TGeoPatternParaZ();
304 virtual TGeoMatrix* CreateMatrix()
const;
305 virtual void cd(Int_t idiv);
306 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
307 virtual Int_t GetDivAxis() {
return 3;}
308 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
310 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
311 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
312 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
314 ClassDef(TGeoPatternParaZ, 1)
323 class TGeoPatternTrapZ :
public TGeoPatternFinder
332 TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions);
333 TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions, Double_t step);
334 TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
335 TGeoPatternTrapZ(
const TGeoPatternTrapZ &pf);
336 TGeoPatternTrapZ& operator=(
const TGeoPatternTrapZ&);
339 virtual ~TGeoPatternTrapZ();
341 virtual TGeoMatrix* CreateMatrix()
const;
342 Double_t GetTxz()
const {
return fTxz;}
343 Double_t GetTyz()
const {
return fTyz;}
344 virtual void cd(Int_t idiv);
345 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
346 virtual Int_t GetDivAxis() {
return 3;}
347 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
349 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
350 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
351 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
353 ClassDef(TGeoPatternTrapZ, 1)
363 class TGeoPatternCylR :
public TGeoPatternFinder
368 TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions);
369 TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions, Double_t step);
370 TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
371 TGeoPatternCylR(
const TGeoPatternCylR &pf);
372 TGeoPatternCylR& operator=(
const TGeoPatternCylR&);
374 virtual ~TGeoPatternCylR();
376 virtual TGeoMatrix* CreateMatrix()
const;
377 virtual void cd(Int_t idiv);
378 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
379 virtual Int_t GetDivAxis() {
return 1;}
380 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
382 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
383 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
384 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
386 ClassDef(TGeoPatternCylR, 1)
395 class TGeoPatternCylPhi :
public TGeoPatternFinder
399 Double_t *fSinCos =
nullptr;
402 TGeoPatternCylPhi(
const TGeoPatternCylPhi& pfc)
403 : TGeoPatternFinder(pfc), fSinCos(pfc.fSinCos) {CreateThreadData(1);}
404 TGeoPatternCylPhi& operator=(
const TGeoPatternCylPhi& pfc)
405 {
if(
this!=&pfc) {TGeoPatternFinder::operator=(pfc); fSinCos=pfc.fSinCos; CreateThreadData(1);}
411 TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions);
412 TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions, Double_t step);
413 TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
415 virtual ~TGeoPatternCylPhi();
417 virtual TGeoMatrix* CreateMatrix()
const;
418 virtual void cd(Int_t idiv);
419 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
420 virtual Int_t GetDivAxis() {
return 2;}
421 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
423 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
424 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
425 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
427 ClassDef(TGeoPatternCylPhi, 1)
436 class TGeoPatternSphR :
public TGeoPatternFinder
441 TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions);
442 TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions, Double_t step);
443 TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
444 TGeoPatternSphR(
const TGeoPatternSphR &pf);
445 TGeoPatternSphR& operator=(
const TGeoPatternSphR&);
447 virtual ~TGeoPatternSphR();
449 virtual TGeoMatrix* CreateMatrix()
const;
450 virtual void cd(Int_t idiv);
451 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
452 virtual Int_t GetDivAxis() {
return 1;}
454 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
455 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
456 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
458 ClassDef(TGeoPatternSphR, 1)
467 class TGeoPatternSphTheta :
public TGeoPatternFinder
471 TGeoPatternSphTheta();
472 TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions);
473 TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions, Double_t step);
474 TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
475 TGeoPatternSphTheta(
const TGeoPatternSphTheta &pf);
476 TGeoPatternSphTheta& operator=(
const TGeoPatternSphTheta&);
478 virtual ~TGeoPatternSphTheta();
480 virtual TGeoMatrix* CreateMatrix()
const;
481 virtual void cd(Int_t idiv);
482 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
483 virtual Int_t GetDivAxis() {
return 3;}
485 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
486 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
487 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
489 ClassDef(TGeoPatternSphTheta, 1)
498 class TGeoPatternSphPhi :
public TGeoPatternFinder
501 Double_t *fSinCos =
nullptr;
504 TGeoPatternSphPhi(
const TGeoPatternSphPhi& pfc);
505 TGeoPatternSphPhi& operator=(
const TGeoPatternSphPhi& pfc);
506 Double_t *CreateSinCos();
510 TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions);
511 TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions, Double_t step);
512 TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end);
514 virtual ~TGeoPatternSphPhi();
516 virtual TGeoMatrix* CreateMatrix()
const;
517 virtual void cd(Int_t idiv);
518 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
519 virtual Int_t GetDivAxis() {
return 2;}
520 virtual Bool_t IsOnBoundary(
const Double_t *point)
const;
522 TGeoPatternFinder *MakeCopy(Bool_t reflect=kFALSE);
523 virtual void SavePrimitive(std::ostream &out, Option_t *option =
"");
524 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
526 ClassDef(TGeoPatternSphPhi, 1)
535 class TGeoPatternHoneycomb :
public TGeoPatternFinder
545 TGeoPatternHoneycomb(
const TGeoPatternHoneycomb&);
546 TGeoPatternHoneycomb& operator=(
const TGeoPatternHoneycomb&);
550 TGeoPatternHoneycomb();
551 TGeoPatternHoneycomb(TGeoVolume *vol, Int_t nrows);
553 virtual ~TGeoPatternHoneycomb();
555 TGeoPatternFinder *MakeCopy(Bool_t) {
return 0;}
556 virtual TGeoMatrix* CreateMatrix()
const;
557 virtual void cd(Int_t idiv);
558 virtual TGeoNode *FindNode(Double_t *point,
const Double_t *dir=0);
559 virtual void UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const;
561 ClassDef(TGeoPatternHoneycomb, 1)