26 ClassImp(TGeoOverlap);
39 TGeoOverlap::TGeoOverlap()
52 TGeoOverlap::TGeoOverlap(
const char *name, TGeoVolume *vol1, TGeoVolume *vol2,
53 const TGeoMatrix *matrix1,
const TGeoMatrix *matrix2,
54 Bool_t isovlp, Double_t ovlp)
60 fMatrix1 =
new TGeoHMatrix();
62 fMatrix2 =
new TGeoHMatrix();
64 fMarker =
new TPolyMarker3D();
65 fMarker->SetMarkerColor(2);
67 fMarker->SetMarkerStyle(6);
74 TGeoOverlap::~TGeoOverlap()
76 if (fMarker)
delete fMarker;
77 if (fMatrix1)
delete fMatrix1;
78 if (fMatrix2)
delete fMatrix2;
84 void TGeoOverlap::Browse(TBrowser *b)
96 Int_t TGeoOverlap::Compare(
const TObject *obj)
const
98 TGeoOverlap *other = 0;
99 other = (TGeoOverlap*)obj;
101 Error(
"Compare",
"other object is not TGeoOverlap");
105 if (other->IsExtrusion())
return (fOverlap<=other->GetOverlap())?1:-1;
108 if (other->IsExtrusion())
return 1;
109 return (fOverlap<=other->GetOverlap())?1:-1;
116 Int_t TGeoOverlap::DistancetoPrimitive(Int_t px, Int_t py)
118 return fVolume1->GetGeoManager()->GetGeomPainter()->DistanceToPrimitiveVol(fVolume1, px, py);
125 void TGeoOverlap::Draw(Option_t *option)
127 fVolume1->GetGeoManager()->GetGeomPainter()->DrawOverlap(
this, option);
134 void TGeoOverlap::ExecuteEvent(Int_t event, Int_t px, Int_t py)
136 fVolume1->GetGeoManager()->GetGeomPainter()->ExecuteVolumeEvent(fVolume1, event, px, py);
142 void TGeoOverlap::Paint(Option_t *option)
144 fVolume1->GetGeoManager()->GetGeomPainter()->PaintOverlap(
this, option);
150 void TGeoOverlap::Print(Option_t *)
const
153 printf(
" - first volume: %s at position:\n", fVolume1->GetName());
155 fVolume1->InspectShape();
156 printf(
" - second volume: %s at position:\n", fVolume2->GetName());
158 fVolume2->InspectShape();
164 void TGeoOverlap::PrintInfo()
const
166 printf(
" = Overlap %s: %s ovlp=%g\n", GetName(), GetTitle(),fOverlap);
172 void TGeoOverlap::SetNextPoint(Double_t x, Double_t y, Double_t z)
174 fMarker->SetNextPoint(x,y,z);
180 void TGeoOverlap::SampleOverlap(Int_t npoints)
184 TPolyMarker3D *marker = 0;
185 TGeoBBox *box = (TGeoBBox*)fVolume2->GetShape();
186 Double_t dx = box->GetDX();
187 Double_t dy = box->GetDY();
188 Double_t dz = box->GetDZ();
191 const Double_t *orig = box->GetOrigin();
195 while (ipoint < npoints) {
197 pt[0] = orig[0] - dx + 2.*dx*gRandom->Rndm();
198 pt[1] = orig[1] - dy + 2.*dy*gRandom->Rndm();
199 pt[2] = orig[2] - dz + 2.*dz*gRandom->Rndm();
200 if (!fVolume2->Contains(pt)) {
202 if (itry>10000 && !ipoint) {
203 Error(
"SampleOverlap",
"No point inside volume!!! - aborting");
210 fMatrix2->LocalToMaster(pt, master);
211 fMatrix1->MasterToLocal(master, pt);
212 Bool_t in = fVolume1->Contains(pt);
213 if (IsOverlap() && !in)
continue;
214 if (!IsOverlap() && in)
continue;
218 marker =
new TPolyMarker3D();
219 marker->SetMarkerColor(kRed);
221 marker->SetNextPoint(master[0], master[1], master[2]);
224 marker->Draw(
"SAME");
227 Double_t capacity = fVolume1->GetShape()->Capacity();
228 capacity *= Double_t(iovlp)/Double_t(npoints);
229 Double_t err = 1./TMath::Sqrt(Double_t(iovlp));
230 Info(
"SampleOverlap",
"#Overlap %s has %g +/- %g [cm3]",
231 GetName(), capacity, err*capacity);
237 void TGeoOverlap::Sizeof3D()
const
239 fVolume1->GetShape()->Sizeof3D();
240 fVolume2->GetShape()->Sizeof3D();
246 void TGeoOverlap::Validate()
const
250 Double_t safe1,safe2;
251 Int_t npoints = fMarker->GetN();
252 for (Int_t i=0; i<npoints; i++) {
253 fMarker->GetPoint(i, point[0], point[1], point[2]);
255 fMatrix1->MasterToLocal(point,local);
256 safe1 = fVolume1->GetShape()->Safety(local, kFALSE);
257 printf(
"point %d: safe1=%f\n", i, safe1);
259 fMatrix1->MasterToLocal(point,local);
260 safe1 = fVolume1->GetShape()->Safety(local, kTRUE);
261 fMatrix2->MasterToLocal(point,local);
262 safe2 = fVolume2->GetShape()->Safety(local, kTRUE);
263 printf(
"point %d: safe1=%f safe2=%f\n", i, safe1,safe2);