40 ClassImp(TGeoPatternFinder);
41 ClassImp(TGeoPatternX);
42 ClassImp(TGeoPatternY);
43 ClassImp(TGeoPatternZ);
44 ClassImp(TGeoPatternParaX);
45 ClassImp(TGeoPatternParaY);
46 ClassImp(TGeoPatternParaZ);
47 ClassImp(TGeoPatternTrapZ);
48 ClassImp(TGeoPatternCylR);
49 ClassImp(TGeoPatternCylPhi);
50 ClassImp(TGeoPatternSphR);
51 ClassImp(TGeoPatternSphTheta);
52 ClassImp(TGeoPatternSphPhi);
53 ClassImp(TGeoPatternHoneycomb);
59 TGeoPatternFinder::ThreadData_t::ThreadData_t() :
60 fMatrix(0), fCurrent(-1), fNextIndex(-1)
67 TGeoPatternFinder::ThreadData_t::~ThreadData_t()
74 TGeoPatternFinder::ThreadData_t& TGeoPatternFinder::GetThreadData()
const
76 Int_t tid = TGeoManager::ThreadId();
77 return *fThreadData[tid];
82 void TGeoPatternFinder::ClearThreadData()
const
84 std::lock_guard<std::mutex> guard(fMutex);
85 std::vector<ThreadData_t*>::iterator i = fThreadData.begin();
86 while (i != fThreadData.end())
98 void TGeoPatternFinder::CreateThreadData(Int_t nthreads)
100 std::lock_guard<std::mutex> guard(fMutex);
101 fThreadData.resize(nthreads);
102 fThreadSize = nthreads;
103 for (Int_t tid=0; tid<nthreads; tid++) {
104 if (fThreadData[tid] == 0) {
105 fThreadData[tid] =
new ThreadData_t;
106 fThreadData[tid]->fMatrix = CreateMatrix();
114 TGeoPatternFinder::TGeoPatternFinder()
128 TGeoPatternFinder::TGeoPatternFinder(TGeoVolume *vol, Int_t ndiv)
142 TGeoPatternFinder::TGeoPatternFinder(
const TGeoPatternFinder& pf) :
147 fNdivisions(pf.fNdivisions),
148 fDivIndex(pf.fDivIndex),
156 TGeoPatternFinder& TGeoPatternFinder::operator=(
const TGeoPatternFinder& pf)
159 TObject::operator=(pf);
163 fNdivisions=pf.fNdivisions;
164 fDivIndex=pf.fDivIndex;
173 TGeoPatternFinder::~TGeoPatternFinder()
181 Int_t TGeoPatternFinder::GetCurrent()
183 return GetThreadData().fCurrent;
189 TGeoMatrix* TGeoPatternFinder::GetMatrix()
191 return GetThreadData().fMatrix;
197 Int_t TGeoPatternFinder::GetNext()
const
199 return GetThreadData().fNextIndex;
205 void TGeoPatternFinder::SetNext(Int_t index)
207 GetThreadData().fNextIndex = index;
213 TGeoNode *TGeoPatternFinder::CdNext()
215 ThreadData_t& td = GetThreadData();
216 if (td.fNextIndex < 0)
return NULL;
218 return GetNodeOffset(td.fCurrent);
224 void TGeoPatternFinder::SetRange(Double_t start, Double_t step, Int_t ndivisions)
227 fEnd = fStart + ndivisions*step;
229 fNdivisions = ndivisions;
239 TGeoPatternX::TGeoPatternX()
247 TGeoPatternX::TGeoPatternX(TGeoVolume *vol, Int_t ndivisions)
248 :TGeoPatternFinder(vol, ndivisions)
250 Double_t dx = ((TGeoBBox*)vol->GetShape())->GetDX();
253 fStep = 2*dx/ndivisions;
260 TGeoPatternX::TGeoPatternX(TGeoVolume *vol, Int_t ndivisions, Double_t step)
261 :TGeoPatternFinder(vol, ndivisions)
263 Double_t dx = ((TGeoBBox*)vol->GetShape())->GetDX();
265 fEnd = fStart + ndivisions*step;
273 TGeoPatternX::TGeoPatternX(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
274 :TGeoPatternFinder(vol, ndivisions)
278 fStep = (end - start)/ndivisions;
285 TGeoPatternX::TGeoPatternX(
const TGeoPatternX& pf) :
286 TGeoPatternFinder(pf)
294 TGeoPatternX& TGeoPatternX::operator=(
const TGeoPatternX& pf)
297 TGeoPatternFinder::operator=(pf);
306 TGeoPatternX::~TGeoPatternX()
313 void TGeoPatternX::cd(Int_t idiv)
315 ThreadData_t& td = GetThreadData();
317 td.fMatrix->SetDx(fStart+idiv*fStep+0.5*fStep);
323 TGeoMatrix* TGeoPatternX::CreateMatrix()
const
325 if (!IsReflected()) {
326 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
327 matrix->RegisterYourself();
330 TGeoCombiTrans *combi =
new TGeoCombiTrans();
331 combi->RegisterYourself();
332 combi->ReflectZ(kTRUE);
333 combi->ReflectZ(kFALSE);
341 void TGeoPatternX::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
344 matrix.SetDx(fStart+idiv*fStep+0.5*fStep);
350 Bool_t TGeoPatternX::IsOnBoundary(
const Double_t *point)
const
352 Double_t seg = (point[0]-fStart)/fStep;
353 Double_t diff = seg - Int_t(seg);
354 if (diff>0.5) diff = 1.-diff;
355 if (diff<1e-8)
return kTRUE;
362 TGeoNode *TGeoPatternX::FindNode(Double_t *point,
const Double_t *dir)
364 ThreadData_t& td = GetThreadData();
366 Int_t ind = (Int_t)(1.+(point[0]-fStart)/fStep) - 1;
369 if (dir[0]>0) td.fNextIndex++;
370 else td.fNextIndex--;
371 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
373 if ((ind<0) || (ind>=fNdivisions))
return node;
374 node = GetNodeOffset(ind);
383 Double_t TGeoPatternX::FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext)
385 ThreadData_t& td = GetThreadData();
387 Double_t dist = TGeoShape::Big();
388 if (TMath::Abs(dir[0])<TGeoShape::Tolerance())
return dist;
390 Error(
"FindNextBoundary",
"Must call FindNode first");
393 Int_t inc = (dir[0]>0)?1:0;
394 dist = (fStep*(td.fCurrent+inc)-point[0])/dir[0];
395 if (dist<0.) Error(
"FindNextBoundary",
"Negative distance d=%g",dist);
397 indnext = td.fCurrent+inc;
404 TGeoPatternFinder *TGeoPatternX::MakeCopy(Bool_t reflect)
406 TGeoPatternX *finder =
new TGeoPatternX(*
this);
407 if (!reflect)
return finder;
415 void TGeoPatternX::SavePrimitive(std::ostream &out, Option_t * )
418 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
429 TGeoPatternY::TGeoPatternY()
437 TGeoPatternY::TGeoPatternY(TGeoVolume *vol, Int_t ndivisions)
438 :TGeoPatternFinder(vol, ndivisions)
440 Double_t dy = ((TGeoBBox*)vol->GetShape())->GetDY();
443 fStep = 2*dy/ndivisions;
450 TGeoPatternY::TGeoPatternY(TGeoVolume *vol, Int_t ndivisions, Double_t step)
451 :TGeoPatternFinder(vol, ndivisions)
453 Double_t dy = ((TGeoBBox*)vol->GetShape())->GetDY();
455 fEnd = fStart + ndivisions*step;
463 TGeoPatternY::TGeoPatternY(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
464 :TGeoPatternFinder(vol, ndivisions)
468 fStep = (end - start)/ndivisions;
475 TGeoPatternY::TGeoPatternY(
const TGeoPatternY& pf) :
476 TGeoPatternFinder(pf)
484 TGeoPatternY& TGeoPatternY::operator=(
const TGeoPatternY& pf)
487 TGeoPatternFinder::operator=(pf);
496 TGeoPatternY::~TGeoPatternY()
503 void TGeoPatternY::cd(Int_t idiv)
505 ThreadData_t& td = GetThreadData();
507 td.fMatrix->SetDy(fStart+idiv*fStep+0.5*fStep);
513 TGeoMatrix* TGeoPatternY::CreateMatrix()
const
515 if (!IsReflected()) {
516 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
517 matrix->RegisterYourself();
520 TGeoCombiTrans *combi =
new TGeoCombiTrans();
521 combi->RegisterYourself();
522 combi->ReflectZ(kTRUE);
523 combi->ReflectZ(kFALSE);
531 void TGeoPatternY::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
534 matrix.SetDy(fStart+idiv*fStep+0.5*fStep);
540 Bool_t TGeoPatternY::IsOnBoundary(
const Double_t *point)
const
542 Double_t seg = (point[1]-fStart)/fStep;
543 Double_t diff = seg - Int_t(seg);
544 if (diff>0.5) diff = 1.-diff;
545 if (diff<1e-8)
return kTRUE;
552 TGeoNode *TGeoPatternY::FindNode(Double_t *point,
const Double_t *dir)
554 ThreadData_t& td = GetThreadData();
556 Int_t ind = (Int_t)(1.+(point[1]-fStart)/fStep) - 1;
559 if (dir[1]>0) td.fNextIndex++;
560 else td.fNextIndex--;
561 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
563 if ((ind<0) || (ind>=fNdivisions))
return node;
564 node = GetNodeOffset(ind);
573 Double_t TGeoPatternY::FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext)
575 ThreadData_t& td = GetThreadData();
577 Double_t dist = TGeoShape::Big();
578 if (TMath::Abs(dir[1])<TGeoShape::Tolerance())
return dist;
580 Error(
"FindNextBoundary",
"Must call FindNode first");
583 Int_t inc = (dir[1]>0)?1:0;
584 dist = (fStep*(td.fCurrent+inc)-point[1])/dir[1];
585 if (dist<0.) Error(
"FindNextBoundary",
"Negative distance d=%g",dist);
587 indnext = td.fCurrent+inc;
594 TGeoPatternFinder *TGeoPatternY::MakeCopy(Bool_t reflect)
596 TGeoPatternY *finder =
new TGeoPatternY(*
this);
597 if (!reflect)
return finder;
605 void TGeoPatternY::SavePrimitive(std::ostream &out, Option_t * )
608 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
619 TGeoPatternZ::TGeoPatternZ()
626 TGeoPatternZ::TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions)
627 :TGeoPatternFinder(vol, ndivisions)
629 Double_t dz = ((TGeoBBox*)vol->GetShape())->GetDZ();
632 fStep = 2*dz/ndivisions;
638 TGeoPatternZ::TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions, Double_t step)
639 :TGeoPatternFinder(vol, ndivisions)
641 Double_t dz = ((TGeoBBox*)vol->GetShape())->GetDZ();
643 fEnd = fStart + ndivisions*step;
650 TGeoPatternZ::TGeoPatternZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
651 :TGeoPatternFinder(vol, ndivisions)
655 fStep = (end - start)/ndivisions;
662 TGeoPatternZ::TGeoPatternZ(
const TGeoPatternZ& pf) :
663 TGeoPatternFinder(pf)
671 TGeoPatternZ& TGeoPatternZ::operator=(
const TGeoPatternZ& pf)
674 TGeoPatternFinder::operator=(pf);
683 TGeoPatternZ::~TGeoPatternZ()
689 void TGeoPatternZ::cd(Int_t idiv)
691 ThreadData_t& td = GetThreadData();
693 td.fMatrix->SetDz(((IsReflected())?-1.:1.)*(fStart+idiv*fStep+0.5*fStep));
699 TGeoMatrix* TGeoPatternZ::CreateMatrix()
const
701 if (!IsReflected()) {
702 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
703 matrix->RegisterYourself();
706 TGeoCombiTrans *combi =
new TGeoCombiTrans();
707 combi->RegisterYourself();
708 combi->ReflectZ(kTRUE);
709 combi->ReflectZ(kFALSE);
717 void TGeoPatternZ::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
720 matrix.SetDz(((IsReflected())?-1.:1.)*(fStart+idiv*fStep+0.5*fStep));
726 Bool_t TGeoPatternZ::IsOnBoundary(
const Double_t *point)
const
728 Double_t seg = (point[2]-fStart)/fStep;
729 Double_t diff = seg - Int_t(seg);
730 if (diff>0.5) diff = 1.-diff;
731 if (diff<1e-8)
return kTRUE;
738 TGeoNode *TGeoPatternZ::FindNode(Double_t *point,
const Double_t *dir)
740 ThreadData_t& td = GetThreadData();
742 Int_t ind = (Int_t)(1.+(point[2]-fStart)/fStep) - 1;
745 if (dir[2]>0) td.fNextIndex++;
746 else td.fNextIndex--;
747 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
749 if ((ind<0) || (ind>=fNdivisions))
return node;
750 node = GetNodeOffset(ind);
759 Double_t TGeoPatternZ::FindNextBoundary(Double_t *point, Double_t *dir, Int_t &indnext)
762 ThreadData_t& td = GetThreadData();
763 Double_t dist = TGeoShape::Big();
764 if (TMath::Abs(dir[2])<TGeoShape::Tolerance())
return dist;
766 Error(
"FindNextBoundary",
"Must call FindNode first");
769 Int_t inc = (dir[2]>0)?1:0;
770 dist = (fStep*(td.fCurrent+inc)-point[2])/dir[2];
771 if (dist<0.) Error(
"FindNextBoundary",
"Negative distance d=%g",dist);
773 indnext = td.fCurrent+inc;
780 TGeoPatternFinder *TGeoPatternZ::MakeCopy(Bool_t reflect)
782 TGeoPatternZ *finder =
new TGeoPatternZ(*
this);
783 if (!reflect)
return finder;
791 void TGeoPatternZ::SavePrimitive(std::ostream &out, Option_t * )
794 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
804 TGeoPatternParaX::TGeoPatternParaX()
811 TGeoPatternParaX::TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions)
812 :TGeoPatternFinder(vol, ndivisions)
814 Double_t dx = ((TGeoPara*)vol->GetShape())->GetX();
817 fStep = 2*dx/ndivisions;
823 TGeoPatternParaX::TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions, Double_t step)
824 :TGeoPatternFinder(vol, ndivisions)
826 Double_t dx = ((TGeoPara*)vol->GetShape())->GetX();
828 fEnd = fStart + ndivisions*step;
835 TGeoPatternParaX::TGeoPatternParaX(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
836 :TGeoPatternFinder(vol, ndivisions)
840 fStep = (end - start)/ndivisions;
847 TGeoPatternParaX::TGeoPatternParaX(
const TGeoPatternParaX& pf) :
848 TGeoPatternFinder(pf)
856 TGeoPatternParaX& TGeoPatternParaX::operator=(
const TGeoPatternParaX& pf)
859 TGeoPatternFinder::operator=(pf);
868 TGeoPatternParaX::~TGeoPatternParaX()
874 void TGeoPatternParaX::cd(Int_t idiv)
876 ThreadData_t& td = GetThreadData();
878 td.fMatrix->SetDx(fStart+idiv*fStep+0.5*fStep);
884 Bool_t TGeoPatternParaX::IsOnBoundary(
const Double_t *point)
const
886 Double_t txy = ((TGeoPara*)fVolume->GetShape())->GetTxy();
887 Double_t txz = ((TGeoPara*)fVolume->GetShape())->GetTxz();
888 Double_t tyz = ((TGeoPara*)fVolume->GetShape())->GetTyz();
889 Double_t xt = point[0]-txz*point[2]-txy*(point[1]-tyz*point[2]);
890 Double_t seg = (xt-fStart)/fStep;
891 Double_t diff = seg - Int_t(seg);
892 if (diff>0.5) diff = 1.-diff;
893 if (diff<1e-8)
return kTRUE;
900 TGeoNode *TGeoPatternParaX::FindNode(Double_t *point,
const Double_t *dir)
902 ThreadData_t& td = GetThreadData();
904 Double_t txy = ((TGeoPara*)fVolume->GetShape())->GetTxy();
905 Double_t txz = ((TGeoPara*)fVolume->GetShape())->GetTxz();
906 Double_t tyz = ((TGeoPara*)fVolume->GetShape())->GetTyz();
907 Double_t xt = point[0]-txz*point[2]-txy*(point[1]-tyz*point[2]);
908 Int_t ind = (Int_t)(1.+(xt-fStart)/fStep)-1;
910 Double_t ttsq = txy*txy + (txz-txy*tyz)*(txz-txy*tyz);
911 Double_t divdirx = 1./TMath::Sqrt(1.+ttsq);
912 Double_t divdiry = -txy*divdirx;
913 Double_t divdirz = -(txz-txy*tyz)*divdirx;
914 Double_t dot = dir[0]*divdirx + dir[1]*divdiry + dir[2]*divdirz;
916 if (dot>0) td.fNextIndex++;
917 else td.fNextIndex--;
918 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
920 if ((ind<0) || (ind>=fNdivisions))
return node;
921 node = GetNodeOffset(ind);
929 TGeoPatternFinder *TGeoPatternParaX::MakeCopy(Bool_t reflect)
931 TGeoPatternParaX *finder =
new TGeoPatternParaX(*
this);
932 if (!reflect)
return finder;
940 void TGeoPatternParaX::SavePrimitive(std::ostream &out, Option_t * )
943 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
949 TGeoMatrix* TGeoPatternParaX::CreateMatrix()
const
951 if (!IsReflected()) {
952 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
953 matrix->RegisterYourself();
956 TGeoCombiTrans *combi =
new TGeoCombiTrans();
957 combi->RegisterYourself();
958 combi->ReflectZ(kTRUE);
959 combi->ReflectZ(kFALSE);
967 void TGeoPatternParaX::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
970 matrix.SetDx(fStart+idiv*fStep+0.5*fStep);
980 TGeoPatternParaY::TGeoPatternParaY()
988 TGeoPatternParaY::TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions)
989 :TGeoPatternFinder(vol, ndivisions)
991 fTxy = ((TGeoPara*)vol->GetShape())->GetTxy();
992 Double_t dy = ((TGeoPara*)vol->GetShape())->GetY();
995 fStep = 2*dy/ndivisions;
1001 TGeoPatternParaY::TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions, Double_t step)
1002 :TGeoPatternFinder(vol, ndivisions)
1004 fTxy = ((TGeoPara*)vol->GetShape())->GetTxy();
1005 Double_t dy = ((TGeoPara*)vol->GetShape())->GetY();
1007 fEnd = fStart + ndivisions*step;
1009 CreateThreadData(1);
1014 TGeoPatternParaY::TGeoPatternParaY(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
1015 :TGeoPatternFinder(vol, ndivisions)
1017 fTxy = ((TGeoPara*)vol->GetShape())->GetTxy();
1020 fStep = (end - start)/ndivisions;
1021 CreateThreadData(1);
1026 TGeoPatternParaY::TGeoPatternParaY(
const TGeoPatternParaY& pf) :
1027 TGeoPatternFinder(pf)
1029 CreateThreadData(1);
1035 TGeoPatternParaY& TGeoPatternParaY::operator=(
const TGeoPatternParaY& pf)
1038 TGeoPatternFinder::operator=(pf);
1039 CreateThreadData(1);
1047 TGeoPatternParaY::~TGeoPatternParaY()
1053 void TGeoPatternParaY::cd(Int_t idiv)
1055 ThreadData_t& td = GetThreadData();
1057 Double_t dy = fStart+idiv*fStep+0.5*fStep;
1058 td.fMatrix->SetDx(fTxy*dy);
1059 td.fMatrix->SetDy(dy);
1065 Bool_t TGeoPatternParaY::IsOnBoundary(
const Double_t *point)
const
1067 Double_t tyz = ((TGeoPara*)fVolume->GetShape())->GetTyz();
1068 Double_t yt = point[1]-tyz*point[2];
1069 Double_t seg = (yt-fStart)/fStep;
1070 Double_t diff = seg - Int_t(seg);
1071 if (diff>0.5) diff = 1.-diff;
1072 if (diff<1e-8)
return kTRUE;
1079 TGeoNode *TGeoPatternParaY::FindNode(Double_t *point,
const Double_t *dir)
1081 ThreadData_t& td = GetThreadData();
1083 Double_t tyz = ((TGeoPara*)fVolume->GetShape())->GetTyz();
1084 Double_t yt = point[1]-tyz*point[2];
1085 Int_t ind = (Int_t)(1.+(yt-fStart)/fStep) - 1;
1087 Double_t divdiry = 1./TMath::Sqrt(1.+tyz*tyz);
1088 Double_t divdirz = -tyz*divdiry;
1089 Double_t dot = dir[1]*divdiry + dir[2]*divdirz;
1090 td.fNextIndex = ind;
1091 if (dot>0) td.fNextIndex++;
1092 else td.fNextIndex--;
1093 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
1095 if ((ind<0) || (ind>=fNdivisions))
return node;
1096 node = GetNodeOffset(ind);
1104 TGeoPatternFinder *TGeoPatternParaY::MakeCopy(Bool_t reflect)
1106 TGeoPatternParaY *finder =
new TGeoPatternParaY(*
this);
1107 if (!reflect)
return finder;
1115 void TGeoPatternParaY::SavePrimitive(std::ostream &out, Option_t * )
1118 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
1124 TGeoMatrix* TGeoPatternParaY::CreateMatrix()
const
1126 if (!IsReflected()) {
1127 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
1128 matrix->RegisterYourself();
1131 TGeoCombiTrans *combi =
new TGeoCombiTrans();
1132 combi->RegisterYourself();
1133 combi->ReflectZ(kTRUE);
1134 combi->ReflectZ(kFALSE);
1142 void TGeoPatternParaY::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
1145 Double_t dy = fStart+idiv*fStep+0.5*fStep;
1146 matrix.SetDx(fTxy*dy);
1157 TGeoPatternParaZ::TGeoPatternParaZ()
1161 CreateThreadData(1);
1166 TGeoPatternParaZ::TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions)
1167 :TGeoPatternFinder(vol, ndivisions)
1169 fTxz = ((TGeoPara*)vol->GetShape())->GetTxz();
1170 fTyz = ((TGeoPara*)vol->GetShape())->GetTyz();
1171 Double_t dz = ((TGeoPara*)vol->GetShape())->GetZ();
1174 fStep = 2*dz/ndivisions;
1175 CreateThreadData(1);
1180 TGeoPatternParaZ::TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions, Double_t step)
1181 :TGeoPatternFinder(vol, ndivisions)
1183 fTxz = ((TGeoPara*)vol->GetShape())->GetTxz();
1184 fTyz = ((TGeoPara*)vol->GetShape())->GetTyz();
1185 Double_t dz = ((TGeoPara*)vol->GetShape())->GetZ();
1187 fEnd = fStart + ndivisions*step;
1189 CreateThreadData(1);
1195 TGeoPatternParaZ::TGeoPatternParaZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
1196 :TGeoPatternFinder(vol, ndivisions)
1198 fTxz = ((TGeoPara*)vol->GetShape())->GetTxz();
1199 fTyz = ((TGeoPara*)vol->GetShape())->GetTyz();
1202 fStep = (end - start)/ndivisions;
1203 CreateThreadData(1);
1209 TGeoPatternParaZ::TGeoPatternParaZ(
const TGeoPatternParaZ& pf) :
1210 TGeoPatternFinder(pf)
1212 CreateThreadData(1);
1218 TGeoPatternParaZ& TGeoPatternParaZ::operator=(
const TGeoPatternParaZ& pf)
1221 TGeoPatternFinder::operator=(pf);
1222 CreateThreadData(1);
1230 TGeoPatternParaZ::~TGeoPatternParaZ()
1237 void TGeoPatternParaZ::cd(Int_t idiv)
1239 ThreadData_t& td = GetThreadData();
1241 Double_t dz = fStart+idiv*fStep+0.5*fStep;
1242 td.fMatrix->SetDx(fTxz*dz);
1243 td.fMatrix->SetDy(fTyz*dz);
1244 td.fMatrix->SetDz((IsReflected())?-dz:dz);
1250 Bool_t TGeoPatternParaZ::IsOnBoundary(
const Double_t *point)
const
1252 Double_t seg = (point[2]-fStart)/fStep;
1253 Double_t diff = seg - Int_t(seg);
1254 if (diff>0.5) diff = 1.-diff;
1255 if (diff<1e-8)
return kTRUE;
1262 TGeoNode *TGeoPatternParaZ::FindNode(Double_t *point,
const Double_t *dir)
1264 ThreadData_t& td = GetThreadData();
1266 Double_t zt = point[2];
1267 Int_t ind = (Int_t)(1.+(zt-fStart)/fStep) - 1;
1269 td.fNextIndex = ind;
1270 if (dir[2]>0) td.fNextIndex++;
1271 else td.fNextIndex--;
1272 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
1274 if ((ind<0) || (ind>=fNdivisions))
return node;
1275 node = GetNodeOffset(ind);
1283 TGeoPatternFinder *TGeoPatternParaZ::MakeCopy(Bool_t reflect)
1285 TGeoPatternParaZ *finder =
new TGeoPatternParaZ(*
this);
1286 if (!reflect)
return finder;
1294 void TGeoPatternParaZ::SavePrimitive(std::ostream &out, Option_t * )
1297 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
1303 TGeoMatrix* TGeoPatternParaZ::CreateMatrix()
const
1305 if (!IsReflected()) {
1306 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
1307 matrix->RegisterYourself();
1310 TGeoCombiTrans *combi =
new TGeoCombiTrans();
1311 combi->RegisterYourself();
1312 combi->ReflectZ(kTRUE);
1313 combi->ReflectZ(kFALSE);
1321 void TGeoPatternParaZ::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
1324 Double_t dz = fStart+idiv*fStep+0.5*fStep;
1325 matrix.SetDx(fTxz*dz);
1326 matrix.SetDy(fTyz*dz);
1327 matrix.SetDz((IsReflected())?-dz:dz);
1337 TGeoPatternTrapZ::TGeoPatternTrapZ()
1341 CreateThreadData(1);
1346 TGeoPatternTrapZ::TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions)
1347 :TGeoPatternFinder(vol, ndivisions)
1349 Double_t theta = ((TGeoTrap*)vol->GetShape())->GetTheta();
1350 Double_t phi = ((TGeoTrap*)vol->GetShape())->GetPhi();
1351 fTxz = TMath::Tan(theta*TMath::DegToRad())*TMath::Cos(phi*TMath::DegToRad());
1352 fTyz = TMath::Tan(theta*TMath::DegToRad())*TMath::Sin(phi*TMath::DegToRad());
1353 Double_t dz = ((TGeoArb8*)vol->GetShape())->GetDz();
1356 fStep = 2*dz/ndivisions;
1357 CreateThreadData(1);
1362 TGeoPatternTrapZ::TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions, Double_t step)
1363 :TGeoPatternFinder(vol, ndivisions)
1365 Double_t theta = ((TGeoTrap*)vol->GetShape())->GetTheta();
1366 Double_t phi = ((TGeoTrap*)vol->GetShape())->GetPhi();
1367 fTxz = TMath::Tan(theta*TMath::DegToRad())*TMath::Cos(phi*TMath::DegToRad());
1368 fTyz = TMath::Tan(theta*TMath::DegToRad())*TMath::Sin(phi*TMath::DegToRad());
1369 Double_t dz = ((TGeoArb8*)vol->GetShape())->GetDz();
1371 fEnd = fStart + ndivisions*step;
1373 CreateThreadData(1);
1378 TGeoPatternTrapZ::TGeoPatternTrapZ(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
1379 :TGeoPatternFinder(vol, ndivisions)
1381 Double_t theta = ((TGeoTrap*)vol->GetShape())->GetTheta();
1382 Double_t phi = ((TGeoTrap*)vol->GetShape())->GetPhi();
1383 fTxz = TMath::Tan(theta*TMath::DegToRad())*TMath::Cos(phi*TMath::DegToRad());
1384 fTyz = TMath::Tan(theta*TMath::DegToRad())*TMath::Sin(phi*TMath::DegToRad());
1387 fStep = (end - start)/ndivisions;
1388 CreateThreadData(1);
1394 TGeoPatternTrapZ::TGeoPatternTrapZ(
const TGeoPatternTrapZ& pf) :
1395 TGeoPatternFinder(pf),
1399 CreateThreadData(1);
1405 TGeoPatternTrapZ& TGeoPatternTrapZ::operator=(
const TGeoPatternTrapZ& pf)
1408 TGeoPatternFinder::operator=(pf);
1411 CreateThreadData(1);
1419 TGeoPatternTrapZ::~TGeoPatternTrapZ()
1425 void TGeoPatternTrapZ::cd(Int_t idiv)
1427 ThreadData_t& td = GetThreadData();
1429 Double_t dz = fStart+idiv*fStep+0.5*fStep;
1430 td.fMatrix->SetDx(fTxz*dz);
1431 td.fMatrix->SetDy(fTyz*dz);
1432 td.fMatrix->SetDz((IsReflected())?-dz:dz);
1438 Bool_t TGeoPatternTrapZ::IsOnBoundary(
const Double_t *point)
const
1440 Double_t seg = (point[2]-fStart)/fStep;
1441 Double_t diff = seg - Int_t(seg);
1442 if (diff>0.5) diff = 1.-diff;
1443 if (diff<1e-8)
return kTRUE;
1450 TGeoNode *TGeoPatternTrapZ::FindNode(Double_t *point,
const Double_t *dir)
1452 ThreadData_t& td = GetThreadData();
1454 Double_t zt = point[2];
1455 Int_t ind = (Int_t)(1. + (zt-fStart)/fStep) - 1;
1457 td.fNextIndex = ind;
1458 if (dir[2]>0) td.fNextIndex++;
1459 else td.fNextIndex--;
1460 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
1462 if ((ind<0) || (ind>=fNdivisions))
return node;
1463 node = GetNodeOffset(ind);
1471 TGeoPatternFinder *TGeoPatternTrapZ::MakeCopy(Bool_t reflect)
1473 TGeoPatternTrapZ *finder =
new TGeoPatternTrapZ(*
this);
1474 if (!reflect)
return finder;
1482 void TGeoPatternTrapZ::SavePrimitive(std::ostream &out, Option_t * )
1485 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
1491 TGeoMatrix* TGeoPatternTrapZ::CreateMatrix()
const
1493 if (!IsReflected()) {
1494 TGeoMatrix *matrix =
new TGeoTranslation(0.,0.,0.);
1495 matrix->RegisterYourself();
1498 TGeoCombiTrans *combi =
new TGeoCombiTrans();
1499 combi->RegisterYourself();
1500 combi->ReflectZ(kTRUE);
1501 combi->ReflectZ(kFALSE);
1509 void TGeoPatternTrapZ::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
1512 Double_t dz = fStart+idiv*fStep+0.5*fStep;
1513 matrix.SetDx(fTxz*dz);
1514 matrix.SetDy(fTyz*dz);
1515 matrix.SetDz((IsReflected())?-dz:dz);
1525 TGeoPatternCylR::TGeoPatternCylR()
1527 CreateThreadData(1);
1532 TGeoPatternCylR::TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions)
1533 :TGeoPatternFinder(vol, ndivisions)
1535 CreateThreadData(1);
1540 TGeoPatternCylR::TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions, Double_t step)
1541 :TGeoPatternFinder(vol, ndivisions)
1544 CreateThreadData(1);
1550 TGeoPatternCylR::TGeoPatternCylR(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
1551 :TGeoPatternFinder(vol, ndivisions)
1555 fStep = (end - start)/ndivisions;
1556 CreateThreadData(1);
1561 TGeoPatternCylR::TGeoPatternCylR(
const TGeoPatternCylR& pf) :
1562 TGeoPatternFinder(pf)
1564 CreateThreadData(1);
1570 TGeoPatternCylR& TGeoPatternCylR::operator=(
const TGeoPatternCylR& pf)
1573 TGeoPatternFinder::operator=(pf);
1574 CreateThreadData(1);
1582 TGeoPatternCylR::~TGeoPatternCylR()
1589 Bool_t TGeoPatternCylR::IsOnBoundary(
const Double_t *point)
const
1591 Double_t r = TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
1592 Double_t seg = (r-fStart)/fStep;
1593 Double_t diff = seg - Int_t(seg);
1594 if (diff>0.5) diff = 1.-diff;
1595 if (diff<1e-8)
return kTRUE;
1602 void TGeoPatternCylR::cd(Int_t idiv)
1604 ThreadData_t& td = GetThreadData();
1611 TGeoNode *TGeoPatternCylR::FindNode(Double_t *point,
const Double_t *dir)
1613 ThreadData_t& td = GetThreadData();
1614 if (!td.fMatrix) td.fMatrix = gGeoIdentity;
1616 Double_t r = TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
1617 Int_t ind = (Int_t)(1. + (r-fStart)/fStep) - 1;
1619 td.fNextIndex = ind;
1620 Double_t dot = point[0]*dir[0] + point[1]*dir[1];
1621 if (dot>0) td.fNextIndex++;
1622 else td.fNextIndex--;
1623 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
1625 if ((ind<0) || (ind>=fNdivisions))
return node;
1626 node = GetNodeOffset(ind);
1634 TGeoPatternFinder *TGeoPatternCylR::MakeCopy(Bool_t reflect)
1636 TGeoPatternCylR *finder =
new TGeoPatternCylR(*
this);
1637 if (!reflect)
return finder;
1645 void TGeoPatternCylR::SavePrimitive(std::ostream &out, Option_t * )
1648 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
1654 TGeoMatrix* TGeoPatternCylR::CreateMatrix()
const
1656 return gGeoIdentity;
1663 void TGeoPatternCylR::UpdateMatrix(Int_t, TGeoHMatrix &matrix)
const
1675 TGeoPatternCylPhi::TGeoPatternCylPhi()
1678 CreateThreadData(1);
1684 TGeoPatternCylPhi::TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions)
1685 :TGeoPatternFinder(vol, ndivisions)
1690 fSinCos =
new Double_t[2*fNdivisions];
1691 for (Int_t i = 0; i<fNdivisions; i++) {
1692 fSinCos[2*i] = TMath::Sin(TMath::DegToRad()*(fStart+0.5*fStep+i*fStep));
1693 fSinCos[2*i+1] = TMath::Cos(TMath::DegToRad()*(fStart+0.5*fStep+i*fStep));
1695 CreateThreadData(1);
1700 TGeoPatternCylPhi::TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions, Double_t step)
1701 :TGeoPatternFinder(vol, ndivisions)
1704 fSinCos =
new Double_t[2*ndivisions];
1705 for (Int_t i = 0; i<fNdivisions; i++) {
1706 fSinCos[2*i] = TMath::Sin(TMath::DegToRad()*(fStart+0.5*fStep+i*fStep));
1707 fSinCos[2*i+1] = TMath::Cos(TMath::DegToRad()*(fStart+0.5*fStep+i*fStep));
1709 CreateThreadData(1);
1715 TGeoPatternCylPhi::TGeoPatternCylPhi(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
1716 :TGeoPatternFinder(vol, ndivisions)
1719 if (fStart<0) fStart+=360;
1721 if (fEnd<0) fEnd+=360;
1723 fStep = (end-start+360)/ndivisions;
1725 fStep = (end-start)/ndivisions;
1726 fSinCos =
new Double_t[2*ndivisions];
1727 for (Int_t idiv = 0; idiv<ndivisions; idiv++) {
1728 fSinCos[2*idiv] = TMath::Sin(TMath::DegToRad()*(start+0.5*fStep+idiv*fStep));
1729 fSinCos[2*idiv+1] = TMath::Cos(TMath::DegToRad()*(start+0.5*fStep+idiv*fStep));
1731 CreateThreadData(1);
1736 TGeoPatternCylPhi::~TGeoPatternCylPhi()
1738 if (fSinCos)
delete [] fSinCos;
1743 void TGeoPatternCylPhi::cd(Int_t idiv)
1745 ThreadData_t& td = GetThreadData();
1747 ((TGeoRotation*)td.fMatrix)->FastRotZ(&fSinCos[2*idiv]);
1753 Bool_t TGeoPatternCylPhi::IsOnBoundary(
const Double_t *point)
const
1755 Double_t phi = TMath::ATan2(point[1], point[0])*TMath::RadToDeg();
1756 if (phi<0) phi += 360;
1757 Double_t ddp = phi - fStart;
1758 if (ddp<0) ddp+=360;
1759 Double_t seg = ddp/fStep;
1760 Double_t diff = seg - Int_t(seg);
1761 if (diff>0.5) diff = 1.-diff;
1762 if (diff<1e-8)
return kTRUE;
1769 TGeoNode *TGeoPatternCylPhi::FindNode(Double_t *point,
const Double_t *dir)
1771 ThreadData_t& td = GetThreadData();
1773 Double_t phi = TMath::ATan2(point[1], point[0])*TMath::RadToDeg();
1774 if (phi<0) phi += 360;
1776 Double_t ddp = phi - fStart;
1777 if (ddp<0) ddp+=360;
1779 Int_t ind = (Int_t)(1. + ddp/fStep) - 1;
1781 td.fNextIndex = ind;
1782 Double_t dot = point[0]*dir[1]-point[1]*dir[0];
1783 if (dot>0) td.fNextIndex++;
1784 else td.fNextIndex--;
1785 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
1787 if ((ind<0) || (ind>=fNdivisions))
return node;
1788 node = GetNodeOffset(ind);
1796 TGeoPatternFinder *TGeoPatternCylPhi::MakeCopy(Bool_t reflect)
1798 TGeoPatternCylPhi *finder =
new TGeoPatternCylPhi(*
this);
1799 if (!reflect)
return finder;
1807 void TGeoPatternCylPhi::SavePrimitive(std::ostream &out, Option_t * )
1810 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
1816 void TGeoPatternCylPhi::Streamer(TBuffer &R__b)
1818 if (R__b.IsReading()) {
1819 R__b.ReadClassBuffer(TGeoPatternCylPhi::Class(),
this);
1821 fSinCos =
new Double_t[2*fNdivisions];
1822 for (Int_t idiv = 0; idiv<fNdivisions; idiv++) {
1823 fSinCos[2*idiv] = TMath::Sin(TMath::DegToRad()*(fStart+0.5*fStep+idiv*fStep));
1824 fSinCos[2*idiv+1] = TMath::Cos(TMath::DegToRad()*(fStart+0.5*fStep+idiv*fStep));
1828 R__b.WriteClassBuffer(TGeoPatternCylPhi::Class(),
this);
1835 TGeoMatrix* TGeoPatternCylPhi::CreateMatrix()
const
1837 if (!IsReflected()) {
1838 TGeoRotation *matrix =
new TGeoRotation();
1839 matrix->RegisterYourself();
1842 TGeoRotation *rot =
new TGeoRotation();
1843 rot->RegisterYourself();
1844 rot->ReflectZ(kTRUE);
1845 rot->ReflectZ(kFALSE);
1853 void TGeoPatternCylPhi::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
1856 matrix.FastRotZ(&fSinCos[2*idiv]);
1866 TGeoPatternSphR::TGeoPatternSphR()
1868 CreateThreadData(1);
1874 TGeoPatternSphR::TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions)
1875 :TGeoPatternFinder(vol, ndivisions)
1877 CreateThreadData(1);
1882 TGeoPatternSphR::TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions, Double_t step)
1883 :TGeoPatternFinder(vol, ndivisions)
1886 CreateThreadData(1);
1892 TGeoPatternSphR::TGeoPatternSphR(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
1893 :TGeoPatternFinder(vol, ndivisions)
1897 fStep = (end - start)/ndivisions;
1898 CreateThreadData(1);
1903 TGeoPatternSphR::TGeoPatternSphR(
const TGeoPatternSphR& pf) :
1904 TGeoPatternFinder(pf)
1906 CreateThreadData(1);
1912 TGeoPatternSphR& TGeoPatternSphR::operator=(
const TGeoPatternSphR& pf)
1915 TGeoPatternFinder::operator=(pf);
1916 CreateThreadData(1);
1924 TGeoPatternSphR::~TGeoPatternSphR()
1930 void TGeoPatternSphR::cd(Int_t idiv)
1932 ThreadData_t& td = GetThreadData();
1938 TGeoNode *TGeoPatternSphR::FindNode(Double_t * ,
const Double_t * )
1946 TGeoPatternFinder *TGeoPatternSphR::MakeCopy(Bool_t)
1948 TGeoPatternSphR *finder =
new TGeoPatternSphR(*
this);
1955 void TGeoPatternSphR::SavePrimitive(std::ostream &out, Option_t * )
1958 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
1964 TGeoMatrix* TGeoPatternSphR::CreateMatrix()
const
1966 return gGeoIdentity;
1973 void TGeoPatternSphR::UpdateMatrix(Int_t, TGeoHMatrix &matrix)
const
1985 TGeoPatternSphTheta::TGeoPatternSphTheta()
1987 CreateThreadData(1);
1993 TGeoPatternSphTheta::TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions)
1994 :TGeoPatternFinder(vol, ndivisions)
1996 CreateThreadData(1);
2001 TGeoPatternSphTheta::TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions, Double_t step)
2002 :TGeoPatternFinder(vol, ndivisions)
2005 CreateThreadData(1);
2011 TGeoPatternSphTheta::TGeoPatternSphTheta(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
2012 :TGeoPatternFinder(vol, ndivisions)
2016 fStep = (end - start)/ndivisions;
2017 CreateThreadData(1);
2022 TGeoPatternSphTheta::TGeoPatternSphTheta(
const TGeoPatternSphTheta& pf) :
2023 TGeoPatternFinder(pf)
2025 CreateThreadData(1);
2030 TGeoPatternSphTheta& TGeoPatternSphTheta::operator=(
const TGeoPatternSphTheta& pf)
2033 TGeoPatternFinder::operator=(pf);
2034 CreateThreadData(1);
2041 TGeoPatternSphTheta::~TGeoPatternSphTheta()
2047 void TGeoPatternSphTheta::cd(Int_t idiv)
2049 ThreadData_t& td = GetThreadData();
2055 TGeoNode *TGeoPatternSphTheta::FindNode(Double_t * ,
const Double_t * )
2063 TGeoPatternFinder *TGeoPatternSphTheta::MakeCopy(Bool_t)
2065 TGeoPatternSphTheta *finder =
new TGeoPatternSphTheta(*
this);
2072 void TGeoPatternSphTheta::SavePrimitive(std::ostream &out, Option_t * )
2075 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
2081 TGeoMatrix* TGeoPatternSphTheta::CreateMatrix()
const
2083 return gGeoIdentity;
2090 void TGeoPatternSphTheta::UpdateMatrix(Int_t, TGeoHMatrix &matrix)
const
2102 TGeoPatternSphPhi::TGeoPatternSphPhi()
2105 CreateThreadData(1);
2111 TGeoPatternSphPhi::TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions)
2112 :TGeoPatternFinder(vol, ndivisions)
2116 fStep = 360./ndivisions;
2118 CreateThreadData(1);
2124 TGeoPatternSphPhi::TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions, Double_t step)
2125 :TGeoPatternFinder(vol, ndivisions)
2129 CreateThreadData(1);
2135 TGeoPatternSphPhi::TGeoPatternSphPhi(TGeoVolume *vol, Int_t ndivisions, Double_t start, Double_t end)
2136 :TGeoPatternFinder(vol, ndivisions)
2139 if (fStart<0) fStart+=360;
2141 if (fEnd<0) fEnd+=360;
2143 fStep = (end-start+360)/ndivisions;
2145 fStep = (end-start)/ndivisions;
2147 CreateThreadData(1);
2153 TGeoPatternSphPhi::~TGeoPatternSphPhi()
2161 Double_t *TGeoPatternSphPhi::CreateSinCos()
2163 fSinCos =
new Double_t[2*fNdivisions];
2164 for (Int_t idiv = 0; idiv<fNdivisions; idiv++) {
2165 fSinCos[2*idiv] = TMath::Sin(TMath::DegToRad()*(fStart+0.5*fStep+idiv*fStep));
2166 fSinCos[2*idiv+1] = TMath::Cos(TMath::DegToRad()*(fStart+0.5*fStep+idiv*fStep));
2174 void TGeoPatternSphPhi::cd(Int_t idiv)
2176 ThreadData_t& td = GetThreadData();
2178 if (!fSinCos) CreateSinCos();
2179 ((TGeoRotation*)td.fMatrix)->FastRotZ(&fSinCos[2*idiv]);
2185 Bool_t TGeoPatternSphPhi::IsOnBoundary(
const Double_t *point)
const
2187 Double_t phi = TMath::ATan2(point[1], point[0])*TMath::RadToDeg();
2188 if (phi<0) phi += 360;
2189 Double_t ddp = phi - fStart;
2190 if (ddp<0) ddp+=360;
2191 Double_t seg = ddp/fStep;
2192 Double_t diff = seg - Int_t(seg);
2193 if (diff>0.5) diff = 1.-diff;
2194 if (diff<1e-8)
return kTRUE;
2200 TGeoNode *TGeoPatternSphPhi::FindNode(Double_t * point,
const Double_t * dir)
2202 ThreadData_t& td = GetThreadData();
2204 Double_t phi = TMath::ATan2(point[1], point[0])*TMath::RadToDeg();
2205 if (phi<0) phi += 360;
2207 Double_t ddp = phi - fStart;
2208 if (ddp<0) ddp+=360;
2210 Int_t ind = (Int_t)(1. + ddp/fStep) - 1;
2212 td.fNextIndex = ind;
2213 Double_t dot = point[0]*dir[1]-point[1]*dir[0];
2214 if (dot>0) td.fNextIndex++;
2215 else td.fNextIndex--;
2216 if ((td.fNextIndex<0) || (td.fNextIndex>=fNdivisions)) td.fNextIndex = -1;
2218 if ((ind<0) || (ind>=fNdivisions))
return node;
2219 node = GetNodeOffset(ind);
2226 TGeoPatternFinder *TGeoPatternSphPhi::MakeCopy(Bool_t reflect)
2228 TGeoPatternSphPhi *finder =
new TGeoPatternSphPhi(fVolume, fNdivisions, fStart, fEnd);
2229 if (!reflect)
return finder;
2237 void TGeoPatternSphPhi::SavePrimitive(std::ostream &out, Option_t * )
2240 out << iaxis <<
", " << fNdivisions <<
", " << fStart <<
", " << fStep;
2245 TGeoMatrix* TGeoPatternSphPhi::CreateMatrix()
const
2247 if (!IsReflected()) {
2248 TGeoRotation *matrix =
new TGeoRotation();
2249 matrix->RegisterYourself();
2252 TGeoRotation *rot =
new TGeoRotation();
2253 rot->RegisterYourself();
2254 rot->ReflectZ(kTRUE);
2255 rot->ReflectZ(kFALSE);
2262 void TGeoPatternSphPhi::UpdateMatrix(Int_t idiv, TGeoHMatrix &matrix)
const
2264 if (!fSinCos) ((TGeoPatternSphPhi*)
this)->CreateSinCos();
2266 matrix.FastRotZ(&fSinCos[2*idiv]);
2276 TGeoPatternHoneycomb::TGeoPatternHoneycomb()
2282 CreateThreadData(1);
2287 TGeoPatternHoneycomb::TGeoPatternHoneycomb(TGeoVolume *vol, Int_t nrows)
2288 :TGeoPatternFinder(vol, nrows)
2294 CreateThreadData(1);
2300 TGeoPatternHoneycomb::TGeoPatternHoneycomb(
const TGeoPatternHoneycomb& pfh) :
2301 TGeoPatternFinder(pfh),
2303 fAxisOnRows(pfh.fAxisOnRows),
2304 fNdivisions(pfh.fNdivisions),
2307 CreateThreadData(1);
2313 TGeoPatternHoneycomb& TGeoPatternHoneycomb::operator=(
const TGeoPatternHoneycomb& pfh)
2316 TGeoPatternFinder::operator=(pfh);
2318 fAxisOnRows=pfh.fAxisOnRows;
2319 fNdivisions=pfh.fNdivisions;
2321 CreateThreadData(1);
2328 TGeoPatternHoneycomb::~TGeoPatternHoneycomb()
2334 void TGeoPatternHoneycomb::cd(Int_t idiv)
2336 ThreadData_t& td = GetThreadData();
2342 TGeoNode *TGeoPatternHoneycomb::FindNode(Double_t * ,
const Double_t * )
2350 TGeoMatrix* TGeoPatternHoneycomb::CreateMatrix()
const
2352 return gGeoIdentity;
2359 void TGeoPatternHoneycomb::UpdateMatrix(Int_t, TGeoHMatrix &matrix)
const