291 TGeoManager *gGeoManager = 0;
293 ClassImp(TGeoManager);
295 std::mutex TGeoManager::fgMutex;
296 Bool_t TGeoManager::fgLock = kFALSE;
297 Bool_t TGeoManager::fgLockNavigators = kFALSE;
298 Int_t TGeoManager::fgVerboseLevel = 1;
299 Int_t TGeoManager::fgMaxLevel = 1;
300 Int_t TGeoManager::fgMaxDaughters = 1;
301 Int_t TGeoManager::fgMaxXtruVert = 1;
302 Int_t TGeoManager::fgNumThreads = 0;
303 UInt_t TGeoManager::fgExportPrecision = 17;
304 TGeoManager::EDefaultUnits TGeoManager::fgDefaultUnits = TGeoManager::kG4Units;
305 TGeoManager::ThreadsMap_t *TGeoManager::fgThreadId = 0;
310 TGeoManager::TGeoManager()
312 if (!fgThreadId) fgThreadId =
new TGeoManager::ThreadsMap_t;
313 if (TClass::IsCallingNew() == TClass::kDummyNew) {
321 fStreamVoxels = kFALSE;
322 fIsGeomReading = kFALSE;
323 fIsGeomCleaning = kFALSE;
325 fLoopVolumes = kFALSE;
327 fCurrentNavigator = 0;
336 fMaxVisNodes = 10000;
348 fOpticalSurfaces = 0;
351 memset(fPdgId, 0, 1024*
sizeof(Int_t));
360 fIsNodeSelectable = kFALSE;
370 fMatrixTransform = kFALSE;
371 fMatrixReflection = kFALSE;
374 fUserPaintVolume = 0;
382 fMultiThread = kFALSE;
390 if (!gGeoIdentity && TClass::IsCallingNew() == TClass::kRealNew) gGeoIdentity =
new TGeoIdentity(
"Identity");
391 BuildDefaultMaterials();
398 TGeoManager::TGeoManager(
const char *name,
const char *title)
401 if (!gROOT->GetListOfGeometries()->FindObject(
this)) gROOT->GetListOfGeometries()->Add(
this);
402 if (!gROOT->GetListOfBrowsables()->FindObject(
this)) gROOT->GetListOfBrowsables()->Add(
this);
404 gGeoIdentity =
new TGeoIdentity(
"Identity");
405 BuildDefaultMaterials();
406 if (fgVerboseLevel>0) Info(
"TGeoManager",
"Geometry %s, %s created", GetName(), GetTitle());
412 void TGeoManager::Init()
415 Warning(
"Init",
"Deleting previous geometry: %s/%s",gGeoManager->GetName(),gGeoManager->GetTitle());
417 if (fgLock) Fatal(
"Init",
"New geometry created while the old one locked !!!");
421 if (!fgThreadId) fgThreadId =
new TGeoManager::ThreadsMap_t;
429 fStreamVoxels = kFALSE;
430 fIsGeomReading = kFALSE;
431 fIsGeomCleaning = kFALSE;
433 fLoopVolumes = kFALSE;
434 fBits =
new UChar_t[50000];
435 fCurrentNavigator = 0;
436 fHashPNE =
new THashList(256,3);
438 fMaterials =
new THashList(200,3);
439 fMatrices =
new TObjArray(256);
440 fNodes =
new TObjArray(30);
441 fOverlaps =
new TObjArray(256);
442 fRegions =
new TObjArray(256);
444 fMaxVisNodes = 10000;
445 fVolumes =
new TObjArray(256);
446 fPhysicalNodes =
new TObjArray(256);
447 fShapes =
new TObjArray(256);
448 fGVolumes =
new TObjArray(256);
449 fGShapes =
new TObjArray(256);
450 fTracks =
new TObjArray(256);
451 fMedia =
new THashList(200,3);
455 fGDMLMatrices =
new TObjArray();
456 fOpticalSurfaces =
new TObjArray();
457 fSkinSurfaces =
new TObjArray();
458 fBorderSurfaces =
new TObjArray();
459 memset(fPdgId, 0, 1024*
sizeof(Int_t));
467 fIsNodeSelectable = kFALSE;
474 fUniqueVolumes =
new TObjArray(256);
477 fMatrixTransform = kFALSE;
478 fMatrixReflection = kFALSE;
479 fGLMatrix =
new TGeoHMatrix();
481 fUserPaintVolume = 0;
489 fMultiThread = kFALSE;
500 TGeoManager::TGeoManager(
const TGeoManager& gm) :
507 fParticleName(gm.fParticleName),
508 fVisDensity(gm.fVisDensity),
509 fExplodedView(gm.fExplodedView),
510 fVisOption(gm.fVisOption),
511 fVisLevel(gm.fVisLevel),
512 fNsegments(gm.fNsegments),
513 fNtracks(gm.fNtracks),
514 fMaxVisNodes(gm.fMaxVisNodes),
515 fCurrentTrack(gm.fCurrentTrack),
518 fLoopVolumes(gm.fLoopVolumes),
519 fStreamVoxels(gm.fStreamVoxels),
520 fIsGeomReading(gm.fIsGeomReading),
521 fIsGeomCleaning(kFALSE),
523 fTimeCut(gm.fTimeCut),
524 fDrawExtra(gm.fDrawExtra),
525 fMatrixTransform(gm.fMatrixTransform),
526 fMatrixReflection(gm.fMatrixReflection),
527 fActivity(gm.fActivity),
528 fIsNodeSelectable(gm.fIsNodeSelectable),
529 fPainter(gm.fPainter),
530 fMatrices(gm.fMatrices),
532 fVolumes(gm.fVolumes),
533 fPhysicalNodes(gm.fPhysicalNodes),
534 fGShapes(gm.fGShapes),
535 fGVolumes(gm.fGVolumes),
537 fPdgNames(gm.fPdgNames),
538 fGDMLMatrices(gm.fGDMLMatrices),
539 fOpticalSurfaces(gm.fOpticalSurfaces),
540 fSkinSurfaces(gm.fSkinSurfaces),
541 fBorderSurfaces(gm.fBorderSurfaces),
542 fMaterials(gm.fMaterials),
545 fOverlaps(gm.fOverlaps),
546 fRegions(gm.fRegions),
548 fCurrentNavigator(gm.fCurrentNavigator),
549 fCurrentVolume(gm.fCurrentVolume),
550 fTopVolume(gm.fTopVolume),
551 fTopNode(gm.fTopNode),
552 fMasterVolume(gm.fMasterVolume),
553 fGLMatrix(gm.fGLMatrix),
554 fUniqueVolumes(gm.fUniqueVolumes),
555 fClippingShape(gm.fClippingShape),
556 fElementTable(gm.fElementTable),
557 fNodeIdArray(gm.fNodeIdArray),
559 fPaintVolume(gm.fPaintVolume),
560 fUserPaintVolume(gm.fUserPaintVolume),
561 fHashVolumes(gm.fHashVolumes),
562 fHashGVolumes(gm.fHashGVolumes),
563 fHashPNE(gm.fHashPNE),
564 fArrayPNE(gm.fArrayPNE),
570 fMultiThread(kFALSE),
575 for(Int_t i=0; i<1024; i++)
576 fPdgId[i]=gm.fPdgId[i];
577 if (!fgThreadId) fgThreadId =
new TGeoManager::ThreadsMap_t;
584 TGeoManager& TGeoManager::operator=(
const TGeoManager& gm)
586 if (!fgThreadId) fgThreadId =
new TGeoManager::ThreadsMap_t;
588 TNamed::operator=(gm);
594 fParticleName=gm.fParticleName;
595 fVisDensity=gm.fVisDensity;
596 fExplodedView=gm.fExplodedView;
597 fVisOption=gm.fVisOption;
598 fVisLevel=gm.fVisLevel;
599 fNsegments=gm.fNsegments;
600 fNtracks=gm.fNtracks;
601 fMaxVisNodes=gm.fMaxVisNodes;
602 fCurrentTrack=gm.fCurrentTrack;
604 for(Int_t i=0; i<1024; i++)
605 fPdgId[i]=gm.fPdgId[i];
607 fLoopVolumes=gm.fLoopVolumes;
608 fStreamVoxels=gm.fStreamVoxels;
609 fIsGeomReading=gm.fIsGeomReading;
610 fIsGeomCleaning = kFALSE;
612 fTimeCut=gm.fTimeCut;
613 fDrawExtra=gm.fDrawExtra;
614 fMatrixTransform=gm.fMatrixTransform;
615 fMatrixReflection=gm.fMatrixReflection;
616 fActivity=gm.fActivity;
617 fIsNodeSelectable=gm.fIsNodeSelectable;
618 fPainter=gm.fPainter;
619 fMatrices=gm.fMatrices;
621 fVolumes=gm.fVolumes;
622 fPhysicalNodes=gm.fPhysicalNodes;
623 fGShapes=gm.fGShapes;
624 fGVolumes=gm.fGVolumes;
626 fPdgNames=gm.fPdgNames;
627 fGDMLMatrices=gm.fGDMLMatrices;
628 fOpticalSurfaces = gm.fOpticalSurfaces;
629 fSkinSurfaces = gm.fSkinSurfaces;
630 fBorderSurfaces = gm.fBorderSurfaces;
631 fMaterials=gm.fMaterials;
634 fOverlaps=gm.fOverlaps;
635 fRegions=gm.fRegions;
637 fCurrentNavigator=gm.fCurrentNavigator;
638 fCurrentVolume = gm.fCurrentVolume;
639 fTopVolume=gm.fTopVolume;
640 fTopNode=gm.fTopNode;
641 fMasterVolume=gm.fMasterVolume;
642 fGLMatrix=gm.fGLMatrix;
643 fUniqueVolumes=gm.fUniqueVolumes;
644 fClippingShape=gm.fClippingShape;
645 fElementTable=gm.fElementTable;
646 fNodeIdArray=gm.fNodeIdArray;
648 fPaintVolume=gm.fPaintVolume;
649 fUserPaintVolume=gm.fUserPaintVolume;
650 fHashVolumes=gm.fHashVolumes;
651 fHashGVolumes=gm.fHashGVolumes;
652 fHashPNE=gm.fHashPNE;
653 fArrayPNE=gm.fArrayPNE;
658 fMultiThread = kFALSE;
672 TGeoManager::~TGeoManager()
674 if (gGeoManager !=
this) gGeoManager =
this;
675 fIsGeomCleaning = kTRUE;
677 if (gROOT->GetListOfFiles()) {
678 gROOT->GetListOfGeometries()->Remove(
this);
679 gROOT->GetListOfBrowsables()->Remove(
this);
687 delete TGeoBuilder::Instance(
this);
688 if (fBits)
delete [] fBits;
690 SafeDelete(fTopNode);
691 if (fOverlaps) {fOverlaps->Delete(); SafeDelete(fOverlaps);}
692 if (fRegions) {fRegions->Delete(); SafeDelete(fRegions);}
693 if (fMaterials) {fMaterials->Delete(); SafeDelete(fMaterials);}
694 SafeDelete(fElementTable);
695 if (fMedia) {fMedia->Delete(); SafeDelete(fMedia);}
696 if (fHashVolumes) fHashVolumes->Clear(
"nodelete"); SafeDelete(fHashVolumes);
697 if (fHashGVolumes) fHashGVolumes->Clear(
"nodelete"); SafeDelete(fHashGVolumes);
698 if (fHashPNE) {fHashPNE->Delete(); SafeDelete(fHashPNE);}
699 if (fArrayPNE) {
delete fArrayPNE;}
700 if (fVolumes) {fVolumes->Delete(); SafeDelete(fVolumes);}
701 if (fShapes) {fShapes->Delete(); SafeDelete( fShapes );}
702 if (fPhysicalNodes) {fPhysicalNodes->Delete(); SafeDelete( fPhysicalNodes );}
703 if (fMatrices) {fMatrices->Delete(); SafeDelete( fMatrices );}
704 if (fTracks) {fTracks->Delete(); SafeDelete( fTracks );}
705 SafeDelete( fUniqueVolumes );
706 if (fPdgNames) {fPdgNames->Delete(); SafeDelete( fPdgNames );}
707 if (fGDMLMatrices) {fGDMLMatrices->Delete(); SafeDelete( fGDMLMatrices );}
708 if (fOpticalSurfaces) {fOpticalSurfaces->Delete(); SafeDelete( fOpticalSurfaces );}
709 if (fSkinSurfaces) {fSkinSurfaces->Delete(); SafeDelete( fSkinSurfaces );}
710 if (fBorderSurfaces) {fBorderSurfaces->Delete(); SafeDelete( fBorderSurfaces );}
713 SafeDelete( fPainter );
714 SafeDelete( fGLMatrix );
717 delete [] fValuePNEId;
719 delete fParallelWorld;
720 fIsGeomCleaning = kFALSE;
728 Int_t TGeoManager::AddMaterial(
const TGeoMaterial *material)
730 return TGeoBuilder::Instance(
this)->AddMaterial((TGeoMaterial*)material);
736 Int_t TGeoManager::AddOverlap(
const TNamed *ovlp)
738 Int_t size = fOverlaps->GetEntriesFast();
739 fOverlaps->Add((TObject*)ovlp);
745 Int_t TGeoManager::AddRegion(TGeoRegion *region)
747 Int_t size = fRegions->GetEntriesFast();
748 fRegions->Add(region);
755 Bool_t TGeoManager::AddProperty(
const char* property, Double_t value)
757 auto pos = fProperties.insert(ConstPropMap_t::value_type(property, value));
759 Warning(
"AddProperty",
"Property \"%s\" already exists with value %g", property, (pos.first)->second);
768 Double_t TGeoManager::GetProperty(
const char *property, Bool_t *error)
const
770 auto pos = fProperties.find(property);
771 if (pos == fProperties.end()) {
772 if (error) *error = kTRUE;
775 if (error) *error = kFALSE;
782 Double_t TGeoManager::GetProperty(
size_t i, TString &name, Bool_t *error)
const
785 if (i >= fProperties.size()) {
786 if (error) *error = kTRUE;
790 auto it = fProperties.begin();
791 while (pos < i) { ++it; ++pos; }
792 if (error) *error = kFALSE;
800 Int_t TGeoManager::AddTransformation(
const TGeoMatrix *matrix)
802 return TGeoBuilder::Instance(
this)->AddTransformation((TGeoMatrix*)matrix);
808 Int_t TGeoManager::AddShape(
const TGeoShape *shape)
810 return TGeoBuilder::Instance(
this)->AddShape((TGeoShape*)shape);
818 Int_t TGeoManager::AddTrack(Int_t
id, Int_t pdgcode, TObject *particle)
820 Int_t index = fNtracks;
821 fTracks->AddAtAndExpand(GetGeomPainter()->AddTrack(
id,pdgcode,particle),fNtracks++);
828 Int_t TGeoManager::AddTrack(TVirtualGeoTrack *track)
830 Int_t index = fNtracks;
831 fTracks->AddAtAndExpand(track,fNtracks++);
839 TVirtualGeoTrack *TGeoManager::MakeTrack(Int_t
id, Int_t pdgcode, TObject *particle)
841 TVirtualGeoTrack *track = GetGeomPainter()->AddTrack(
id,pdgcode,particle);
848 Int_t TGeoManager::AddVolume(TGeoVolume *volume)
851 Error(
"AddVolume",
"invalid volume");
854 Int_t uid = fUniqueVolumes->GetEntriesFast();
856 if (!fCurrentVolume) {
857 fCurrentVolume = volume;
858 fUniqueVolumes->AddAtAndExpand(volume,uid);
860 if (!strcmp(volume->GetName(), fCurrentVolume->GetName())) {
861 uid = fCurrentVolume->GetNumber();
863 fCurrentVolume = volume;
864 Int_t olduid = GetUID(volume->GetName());
866 fUniqueVolumes->AddAtAndExpand(volume,uid);
872 volume->SetNumber(uid);
874 fHashVolumes =
new THashList(256);
875 fHashGVolumes =
new THashList(256);
877 TObjArray *list = fVolumes;
878 if (!volume->GetShape() || volume->IsRunTime() || volume->IsVolumeMulti()) {
880 fHashGVolumes->Add(volume);
882 fHashVolumes->Add(volume);
884 Int_t index = list->GetEntriesFast();
885 list->AddAtAndExpand(volume,index);
893 TGeoNavigator *TGeoManager::AddNavigator()
895 if (fMultiThread) { TGeoManager::ThreadId(); fgMutex.lock(); }
896 std::thread::id threadId = std::this_thread::get_id();
897 NavigatorsMap_t::const_iterator it = fNavigators.find(threadId);
898 TGeoNavigatorArray *array = 0;
899 if (it != fNavigators.end()) array = it->second;
901 array =
new TGeoNavigatorArray(
this);
902 fNavigators.insert(NavigatorsMap_t::value_type(threadId, array));
904 TGeoNavigator *nav = array->AddNavigator();
905 if (fClosed) nav->GetCache()->BuildInfoBranch();
906 if (fMultiThread) fgMutex.unlock();
913 TGeoNavigator *TGeoManager::GetCurrentNavigator()
const
915 TTHREAD_TLS(TGeoNavigator*) tnav = 0;
916 if (!fMultiThread) return fCurrentNavigator;
917 TGeoNavigator *nav = tnav;
919 std::thread::
id threadId = std::this_thread::get_id();
920 NavigatorsMap_t::const_iterator it = fNavigators.find(threadId);
921 if (it == fNavigators.end()) return 0;
922 TGeoNavigatorArray *array = it->second;
923 nav = array->GetCurrentNavigator();
931 TGeoNavigatorArray *TGeoManager::GetListOfNavigators()
const
933 std::thread::id threadId = std::this_thread::get_id();
934 NavigatorsMap_t::const_iterator it = fNavigators.find(threadId);
935 if (it == fNavigators.end())
return 0;
936 TGeoNavigatorArray *array = it->second;
943 Bool_t TGeoManager::SetCurrentNavigator(Int_t index)
945 std::thread::id threadId = std::this_thread::get_id();
946 NavigatorsMap_t::const_iterator it = fNavigators.find(threadId);
947 if (it == fNavigators.end()) {
948 Error(
"SetCurrentNavigator",
"No navigator defined for this thread\n");
949 std::cout <<
" thread id: " << threadId << std::endl;
952 TGeoNavigatorArray *array = it->second;
953 TGeoNavigator *nav = array->SetCurrentNavigator(index);
955 Error(
"SetCurrentNavigator",
"Navigator %d not existing for this thread\n", index);
956 std::cout <<
" thread id: " << threadId << std::endl;
959 if (!fMultiThread) fCurrentNavigator = nav;
966 void TGeoManager::SetNavigatorsLock(Bool_t flag)
968 fgLockNavigators = flag;
974 void TGeoManager::ClearNavigators()
976 if (fMultiThread) fgMutex.lock();
977 TGeoNavigatorArray *arr = 0;
978 for (NavigatorsMap_t::iterator it = fNavigators.begin();
979 it != fNavigators.end(); ++it) {
984 if (fMultiThread) fgMutex.unlock();
990 void TGeoManager::RemoveNavigator(
const TGeoNavigator *nav)
992 if (fMultiThread) fgMutex.lock();
993 for (NavigatorsMap_t::iterator it = fNavigators.begin(); it != fNavigators.end(); ++it) {
994 TGeoNavigatorArray *arr = (*it).second;
996 if ((TGeoNavigator*)arr->Remove((TObject*)nav)) {
998 if (!arr->GetEntries()) fNavigators.erase(it);
999 if (fMultiThread) fgMutex.unlock();
1004 Error(
"Remove navigator",
"Navigator %p not found", nav);
1005 if (fMultiThread) fgMutex.unlock();
1011 void TGeoManager::SetMaxThreads(Int_t nthreads)
1014 Error(
"SetMaxThreads",
"Cannot set maximum number of threads before closing the geometry");
1017 if (!fMultiThread) {
1018 ROOT::EnableThreadSafety();
1019 std::thread::id threadId = std::this_thread::get_id();
1020 NavigatorsMap_t::const_iterator it = fNavigators.find(threadId);
1021 if (it != fNavigators.end()) {
1022 TGeoNavigatorArray *array = it->second;
1023 fNavigators.erase(it);
1024 fNavigators.insert(NavigatorsMap_t::value_type(threadId, array));
1031 fMaxThreads = nthreads+1;
1032 if (fMaxThreads>0) {
1033 fMultiThread = kTRUE;
1040 void TGeoManager::ClearThreadData()
const
1042 if (!fMaxThreads)
return;
1044 TIter next(fVolumes);
1046 while ((vol=(TGeoVolume*)next())) vol->ClearThreadData();
1053 void TGeoManager::CreateThreadData()
const
1055 if (!fMaxThreads)
return;
1057 TIter next(fVolumes);
1059 while ((vol=(TGeoVolume*)next())) vol->CreateThreadData(fMaxThreads);
1067 void TGeoManager::ClearThreadsMap()
1069 if (gGeoManager && !gGeoManager->IsMultiThread())
return;
1071 if (!fgThreadId->empty()) fgThreadId->clear();
1080 Int_t TGeoManager::ThreadId()
1082 TTHREAD_TLS(Int_t) tid = -1;
1084 if (ttid > -1) return ttid;
1085 if (gGeoManager && !gGeoManager->IsMultiThread()) return 0;
1086 std::thread::
id threadId = std::this_thread::get_id();
1087 TGeoManager::ThreadsMapIt_t it = fgThreadId->find(threadId);
1088 if (it != fgThreadId->end()) return it->second;
1091 (*fgThreadId)[threadId] = fgNumThreads;
1093 ttid = fgNumThreads++;
1101 void TGeoManager::Browse(TBrowser *b)
1104 if (fMaterials) b->Add(fMaterials,
"Materials");
1105 if (fMedia) b->Add(fMedia,
"Media");
1106 if (fMatrices) b->Add(fMatrices,
"Local transformations");
1107 if (fOverlaps) b->Add(fOverlaps,
"Illegal overlaps");
1108 if (fTracks) b->Add(fTracks,
"Tracks");
1109 if (fMasterVolume) b->Add(fMasterVolume,
"Master Volume", fMasterVolume->IsVisible());
1110 if (fTopVolume) b->Add(fTopVolume,
"Top Volume", fTopVolume->IsVisible());
1111 if (fTopNode) b->Add(fTopNode);
1112 TString browserImp(gEnv->GetValue(
"Browser.Name",
"TRootBrowserLite"));
1113 TQObject::Connect(browserImp.Data(),
"Checked(TObject*,Bool_t)",
1114 "TGeoManager",
this,
"SetVisibility(TObject*,Bool_t)");
1120 void TGeoManager::Edit(Option_t *option) {
1122 GetGeomPainter()->EditGeometry(option);
1128 void TGeoManager::SetVisibility(TObject *obj, Bool_t vis)
1130 if(obj->IsA() == TGeoVolume::Class()) {
1131 TGeoVolume *vol = (TGeoVolume *) obj;
1132 vol->SetVisibility(vis);
1134 if (obj->InheritsFrom(TGeoNode::Class())) {
1135 TGeoNode *node = (TGeoNode *) obj;
1136 node->SetVisibility(vis);
1139 GetGeomPainter()->ModifiedPad(kTRUE);
1145 void TGeoManager::BombTranslation(
const Double_t *tr, Double_t *bombtr)
1147 if (fPainter) fPainter->BombTranslation(tr, bombtr);
1154 void TGeoManager::UnbombTranslation(
const Double_t *tr, Double_t *bombtr)
1156 if (fPainter) fPainter->UnbombTranslation(tr, bombtr);
1163 void TGeoManager::DoBackupState()
1165 GetCurrentNavigator()->DoBackupState();
1171 void TGeoManager::DoRestoreState()
1173 GetCurrentNavigator()->DoRestoreState();
1180 void TGeoManager::RegisterMatrix(
const TGeoMatrix *matrix)
1182 return TGeoBuilder::Instance(
this)->RegisterMatrix((TGeoMatrix*)matrix);
1190 Int_t TGeoManager::ReplaceVolume(TGeoVolume *vorig, TGeoVolume *vnew)
1193 if (!vorig || !vnew)
return nref;
1194 TGeoMedium *morig = vorig->GetMedium();
1195 Bool_t checkmed = kFALSE;
1196 if (morig) checkmed = kTRUE;
1197 TGeoMedium *mnew = vnew->GetMedium();
1199 if (!mnew && !vnew->IsAssembly()) {
1200 Error(
"ReplaceVolume",
"Replacement volume %s has no medium and it is not an assembly",
1204 if (mnew && checkmed) {
1205 if (mnew->GetId() != morig->GetId())
1206 Warning(
"ReplaceVolume",
"Replacement volume %s has different medium than original volume %s",
1207 vnew->GetName(), vorig->GetName());
1213 Int_t nvol = fVolumes->GetEntriesFast();
1218 TGeoVoxelFinder *voxels;
1219 for (i=0; i<nvol; i++) {
1220 vol = (TGeoVolume*)fVolumes->At(i);
1222 if (vol==vorig || vol==vnew)
continue;
1223 nd = vol->GetNdaughters();
1224 for (j=0; j<nd; j++) {
1225 node = vol->GetNode(j);
1226 if (node->GetVolume() == vorig) {
1228 mnew = node->GetMotherVolume()->GetMedium();
1229 if (mnew && mnew->GetId()!=morig->GetId()) ierr++;
1232 if (node->IsOverlapping()) {
1233 node->SetOverlapping(kFALSE);
1234 Info(
"ReplaceVolume",
"%s replaced with assembly and declared NON-OVERLAPPING!",node->GetName());
1236 node->SetVolume(vnew);
1237 voxels = node->GetMotherVolume()->GetVoxels();
1238 if (voxels) voxels->SetNeedRebuild();
1240 if (node->GetMotherVolume() == vorig) {
1242 node->SetMotherVolume(vnew);
1243 if (node->IsOverlapping()) {
1244 node->SetOverlapping(kFALSE);
1245 Info(
"ReplaceVolume",
"%s inside substitute assembly %s declared NON-OVERLAPPING!",node->GetName(),vnew->GetName());
1251 if (ierr) Warning(
"ReplaceVolume",
"Volumes should not be replaced with assemblies if they are positioned in containers having a different medium ID.\n %i occurrences for assembly replacing volume %s",
1252 ierr, vorig->GetName());
1259 Int_t TGeoManager::TransformVolumeToAssembly(
const char *vname)
1261 TGeoVolume *toTransform = FindVolumeFast(vname);
1263 Warning(
"TransformVolumeToAssembly",
"Volume %s not found", vname);
1266 Int_t index = fVolumes->IndexOf(toTransform);
1268 Int_t indmax = fVolumes->GetEntries();
1269 Bool_t replace = kTRUE;
1270 TGeoVolume *transformed;
1271 while (index<indmax) {
1274 transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform);
1276 ReplaceVolume(toTransform, transformed);
1279 if (toTransform->IsAssembly())
1280 Warning(
"TransformVolumeToAssembly",
"Volume %s already assembly", toTransform->GetName());
1281 if (!toTransform->GetNdaughters())
1282 Warning(
"TransformVolumeToAssembly",
"Volume %s has no daughters, cannot transform", toTransform->GetName());
1283 if (toTransform->IsVolumeMulti())
1284 Warning(
"TransformVolumeToAssembly",
"Volume %s divided, cannot transform", toTransform->GetName());
1288 if (index >= indmax)
return count;
1289 toTransform = (TGeoVolume*)fVolumes->At(index);
1290 if (!strcmp(toTransform->GetName(),vname)) replace = kTRUE;
1311 TGeoVolume *TGeoManager::Division(
const char *name,
const char *mother, Int_t iaxis,
1312 Int_t ndiv, Double_t start, Double_t step, Int_t numed, Option_t *option)
1314 return TGeoBuilder::Instance(
this)->Division(name, mother, iaxis, ndiv, start, step, numed, option);
1329 void TGeoManager::Matrix(Int_t index, Double_t theta1, Double_t phi1,
1330 Double_t theta2, Double_t phi2,
1331 Double_t theta3, Double_t phi3)
1333 TGeoBuilder::Instance(
this)->Matrix(index, theta1, phi1, theta2, phi2, theta3, phi3);
1339 TGeoMaterial *TGeoManager::Material(
const char *name, Double_t a, Double_t z, Double_t dens, Int_t uid,Double_t radlen, Double_t intlen)
1341 return TGeoBuilder::Instance(
this)->Material(name, a, z, dens, uid, radlen, intlen);
1349 TGeoMaterial *TGeoManager::Mixture(
const char *name, Float_t *a, Float_t *z, Double_t dens,
1350 Int_t nelem, Float_t *wmat, Int_t uid)
1352 return TGeoBuilder::Instance(
this)->Mixture(name, a, z, dens, nelem, wmat, uid);
1359 TGeoMaterial *TGeoManager::Mixture(
const char *name, Double_t *a, Double_t *z, Double_t dens,
1360 Int_t nelem, Double_t *wmat, Int_t uid)
1362 return TGeoBuilder::Instance(
this)->Mixture(name, a, z, dens, nelem, wmat, uid);
1385 TGeoMedium *TGeoManager::Medium(
const char *name, Int_t numed, Int_t nmat, Int_t isvol,
1386 Int_t ifield, Double_t fieldm, Double_t tmaxfd,
1387 Double_t stemax, Double_t deemax, Double_t epsil,
1390 return TGeoBuilder::Instance(
this)->Medium(name, numed, nmat, isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
1408 void TGeoManager::Node(
const char *name, Int_t nr,
const char *mother,
1409 Double_t x, Double_t y, Double_t z, Int_t irot,
1410 Bool_t isOnly, Float_t *upar, Int_t npar)
1412 TGeoBuilder::Instance(
this)->Node(name, nr, mother, x, y, z, irot, isOnly, upar, npar);
1430 void TGeoManager::Node(
const char *name, Int_t nr,
const char *mother,
1431 Double_t x, Double_t y, Double_t z, Int_t irot,
1432 Bool_t isOnly, Double_t *upar, Int_t npar)
1434 TGeoBuilder::Instance(
this)->Node(name, nr, mother, x, y, z, irot, isOnly, upar, npar);
1446 TGeoVolume *TGeoManager::Volume(
const char *name,
const char *shape, Int_t nmed,
1447 Float_t *upar, Int_t npar)
1449 return TGeoBuilder::Instance(
this)->Volume(name, shape, nmed, upar, npar);
1460 TGeoVolume *TGeoManager::Volume(
const char *name,
const char *shape, Int_t nmed,
1461 Double_t *upar, Int_t npar)
1463 return TGeoBuilder::Instance(
this)->Volume(name, shape, nmed, upar, npar);
1469 void TGeoManager::SetAllIndex()
1472 TIter next(fMaterials);
1473 TGeoMaterial *mater;
1474 while ((mater=(TGeoMaterial*)next())) {
1475 mater->SetUniqueID(index++);
1476 mater->ResetBit(TGeoMaterial::kMatSavePrimitive);
1479 TIter next1(fMedia);
1481 while ((med=(TGeoMedium*)next1())) {
1482 med->SetUniqueID(index++);
1483 med->ResetBit(TGeoMedium::kMedSavePrimitive);
1486 TIter next2(fShapes);
1488 while ((shape=(TGeoShape*)next2())) {
1489 shape->SetUniqueID(index++);
1490 if (shape->IsComposite()) ((TGeoCompositeShape*)shape)->GetBoolNode()->RegisterMatrices();
1493 TIter next3(fMatrices);
1495 while ((matrix=(TGeoMatrix*)next3())) {
1496 matrix->RegisterYourself();
1498 TIter next4(fMatrices);
1500 while ((matrix=(TGeoMatrix*)next4())) {
1501 matrix->SetUniqueID(index++);
1502 matrix->ResetBit(TGeoMatrix::kGeoSavePrimitive);
1504 TIter next5(fVolumes);
1506 while ((vol=(TGeoVolume*)next5())) vol->UnmarkSaved();
1513 void TGeoManager::ClearAttributes()
1515 if (gPad)
delete gPad;
1521 if (!gStyle)
return;
1522 TIter next(fVolumes);
1523 TGeoVolume *vol = 0;
1524 while ((vol=(TGeoVolume*)next())) {
1525 if (!vol->IsVisTouched())
continue;
1526 vol->SetVisTouched(kFALSE);
1535 void TGeoManager::CloseGeometry(Option_t *option)
1538 Warning(
"CloseGeometry",
"geometry already closed");
1541 if (!fMasterVolume) {
1542 Error(
"CloseGeometry",
"you MUST call SetTopVolume() first !");
1545 if (!gROOT->GetListOfGeometries()->FindObject(
this)) gROOT->GetListOfGeometries()->Add(
this);
1546 if (!gROOT->GetListOfBrowsables()->FindObject(
this)) gROOT->GetListOfBrowsables()->Add(
this);
1551 TString opt(option);
1554 Bool_t nodeid = opt.Contains(
"i");
1556 TGeoNavigator *nav = 0;
1557 Int_t nnavigators = 0;
1559 if (fIsGeomReading) {
1560 if (fgVerboseLevel>0) Info(
"CloseGeometry",
"Geometry loaded from file...");
1561 gGeoIdentity=(TGeoIdentity *)fMatrices->At(0);
1562 if (!fElementTable) fElementTable =
new TGeoElementTable(200);
1564 if (!fMasterVolume) {
1565 Error(
"CloseGeometry",
"Master volume not streamed");
1568 SetTopVolume(fMasterVolume);
1569 if (fStreamVoxels && fgVerboseLevel>0) Info(
"CloseGeometry",
"Voxelization retrieved from file");
1572 if (!GetCurrentNavigator()) fCurrentNavigator = AddNavigator();
1573 nnavigators = GetListOfNavigators()->GetEntriesFast();
1576 for (Int_t i=0; i<nnavigators; i++) {
1577 nav = (TGeoNavigator*)GetListOfNavigators()->At(i);
1578 nav->GetCache()->BuildInfoBranch();
1579 if (nodeid) nav->GetCache()->BuildIdArray();
1581 if (!fHashVolumes) {
1582 Int_t nvol = fVolumes->GetEntriesFast();
1583 Int_t ngvol = fGVolumes->GetEntriesFast();
1584 fHashVolumes =
new THashList(nvol+1);
1585 fHashGVolumes =
new THashList(ngvol+1);
1587 for (i=0; i<ngvol; i++) fHashGVolumes->AddLast(fGVolumes->At(i));
1588 for (i=0; i<nvol; i++) fHashVolumes->AddLast(fVolumes->At(i));
1591 if (fParallelWorld) {
1592 if (fgVerboseLevel>0) Info(
"CloseGeometry",
"Recreating parallel world %s ...",fParallelWorld->GetName());
1593 fParallelWorld->CloseGeometry();
1596 if (fgVerboseLevel>0) Info(
"CloseGeometry",
"%i nodes/ %i volume UID's in %s", fNNodes, fUniqueVolumes->GetEntriesFast()-1, GetTitle());
1597 if (fgVerboseLevel>0) Info(
"CloseGeometry",
"----------------modeler ready----------------");
1602 if (!GetCurrentNavigator()) fCurrentNavigator = AddNavigator();
1603 nnavigators = GetListOfNavigators()->GetEntriesFast();
1604 SelectTrackingMedia();
1606 if (fgVerboseLevel>0) Info(
"CloseGeometry",
"Counting nodes...");
1607 fNNodes = CountNodes();
1608 fNLevel = fMasterVolume->CountNodes(1,3)+1;
1609 if (fNLevel<30) fNLevel = 100;
1613 if (fgVerboseLevel>0) Info(
"CloseGeometry",
"Building cache...");
1615 for (Int_t i=0; i<nnavigators; i++) {
1616 nav = (TGeoNavigator*)GetListOfNavigators()->At(i);
1617 nav->GetCache()->BuildInfoBranch();
1618 if (nodeid) nav->GetCache()->BuildIdArray();
1621 if (fgVerboseLevel>0) {
1622 Info(
"CloseGeometry",
"%i nodes/ %i volume UID's in %s", fNNodes, fUniqueVolumes->GetEntriesFast()-1, GetTitle());
1623 Info(
"CloseGeometry",
"----------------modeler ready----------------");
1630 void TGeoManager::ClearOverlaps()
1633 fOverlaps->Delete();
1636 fOverlaps =
new TObjArray();
1642 void TGeoManager::ClearShape(
const TGeoShape *shape)
1644 if (fShapes->FindObject(shape)) fShapes->Remove((TGeoShape*)shape);
1651 void TGeoManager::CleanGarbage()
1653 if (!fGVolumes && !fGShapes)
return;
1656 nentries = fGVolumes->GetEntries();
1657 TGeoVolume *vol = 0;
1658 for (i=0; i<nentries; i++) {
1659 vol=(TGeoVolume*)fGVolumes->At(i);
1660 if (vol) vol->SetFinder(0);
1662 fGVolumes->Delete();
1677 void TGeoManager::CdNode(Int_t nodeid)
1679 GetCurrentNavigator()->CdNode(nodeid);
1685 Int_t TGeoManager::GetCurrentNodeId()
const
1687 return GetCurrentNavigator()->GetCurrentNodeId();
1694 void TGeoManager::CdTop()
1696 GetCurrentNavigator()->CdTop();
1703 void TGeoManager::CdUp()
1705 GetCurrentNavigator()->CdUp();
1712 void TGeoManager::CdDown(Int_t index)
1714 GetCurrentNavigator()->CdDown(index);
1720 void TGeoManager::CdNext()
1722 GetCurrentNavigator()->CdNext();
1729 Bool_t TGeoManager::cd(
const char *path)
1731 return GetCurrentNavigator()->cd(path);
1737 Bool_t TGeoManager::CheckPath(
const char *path)
const
1739 return GetCurrentNavigator()->CheckPath(path);
1745 void TGeoManager::ConvertReflections()
1747 if (!fTopNode)
return;
1748 if (fgVerboseLevel>0) Info(
"ConvertReflections",
"Converting reflections in: %s - %s ...", GetName(), GetTitle());
1749 TGeoIterator next(fTopVolume);
1751 TGeoNodeMatrix *nodematrix;
1752 TGeoMatrix *matrix, *mclone;
1753 TGeoVolume *reflected;
1754 while ((node=next())) {
1755 matrix = node->GetMatrix();
1756 if (matrix->IsReflection()) {
1759 mclone =
new TGeoCombiTrans(*matrix);
1760 mclone->RegisterYourself();
1762 mclone->ReflectZ(kFALSE, kTRUE);
1763 nodematrix = (TGeoNodeMatrix*)node;
1764 nodematrix->SetMatrix(mclone);
1767 reflected = node->GetVolume()->MakeReflectedVolume();
1768 node->SetVolume(reflected);
1771 if (fgVerboseLevel>0) Info(
"ConvertReflections",
"Done");
1778 void TGeoManager::CountLevels()
1781 Error(
"CountLevels",
"Top node not defined.");
1784 TGeoIterator next(fTopVolume);
1785 Bool_t fixrefs = fIsGeomReading && (fMasterVolume->GetRefCount()==1);
1786 if (fMasterVolume->GetRefCount()>1) fMasterVolume->Release();
1787 if (fgVerboseLevel>1 && fixrefs) Info(
"CountLevels",
"Fixing volume reference counts");
1790 Int_t maxnodes = fTopVolume->GetNdaughters();
1791 Int_t maxvertices = 1;
1792 while ((node=next())) {
1794 node->GetVolume()->Grab();
1795 for (Int_t ibit=10; ibit<14; ibit++) {
1796 node->SetBit(BIT(ibit+4), node->TestBit(BIT(ibit)));
1800 if (node->GetVolume()->GetVoxels()) {
1801 if (node->GetNdaughters()>maxnodes) maxnodes = node->GetNdaughters();
1803 if (next.GetLevel()>maxlevel) maxlevel = next.GetLevel();
1804 if (node->GetVolume()->GetShape()->IsA()==TGeoXtru::Class()) {
1805 TGeoXtru *xtru = (TGeoXtru*)node->GetVolume()->GetShape();
1806 if (xtru->GetNvert()>maxvertices) maxvertices = xtru->GetNvert();
1809 fgMaxLevel = maxlevel;
1810 fgMaxDaughters = maxnodes;
1811 fgMaxXtruVert = maxvertices;
1812 if (fgVerboseLevel>0) Info(
"CountLevels",
"max level = %d, max placements = %d", fgMaxLevel, fgMaxDaughters);
1818 Int_t TGeoManager::CountNodes(
const TGeoVolume *vol, Int_t nlevels, Int_t option)
1824 top = (TGeoVolume*)vol;
1826 Int_t count = top->CountNodes(nlevels, option);
1833 void TGeoManager::DefaultAngles()
1835 if (fPainter) fPainter->DefaultAngles();
1841 void TGeoManager::DrawCurrentPoint(Int_t color)
1843 if (fPainter) fPainter->DrawCurrentPoint(color);
1849 void TGeoManager::AnimateTracks(Double_t tmin, Double_t tmax, Int_t nframes, Option_t *option)
1853 if (tmin<0 || tmin>=tmax || nframes<1)
return;
1854 Double_t *box = fPainter->GetViewBox();
1855 box[0] = box[1] = box[2] = 0;
1856 box[3] = box[4] = box[5] = 100;
1857 Double_t dt = (tmax-tmin)/Double_t(nframes);
1858 Double_t delt = 2E-9;
1861 TString opt(option);
1862 Bool_t save = kFALSE, geomanim=kFALSE;
1864 if (opt.Contains(
"/S")) save = kTRUE;
1866 if (opt.Contains(
"/G")) geomanim = kTRUE;
1868 DrawTracks(opt.Data());
1869 Double_t start[6], end[6];
1870 Double_t dd[6] = {0,0,0,0,0,0};
1871 Double_t dlat=0, dlong=0, dpsi=0;
1873 fPainter->EstimateCameraMove(tmin+5*dt, tmin+15*dt, start, end);
1874 for (i=0; i<3; i++) {
1875 start[i+3] = 20 + 1.3*start[i+3];
1876 end[i+3] = 20 + 0.9*end[i+3];
1878 for (i=0; i<6; i++) {
1879 dd[i] = (end[i]-start[i])/10.;
1881 memcpy(box, start, 6*
sizeof(Double_t));
1882 fPainter->GetViewAngles(dlong,dlat,dpsi);
1883 dlong = (-206-dlong)/Double_t(nframes);
1884 dlat = (126-dlat)/Double_t(nframes);
1885 dpsi = (75-dpsi)/Double_t(nframes);
1886 fPainter->GrabFocus();
1889 for (i=0; i<nframes; i++) {
1890 if (t-delt<0) SetTminTmax(t-delt,t);
1891 else gGeoManager->SetTminTmax(t-delt,t);
1893 for (j=0; j<6; j++) box[j]+=dd[j];
1894 fPainter->GrabFocus(1,dlong,dlat,dpsi);
1899 fname = TString::Format(
"anim%04d.gif", i);
1904 SetAnimateTracks(kFALSE);
1911 void TGeoManager::DrawTracks(Option_t *option)
1913 TVirtualGeoTrack *track;
1917 for (Int_t i=0; i<fNtracks; i++) {
1918 track = GetTrack(i);
1919 if (track) track->Draw(option);
1921 SetAnimateTracks(kFALSE);
1928 void TGeoManager::DrawPath(
const char *path, Option_t *option)
1930 if (!fTopVolume)
return;
1931 fTopVolume->SetVisBranch();
1932 GetGeomPainter()->DrawPath(path, option);
1938 void TGeoManager::RandomPoints(
const TGeoVolume *vol, Int_t npoints, Option_t *option)
1940 GetGeomPainter()->RandomPoints((TGeoVolume*)vol, npoints, option);
1946 void TGeoManager::Test(Int_t npoints, Option_t *option)
1948 GetGeomPainter()->Test(npoints, option);
1954 void TGeoManager::TestOverlaps(
const char* path)
1956 GetGeomPainter()->TestOverlaps(path);
1962 void TGeoManager::GetBranchNames(Int_t *names)
const
1964 GetCurrentNavigator()->GetBranchNames(names);
1970 const char *TGeoManager::GetPdgName(Int_t pdg)
const
1972 static char defaultname[5] = {
"XXX" };
1973 if (!fPdgNames || !pdg)
return defaultname;
1974 for (Int_t i=0; i<fNpdg; i++) {
1975 if (fPdgId[i]==pdg)
return fPdgNames->At(i)->GetName();
1983 void TGeoManager::SetPdgName(Int_t pdg,
const char *name)
1987 fPdgNames =
new TObjArray(1024);
1989 if (!strcmp(name, GetPdgName(pdg)))
return;
1992 Warning(
"SetPdgName",
"No more than 256 different pdg codes allowed");
1995 fPdgId[fNpdg] = pdg;
1996 TNamed *pdgname =
new TNamed(name,
"");
1997 fPdgNames->AddAtAndExpand(pdgname, fNpdg++);
2003 TGDMLMatrix *TGeoManager::GetGDMLMatrix(
const char *name)
const
2005 return (TGDMLMatrix*)fGDMLMatrices->FindObject(name);
2010 void TGeoManager::AddGDMLMatrix(TGDMLMatrix *mat)
2012 if (GetGDMLMatrix(mat->GetName())) {
2013 Error(
"AddGDMLMatrix",
"Matrix %s already added to manager", mat->GetName());
2016 fGDMLMatrices->Add(mat);
2022 TGeoOpticalSurface *TGeoManager::GetOpticalSurface(
const char *name)
const
2024 return (TGeoOpticalSurface*)fOpticalSurfaces->FindObject(name);
2029 void TGeoManager::AddOpticalSurface(TGeoOpticalSurface *optsurf)
2031 if (GetOpticalSurface(optsurf->GetName())) {
2032 Error(
"AddOpticalSurface",
"Surface %s already added to manager", optsurf->GetName());
2035 fOpticalSurfaces->Add(optsurf);
2041 TGeoSkinSurface *TGeoManager::GetSkinSurface(
const char *name)
const
2043 return (TGeoSkinSurface*)fSkinSurfaces->FindObject(name);
2048 void TGeoManager::AddSkinSurface(TGeoSkinSurface *surf)
2050 if (GetSkinSurface(surf->GetName())) {
2051 Error(
"AddSkinSurface",
"Surface %s already added to manager", surf->GetName());
2054 fSkinSurfaces->Add(surf);
2060 TGeoBorderSurface *TGeoManager::GetBorderSurface(
const char *name)
const
2062 return (TGeoBorderSurface*)fBorderSurfaces->FindObject(name);
2067 void TGeoManager::AddBorderSurface(TGeoBorderSurface *surf)
2069 if (GetBorderSurface(surf->GetName())) {
2070 Error(
"AddBorderSurface",
"Surface %s already added to manager", surf->GetName());
2073 fBorderSurfaces->Add(surf);
2079 void TGeoManager::GetBranchNumbers(Int_t *copyNumbers, Int_t *volumeNumbers)
const
2081 GetCurrentNavigator()->GetBranchNumbers(copyNumbers, volumeNumbers);
2087 void TGeoManager::GetBranchOnlys(Int_t *isonly)
const
2089 GetCurrentNavigator()->GetBranchOnlys(isonly);
2095 void TGeoManager::GetBombFactors(Double_t &bombx, Double_t &bomby, Double_t &bombz, Double_t &bombr)
const
2098 fPainter->GetBombFactors(bombx, bomby, bombz, bombr);
2101 bombx = bomby = bombz = bombr = 1.3;
2107 Int_t TGeoManager::GetMaxDaughters()
2109 return fgMaxDaughters;
2115 Int_t TGeoManager::GetMaxLevels()
2123 Int_t TGeoManager::GetMaxXtruVert()
2125 return fgMaxXtruVert;
2131 Int_t TGeoManager::GetNumThreads()
2133 return fgNumThreads;
2139 TGeoHMatrix *TGeoManager::GetHMatrix()
2141 if (!GetCurrentNavigator())
return NULL;
2142 return GetCurrentNavigator()->GetHMatrix();
2148 Int_t TGeoManager::GetVisLevel()
const
2156 Int_t TGeoManager::GetVisOption()
const
2165 Int_t TGeoManager::GetVirtualLevel()
2167 return GetCurrentNavigator()->GetVirtualLevel();
2179 TVirtualGeoTrack *TGeoManager::FindTrackWithId(Int_t
id)
const
2181 TVirtualGeoTrack* trk = 0;
2182 trk = GetTrackOfId(
id);
2183 if (trk)
return trk;
2185 TIter next(fTracks);
2186 TVirtualGeoTrack* prim;
2187 while ((prim = (TVirtualGeoTrack*)next())) {
2188 trk = prim->FindTrackWithId(
id);
2189 if (trk)
return trk;
2197 TVirtualGeoTrack *TGeoManager::GetTrackOfId(Int_t
id)
const
2199 TVirtualGeoTrack *track;
2200 for (Int_t i=0; i<fNtracks; i++) {
2201 if ((track = (TVirtualGeoTrack *)fTracks->UncheckedAt(i))) {
2202 if (track->GetId() == id)
return track;
2211 TVirtualGeoTrack *TGeoManager::GetParentTrackOfId(Int_t
id)
const
2213 TVirtualGeoTrack *track = fCurrentTrack;
2214 while ((track=track->GetMother())) {
2215 if (track->GetId()==id)
return track;
2223 Int_t TGeoManager::GetTrackIndex(Int_t
id)
const
2225 TVirtualGeoTrack *track;
2226 for (Int_t i=0; i<fNtracks; i++) {
2227 if ((track = (TVirtualGeoTrack *)fTracks->UncheckedAt(i))) {
2228 if (track->GetId() == id)
return i;
2237 Bool_t TGeoManager::GotoSafeLevel()
2239 return GetCurrentNavigator()->GotoSafeLevel();
2245 Int_t TGeoManager::GetSafeLevel()
const
2247 return GetCurrentNavigator()->GetSafeLevel();
2253 void TGeoManager::DefaultColors()
2255 const Int_t nmax = 110;
2257 for (Int_t i=0;i<nmax;i++) col[i] = kGray;
2261 col[ 3] = kYellow-10;
2262 col[ 4] = col[ 5] = kGreen-10;
2263 col[ 6] = col[ 7] = kBlue-7;
2264 col[ 8] = col[ 9] = kMagenta-3;
2265 col[10] = col[11] = kRed-10;
2268 col[14] = kOrange+7;
2269 col[16] = kYellow+1;
2270 col[20] = kYellow-10;
2271 col[24] = col[25] = col[26] = kBlue-8;
2272 col[29] = kOrange+9;
2273 col[79] = kOrange-2;
2276 TIter next(fVolumes);
2277 while ((vol=(TGeoVolume*)next())) {
2278 TGeoMedium *med = vol->GetMedium();
2280 TGeoMaterial *mat = med->GetMaterial();
2281 Int_t matZ = (Int_t)mat->GetZ();
2282 vol->SetLineColor(col[matZ]);
2283 if (mat->GetDensity()<0.1) vol->SetTransparency(60);
2291 Double_t TGeoManager::Safety(Bool_t inside)
2293 return GetCurrentNavigator()->Safety(inside);
2299 void TGeoManager::SetVolumeAttribute(
const char *name,
const char *att, Int_t val)
2302 Bool_t all = kFALSE;
2303 if (strstr(name,
"*")) all=kTRUE;
2305 TIter next(fVolumes);
2306 TString chatt = att;
2308 while ((volume=(TGeoVolume*)next())) {
2309 if (strcmp(volume->GetName(), name) && !all)
continue;
2311 if (chatt.Contains(
"colo")) volume->SetLineColor(val);
2312 if (chatt.Contains(
"lsty")) volume->SetLineStyle(val);
2313 if (chatt.Contains(
"lwid")) volume->SetLineWidth(val);
2314 if (chatt.Contains(
"fill")) volume->SetFillColor(val);
2315 if (chatt.Contains(
"seen")) volume->SetVisibility(val);
2317 TIter next1(fGVolumes);
2318 while ((volume=(TGeoVolume*)next1())) {
2319 if (strcmp(volume->GetName(), name) && !all)
continue;
2321 if (chatt.Contains(
"colo")) volume->SetLineColor(val);
2322 if (chatt.Contains(
"lsty")) volume->SetLineStyle(val);
2323 if (chatt.Contains(
"lwid")) volume->SetLineWidth(val);
2324 if (chatt.Contains(
"fill")) volume->SetFillColor(val);
2325 if (chatt.Contains(
"seen")) volume->SetVisibility(val);
2328 Warning(
"SetVolumeAttribute",
"volume: %s does not exist",name);
2335 void TGeoManager::SetBombFactors(Double_t bombx, Double_t bomby, Double_t bombz, Double_t bombr)
2337 if (fPainter) fPainter->SetBombFactors(bombx, bomby, bombz, bombr);
2343 void TGeoManager::SetClippingShape(TGeoShape *shape)
2345 TVirtualGeoPainter *painter = GetGeomPainter();
2347 if (fClippingShape && (fClippingShape!=shape)) ClearShape(fClippingShape);
2348 fClippingShape = shape;
2350 painter->SetClippingShape(shape);
2356 void TGeoManager::SetMaxVisNodes(Int_t maxnodes) {
2357 fMaxVisNodes = maxnodes;
2358 if (maxnodes>0 && fgVerboseLevel>0)
2359 Info(
"SetMaxVisNodes",
"Automatic visible depth for %d visible nodes", maxnodes);
2360 if (!fPainter)
return;
2361 fPainter->CountVisibleNodes();
2362 Int_t level = fPainter->GetVisLevel();
2363 if (level != fVisLevel) fVisLevel = level;
2369 void TGeoManager::SetTopVisible(Bool_t vis) {
2371 fPainter->SetTopVisible(vis);
2377 void TGeoManager::SetCheckedNode(TGeoNode *node) {
2378 GetGeomPainter()->SetCheckedNode(node);
2385 void TGeoManager::SetNmeshPoints(Int_t npoints)
2387 GetGeomPainter()->SetNmeshPoints(npoints);
2397 void TGeoManager::SetVisOption(Int_t option) {
2398 if ((option>=0) && (option<3)) fVisOption=option;
2399 if (fPainter) fPainter->SetVisOption(option);
2405 void TGeoManager::ViewLeaves(Bool_t flag)
2407 if (flag) SetVisOption(1);
2408 else SetVisOption(0);
2415 void TGeoManager::SetVisDensity(Double_t density)
2417 fVisDensity = density;
2418 if (fPainter) fPainter->ModifiedPad();
2424 void TGeoManager::SetVisLevel(Int_t level) {
2428 if (fgVerboseLevel>0)
2429 Info(
"SetVisLevel",
"Automatic visible depth disabled");
2430 if (fPainter) fPainter->CountVisibleNodes();
2439 void TGeoManager::SortOverlaps()
2447 void TGeoManager::OptimizeVoxels(
const char *filename)
2450 Error(
"OptimizeVoxels",
"Geometry must be closed first");
2454 TString fname = filename;
2455 if (fname.IsNull()) fname =
"tgeovox.C";
2456 out.open(fname, std::ios::out);
2458 Error(
"OptimizeVoxels",
"cannot open file");
2463 TString sname(fname);
2464 sname.ReplaceAll(
".C",
"");
2465 out << sname.Data()<<
"()"<<std::endl;
2466 out <<
"{" << std::endl;
2467 out <<
"//=== Macro generated by ROOT version "<< gROOT->GetVersion()<<
" : "<<t.AsString()<<std::endl;
2468 out <<
"//=== Voxel optimization for " << GetTitle() <<
" geometry"<<std::endl;
2469 out <<
"//===== <run this macro JUST BEFORE closing the geometry>"<<std::endl;
2470 out <<
" TGeoVolume *vol = 0;"<<std::endl;
2471 out <<
" // parse all voxelized volumes"<<std::endl;
2472 TGeoVolume *vol = 0;
2474 TIter next(fVolumes);
2475 while ((vol=(TGeoVolume*)next())) {
2476 if (!vol->GetVoxels())
continue;
2477 out<<
" vol = gGeoManager->GetVolume(\""<<vol->GetName()<<
"\");"<<std::endl;
2478 cyltype = vol->OptimizeVoxels();
2480 out<<
" vol->SetCylVoxels();"<<std::endl;
2482 out<<
" vol->SetCylVoxels(kFALSE);"<<std::endl;
2485 out <<
"}" << std::endl;
2501 Int_t TGeoManager::Parse(
const char *expr, TString &expr1, TString &expr2, TString &expr3)
2503 TString startstr(expr);
2504 Int_t len = startstr.Length();
2509 for (i=0; i< len; i++) {
2510 if (startstr(i)==
' ')
continue;
2511 e0 += startstr(i, 1);
2521 Bool_t foundmat = kFALSE;
2529 for (i=0; i<len; i++) {
2531 if (!level) iloop++;
2537 if (level==0) lastpp=i;
2540 if ((e0(i)==
'+') || (e0(i)==
'-') || (e0(i)==
'*')) {
2548 if ((e0(i)==
':') && (level==0)) {
2554 if (gGeoManager) gGeoManager->Error(
"Parse",
"parentheses does not match");
2557 if (iloop==1 && (e0(0)==
'(') && (e0(len-1)==
')')) {
2562 if (foundmat)
break;
2563 if (((lastop==0) && (lastdp>0)) || ((lastpp>0) && (lastdp>lastpp) && (indop<lastpp))) {
2564 expr3 = e0(lastdp+1, len-lastdp);
2573 for (i=0; i<len; i++) {
2583 if (level<=levmin) {
2605 expr1 = e0(0, indop);
2606 expr2 = e0(indop+1, len-indop);
2614 void TGeoManager::SaveAttributes(
const char *filename)
2617 Error(
"SaveAttributes",
"geometry must be closed first\n");
2621 TString fname(filename);
2622 if (fname.IsNull()) fname =
"tgeoatt.C";
2623 out.open(fname, std::ios::out);
2625 Error(
"SaveAttributes",
"cannot open file");
2630 TString sname(fname);
2631 sname.ReplaceAll(
".C",
"");
2632 out << sname.Data()<<
"()"<<std::endl;
2633 out <<
"{" << std::endl;
2634 out <<
"//=== Macro generated by ROOT version "<< gROOT->GetVersion()<<
" : "<<t.AsString()<<std::endl;
2635 out <<
"//=== Attributes for " << GetTitle() <<
" geometry"<<std::endl;
2636 out <<
"//===== <run this macro AFTER loading the geometry in memory>"<<std::endl;
2638 out <<
" TGeoVolume *top = gGeoManager->GetVolume(\""<<fTopVolume->GetName()<<
"\");"<<std::endl;
2639 out <<
" TGeoVolume *vol = 0;"<<std::endl;
2640 out <<
" TGeoNode *node = 0;"<<std::endl;
2641 out <<
" // clear all volume attributes and get painter"<<std::endl;
2642 out <<
" gGeoManager->ClearAttributes();"<<std::endl;
2643 out <<
" gGeoManager->GetGeomPainter();"<<std::endl;
2644 out <<
" // set visualization modes and bomb factors"<<std::endl;
2645 out <<
" gGeoManager->SetVisOption("<<GetVisOption()<<
");"<<std::endl;
2646 out <<
" gGeoManager->SetVisLevel("<<GetVisLevel()<<
");"<<std::endl;
2647 out <<
" gGeoManager->SetExplodedView("<<GetBombMode()<<
");"<<std::endl;
2648 Double_t bombx, bomby, bombz, bombr;
2649 GetBombFactors(bombx, bomby, bombz, bombr);
2650 out <<
" gGeoManager->SetBombFactors("<<bombx<<
","<<bomby<<
","<<bombz<<
","<<bombr<<
");"<<std::endl;
2651 out <<
" // iterate volumes container and set new attributes"<<std::endl;
2653 TGeoVolume *vol = 0;
2654 fTopNode->SaveAttributes(out);
2656 TIter next(fVolumes);
2657 while ((vol=(TGeoVolume*)next())) {
2658 vol->SetVisStreamed(kFALSE);
2660 out <<
" // draw top volume with new settings"<<std::endl;
2661 out <<
" top->Draw();"<<std::endl;
2662 out <<
" gPad->x3d();"<<std::endl;
2663 out <<
"}" << std::endl;
2670 TGeoNode *TGeoManager::SearchNode(Bool_t downwards,
const TGeoNode *skipnode)
2672 return GetCurrentNavigator()->SearchNode(downwards, skipnode);
2679 TGeoNode *TGeoManager::CrossBoundaryAndLocate(Bool_t downwards, TGeoNode *skipnode)
2681 return GetCurrentNavigator()->CrossBoundaryAndLocate(downwards, skipnode);
2690 TGeoNode *TGeoManager::FindNextBoundaryAndStep(Double_t stepmax, Bool_t compsafe)
2692 return GetCurrentNavigator()->FindNextBoundaryAndStep(stepmax, compsafe);
2709 TGeoNode *TGeoManager::FindNextBoundary(Double_t stepmax,
const char *path, Bool_t frombdr)
2712 return GetCurrentNavigator()->FindNextBoundary(stepmax,path, frombdr);
2720 TGeoNode *TGeoManager::FindNextDaughterBoundary(Double_t *point, Double_t *dir, Int_t &idaughter, Bool_t compmatrix)
2722 return GetCurrentNavigator()->FindNextDaughterBoundary(point, dir, idaughter, compmatrix);
2728 void TGeoManager::ResetState()
2730 GetCurrentNavigator()->ResetState();
2736 TGeoNode *TGeoManager::FindNode(Bool_t safe_start)
2738 return GetCurrentNavigator()->FindNode(safe_start);
2744 TGeoNode *TGeoManager::FindNode(Double_t x, Double_t y, Double_t z)
2746 return GetCurrentNavigator()->FindNode(x, y, z);
2753 Double_t *TGeoManager::FindNormalFast()
2755 return GetCurrentNavigator()->FindNormalFast();
2764 Double_t *TGeoManager::FindNormal(Bool_t forward)
2766 return GetCurrentNavigator()->FindNormal(forward);
2772 Bool_t TGeoManager::IsSameLocation(Double_t x, Double_t y, Double_t z, Bool_t change)
2774 return GetCurrentNavigator()->IsSameLocation(x,y,z,change);
2780 Bool_t TGeoManager::IsSamePoint(Double_t x, Double_t y, Double_t z)
const
2782 return GetCurrentNavigator()->IsSamePoint(x,y,z);
2788 Bool_t TGeoManager::IsInPhiRange()
const
2790 if (!fPhiCut)
return kTRUE;
2791 const Double_t *origin;
2792 if (!GetCurrentNavigator() || !GetCurrentNavigator()->GetCurrentNode())
return kFALSE;
2793 origin = ((TGeoBBox*)GetCurrentNavigator()->GetCurrentVolume()->GetShape())->GetOrigin();
2795 LocalToMaster(origin, &point[0]);
2796 Double_t phi = TMath::ATan2(point[1], point[0])*TMath::RadToDeg();
2797 if (phi<0) phi+=360.;
2798 if ((phi>=fPhimin) && (phi<=fPhimax))
return kFALSE;
2806 TGeoNode *TGeoManager::InitTrack(
const Double_t *point,
const Double_t *dir)
2808 return GetCurrentNavigator()->InitTrack(point, dir);
2815 TGeoNode *TGeoManager::InitTrack(Double_t x, Double_t y, Double_t z, Double_t nx, Double_t ny, Double_t nz)
2817 return GetCurrentNavigator()->InitTrack(x,y,z,nx,ny,nz);
2823 void TGeoManager::InspectState()
const
2825 GetCurrentNavigator()->InspectState();
2831 const char *TGeoManager::GetPath()
const
2833 return GetCurrentNavigator()->GetPath();
2839 Int_t TGeoManager::GetByteCount(Option_t * )
2842 TIter next(fVolumes);
2844 while ((vol=(TGeoVolume*)next())) count += vol->GetByteCount();
2845 TIter next1(fMatrices);
2847 while ((matrix=(TGeoMatrix*)next1())) count += matrix->GetByteCount();
2848 TIter next2(fMaterials);
2850 while ((mat=(TGeoMaterial*)next2())) count += mat->GetByteCount();
2851 TIter next3(fMedia);
2853 while ((med=(TGeoMedium*)next3())) count += med->GetByteCount();
2854 if (fgVerboseLevel>0) Info(
"GetByteCount",
"Total size of logical tree : %i bytes", count);
2861 TVirtualGeoPainter *TGeoManager::GetGeomPainter()
2865 if ((h = gROOT->GetPluginManager()->FindHandler(
"TVirtualGeoPainter"))) {
2866 if (h->LoadPlugin() == -1)
2868 fPainter = (TVirtualGeoPainter*)h->ExecPlugin(1,
this);
2870 Error(
"GetGeomPainter",
"could not create painter");
2881 TGeoVolume *TGeoManager::GetVolume(
const char *name)
const
2883 TString sname = name;
2884 sname = sname.Strip();
2885 TGeoVolume *vol = (TGeoVolume*)fVolumes->FindObject(sname.Data());
2892 TGeoVolume *TGeoManager::FindVolumeFast(
const char *name, Bool_t multi)
2894 if (!fHashVolumes) {
2895 Int_t nvol = fVolumes->GetEntriesFast();
2896 Int_t ngvol = fGVolumes->GetEntriesFast();
2897 fHashVolumes =
new THashList(nvol+1);
2898 fHashGVolumes =
new THashList(ngvol+1);
2900 for (i=0; i<ngvol; i++) fHashGVolumes->AddLast(fGVolumes->At(i));
2901 for (i=0; i<nvol; i++) fHashVolumes->AddLast(fVolumes->At(i));
2903 TString sname = name;
2904 sname = sname.Strip();
2905 THashList *list = fHashVolumes;
2906 if (multi) list = fHashGVolumes;
2907 TGeoVolume *vol = (TGeoVolume*)list->FindObject(sname.Data());
2914 Int_t TGeoManager::GetUID(
const char *volname)
const
2916 TGeoManager *geom = (TGeoManager*)
this;
2917 TGeoVolume *vol = geom->FindVolumeFast(volname, kFALSE);
2918 if (!vol) vol = geom->FindVolumeFast(volname, kTRUE);
2919 if (!vol)
return -1;
2920 return vol->GetNumber();
2926 TGeoMaterial *TGeoManager::FindDuplicateMaterial(
const TGeoMaterial *mat)
const
2928 Int_t index = fMaterials->IndexOf(mat);
2929 if (index <= 0)
return 0;
2930 TGeoMaterial *other;
2931 for (Int_t i=0; i<index; i++) {
2932 other = (TGeoMaterial*)fMaterials->At(i);
2933 if (other == mat)
continue;
2934 if (other->IsEq(mat))
return other;
2942 TGeoMaterial *TGeoManager::GetMaterial(
const char *matname)
const
2944 TString sname = matname;
2945 sname = sname.Strip();
2946 TGeoMaterial *mat = (TGeoMaterial*)fMaterials->FindObject(sname.Data());
2953 TGeoMedium *TGeoManager::GetMedium(
const char *medium)
const
2955 TString sname = medium;
2956 sname = sname.Strip();
2957 TGeoMedium *med = (TGeoMedium*)fMedia->FindObject(sname.Data());
2964 TGeoMedium *TGeoManager::GetMedium(Int_t numed)
const
2968 while ((med=(TGeoMedium*)next())) {
2969 if (med->GetId()==numed)
return med;
2977 TGeoMaterial *TGeoManager::GetMaterial(Int_t
id)
const
2979 if (id<0 || id >= fMaterials->GetSize())
return 0;
2980 TGeoMaterial *mat = (TGeoMaterial*)fMaterials->At(
id);
2987 Int_t TGeoManager::GetMaterialIndex(
const char *matname)
const
2989 TIter next(fMaterials);
2992 TString sname = matname;
2993 sname = sname.Strip();
2994 while ((mat = (TGeoMaterial*)next())) {
2995 if (!strcmp(mat->GetName(),sname.Data()))
3006 void TGeoManager::RandomRays(Int_t nrays, Double_t startx, Double_t starty, Double_t startz,
const char *target_vol, Bool_t check_norm)
3008 GetGeomPainter()->RandomRays(nrays, startx, starty, startz, target_vol, check_norm);
3014 void TGeoManager::RemoveMaterial(Int_t index)
3016 TObject *obj = fMaterials->At(index);
3017 if (obj) fMaterials->Remove(obj);
3024 void TGeoManager::ResetUserData()
3026 TIter next(fVolumes);
3028 while ((vol=(TGeoVolume*)next())) vol->SetField(0);
3034 void TGeoManager::SetRTmode(Int_t mode)
3036 fRaytraceMode = mode;
3037 if (fPainter && fPainter->IsRaytracing()) ModifiedPad();
3043 void TGeoManager::RestoreMasterVolume()
3045 if (fTopVolume == fMasterVolume)
return;
3046 if (fMasterVolume) SetTopVolume(fMasterVolume);
3052 void TGeoManager::Voxelize(Option_t *option)
3056 if (!fStreamVoxels && fgVerboseLevel>0) Info(
"Voxelize",
"Voxelizing...");
3058 TIter next(fVolumes);
3059 while ((vol = (TGeoVolume*)next())) {
3060 if (!fIsGeomReading) vol->SortNodes();
3061 if (!fStreamVoxels) {
3062 vol->Voxelize(option);
3064 if (!fIsGeomReading) vol->FindOverlaps();
3071 void TGeoManager::ModifiedPad()
const
3073 if (!fPainter)
return;
3074 fPainter->ModifiedPad();
3080 TGeoVolume *TGeoManager::MakeArb8(
const char *name, TGeoMedium *medium,
3081 Double_t dz, Double_t *vertices)
3083 return TGeoBuilder::Instance(
this)->MakeArb8(name, medium, dz, vertices);
3089 TGeoVolume *TGeoManager::MakeBox(
const char *name, TGeoMedium *medium,
3090 Double_t dx, Double_t dy, Double_t dz)
3092 return TGeoBuilder::Instance(
this)->MakeBox(name, medium, dx, dy, dz);
3098 TGeoVolume *TGeoManager::MakePara(
const char *name, TGeoMedium *medium,
3099 Double_t dx, Double_t dy, Double_t dz,
3100 Double_t alpha, Double_t theta, Double_t phi)
3102 return TGeoBuilder::Instance(
this)->MakePara(name, medium, dx, dy, dz, alpha, theta, phi);
3108 TGeoVolume *TGeoManager::MakeSphere(
const char *name, TGeoMedium *medium,
3109 Double_t rmin, Double_t rmax, Double_t themin, Double_t themax,
3110 Double_t phimin, Double_t phimax)
3112 return TGeoBuilder::Instance(
this)->MakeSphere(name, medium, rmin, rmax, themin, themax, phimin, phimax);
3118 TGeoVolume *TGeoManager::MakeTorus(
const char *name, TGeoMedium *medium, Double_t r,
3119 Double_t rmin, Double_t rmax, Double_t phi1, Double_t dphi)
3121 return TGeoBuilder::Instance(
this)->MakeTorus(name, medium, r, rmin, rmax, phi1, dphi);
3127 TGeoVolume *TGeoManager::MakeTube(
const char *name, TGeoMedium *medium,
3128 Double_t rmin, Double_t rmax, Double_t dz)
3130 return TGeoBuilder::Instance(
this)->MakeTube(name, medium, rmin, rmax, dz);
3137 TGeoVolume *TGeoManager::MakeTubs(
const char *name, TGeoMedium *medium,
3138 Double_t rmin, Double_t rmax, Double_t dz,
3139 Double_t phiStart, Double_t phiEnd)
3141 return TGeoBuilder::Instance(
this)->MakeTubs(name, medium, rmin, rmax, dz, phiStart, phiEnd);
3147 TGeoVolume *TGeoManager::MakeEltu(
const char *name, TGeoMedium *medium,
3148 Double_t a, Double_t b, Double_t dz)
3150 return TGeoBuilder::Instance(
this)->MakeEltu(name, medium, a, b, dz);
3156 TGeoVolume *TGeoManager::MakeHype(
const char *name, TGeoMedium *medium,
3157 Double_t rin, Double_t stin, Double_t rout, Double_t stout, Double_t dz)
3159 return TGeoBuilder::Instance(
this)->MakeHype(name, medium, rin, stin, rout, stout, dz);
3165 TGeoVolume *TGeoManager::MakeParaboloid(
const char *name, TGeoMedium *medium,
3166 Double_t rlo, Double_t rhi, Double_t dz)
3168 return TGeoBuilder::Instance(
this)->MakeParaboloid(name, medium, rlo, rhi, dz);
3174 TGeoVolume *TGeoManager::MakeCtub(
const char *name, TGeoMedium *medium,
3175 Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2,
3176 Double_t lx, Double_t ly, Double_t lz, Double_t tx, Double_t ty, Double_t tz)
3178 return TGeoBuilder::Instance(
this)->MakeCtub(name, medium, rmin, rmax, dz, phi1, phi2, lx, ly, lz, tx, ty, tz);
3184 TGeoVolume *TGeoManager::MakeCone(
const char *name, TGeoMedium *medium,
3185 Double_t dz, Double_t rmin1, Double_t rmax1,
3186 Double_t rmin2, Double_t rmax2)
3188 return TGeoBuilder::Instance(
this)->MakeCone(name, medium, dz, rmin1, rmax1, rmin2, rmax2);
3194 TGeoVolume *TGeoManager::MakeCons(
const char *name, TGeoMedium *medium,
3195 Double_t dz, Double_t rmin1, Double_t rmax1,
3196 Double_t rmin2, Double_t rmax2,
3197 Double_t phi1, Double_t phi2)
3199 return TGeoBuilder::Instance(
this)->MakeCons(name, medium, dz, rmin1, rmax1, rmin2, rmax2, phi1, phi2);
3205 TGeoVolume *TGeoManager::MakePcon(
const char *name, TGeoMedium *medium,
3206 Double_t phi, Double_t dphi, Int_t nz)
3208 return TGeoBuilder::Instance(
this)->MakePcon(name, medium, phi, dphi, nz);
3214 TGeoVolume *TGeoManager::MakePgon(
const char *name, TGeoMedium *medium,
3215 Double_t phi, Double_t dphi, Int_t nedges, Int_t nz)
3217 return TGeoBuilder::Instance(
this)->MakePgon(name, medium, phi, dphi, nedges, nz);
3223 TGeoVolume *TGeoManager::MakeTrd1(
const char *name, TGeoMedium *medium,
3224 Double_t dx1, Double_t dx2, Double_t dy, Double_t dz)
3226 return TGeoBuilder::Instance(
this)->MakeTrd1(name, medium, dx1, dx2, dy, dz);
3232 TGeoVolume *TGeoManager::MakeTrd2(
const char *name, TGeoMedium *medium,
3233 Double_t dx1, Double_t dx2, Double_t dy1, Double_t dy2,
3236 return TGeoBuilder::Instance(
this)->MakeTrd2(name, medium, dx1, dx2, dy1, dy2, dz);
3242 TGeoVolume *TGeoManager::MakeTrap(
const char *name, TGeoMedium *medium,
3243 Double_t dz, Double_t theta, Double_t phi, Double_t h1,
3244 Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2,
3245 Double_t tl2, Double_t alpha2)
3247 return TGeoBuilder::Instance(
this)->MakeTrap(name, medium, dz, theta, phi, h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2);
3253 TGeoVolume *TGeoManager::MakeGtra(
const char *name, TGeoMedium *medium,
3254 Double_t dz, Double_t theta, Double_t phi, Double_t twist, Double_t h1,
3255 Double_t bl1, Double_t tl1, Double_t alpha1, Double_t h2, Double_t bl2,
3256 Double_t tl2, Double_t alpha2)
3258 return TGeoBuilder::Instance(
this)->MakeGtra(name, medium, dz, theta, phi, twist, h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2);
3264 TGeoVolume *TGeoManager::MakeXtru(
const char *name, TGeoMedium *medium, Int_t nz)
3266 return TGeoBuilder::Instance(
this)->MakeXtru(name, medium, nz);
3274 TGeoPNEntry *TGeoManager::SetAlignableEntry(
const char *unique_name,
const char *path,
3277 if (!CheckPath(path))
return NULL;
3278 if (!fHashPNE) fHashPNE =
new THashList(256,3);
3279 if (!fArrayPNE) fArrayPNE =
new TObjArray(256);
3280 TGeoPNEntry *entry = GetAlignableEntry(unique_name);
3282 Error(
"SetAlignableEntry",
"An alignable object with name %s already existing. NOT ADDED !", unique_name);
3285 entry =
new TGeoPNEntry(unique_name, path);
3286 Int_t ientry = fHashPNE->GetSize();
3287 fHashPNE->Add(entry);
3288 fArrayPNE->AddAtAndExpand(entry, ientry);
3290 Bool_t added = InsertPNEId(uid, ientry);
3291 if (!added) Error(
"SetAlignableEntry",
"A PN entry: has already uid=%i", uid);
3299 TGeoPNEntry *TGeoManager::GetAlignableEntry(
const char *name)
const
3301 if (!fHashPNE)
return 0;
3302 return (TGeoPNEntry*)fHashPNE->FindObject(name);
3308 TGeoPNEntry *TGeoManager::GetAlignableEntry(Int_t index)
const
3310 if (!fArrayPNE && !InitArrayPNE())
return 0;
3311 return (TGeoPNEntry*)fArrayPNE->At(index);
3317 TGeoPNEntry *TGeoManager::GetAlignableEntryByUID(Int_t uid)
const
3319 if (!fNPNEId || (!fArrayPNE && !InitArrayPNE()))
return NULL;
3320 Int_t index = TMath::BinarySearch(fNPNEId, fKeyPNEId, uid);
3321 if (index<0 || fKeyPNEId[index]!=uid)
return NULL;
3322 return (TGeoPNEntry*)fArrayPNE->At(fValuePNEId[index]);
3328 Int_t TGeoManager::GetNAlignable(Bool_t with_uid)
const
3330 if (!fHashPNE)
return 0;
3331 if (with_uid)
return fNPNEId;
3332 return fHashPNE->GetSize();
3338 Bool_t TGeoManager::InsertPNEId(Int_t uid, Int_t ientry)
3343 fKeyPNEId =
new Int_t[fSizePNEId];
3344 memset(fKeyPNEId, 0, fSizePNEId*
sizeof(Int_t));
3345 fValuePNEId =
new Int_t[fSizePNEId];
3346 memset(fValuePNEId, 0, fSizePNEId*
sizeof(Int_t));
3347 fKeyPNEId[fNPNEId] = uid;
3348 fValuePNEId[fNPNEId++] = ientry;
3352 Int_t index = TMath::BinarySearch(fNPNEId, fKeyPNEId, uid);
3353 if (index>0 && fKeyPNEId[index]==uid)
return kFALSE;
3355 Bool_t resize = (fNPNEId==fSizePNEId)?kTRUE:kFALSE;
3360 Int_t *keys =
new Int_t[fSizePNEId];
3361 memset(keys, 0, fSizePNEId*
sizeof(Int_t));
3362 Int_t *values =
new Int_t[fSizePNEId];
3363 memset(values, 0, fSizePNEId*
sizeof(Int_t));
3365 memcpy(keys, fKeyPNEId, (index+1)*
sizeof(Int_t));
3366 memcpy(values, fValuePNEId, (index+1)*
sizeof(Int_t));
3368 keys[index+1] = uid;
3369 values[index+1] = ientry;
3371 memcpy(&keys[index+2], &fKeyPNEId[index+1], (fNPNEId-index-1)*
sizeof(Int_t));
3372 memcpy(&values[index+2], &fValuePNEId[index+1], (fNPNEId-index-1)*
sizeof(Int_t));
3373 delete [] fKeyPNEId;
3375 delete [] fValuePNEId;
3376 fValuePNEId = values;
3382 for (i=fNPNEId-1; i>index; i--) {
3383 fKeyPNEId[i+1] = fKeyPNEId[i];
3384 fValuePNEId[i+1] = fValuePNEId[i];
3386 fKeyPNEId[index+1] = uid;
3387 fValuePNEId[index+1] = ientry;
3395 TGeoPhysicalNode *TGeoManager::MakeAlignablePN(
const char *name)
3397 TGeoPNEntry *entry = GetAlignableEntry(name);
3399 Error(
"MakeAlignablePN",
"No alignable object named %s found !", name);
3402 return MakeAlignablePN(entry);
3408 TGeoPhysicalNode *TGeoManager::MakeAlignablePN(TGeoPNEntry *entry)
3411 Error(
"MakeAlignablePN",
"No alignable object specified !");
3414 const char *path = entry->GetTitle();
3416 Error(
"MakeAlignablePN",
"Alignable object %s poins to invalid path: %s",
3417 entry->GetName(), path);
3420 TGeoPhysicalNode *node = MakePhysicalNode(path);
3421 entry->SetPhysicalNode(node);
3429 TGeoPhysicalNode *TGeoManager::MakePhysicalNode(
const char *path)
3431 TGeoPhysicalNode *node;
3433 if (!CheckPath(path)) {
3434 Error(
"MakePhysicalNode",
"path: %s not valid", path);
3437 node =
new TGeoPhysicalNode(path);
3439 node =
new TGeoPhysicalNode(GetPath());
3441 fPhysicalNodes->Add(node);
3449 void TGeoManager::RefreshPhysicalNodes(Bool_t lock)
3451 TIter next(gGeoManager->GetListOfPhysicalNodes());
3452 TGeoPhysicalNode *pn;
3453 while ((pn=(TGeoPhysicalNode*)next())) pn->Refresh();
3454 if (fParallelWorld && fParallelWorld->IsClosed()) fParallelWorld->RefreshPhysicalNodes();
3455 if (lock) LockGeometry();
3462 void TGeoManager::ClearPhysicalNodes(Bool_t mustdelete)
3464 if (mustdelete) fPhysicalNodes->Delete();
3465 else fPhysicalNodes->Clear();
3471 TGeoVolumeAssembly *TGeoManager::MakeVolumeAssembly(
const char *name)
3473 return TGeoBuilder::Instance(
this)->MakeVolumeAssembly(name);
3479 TGeoVolumeMulti *TGeoManager::MakeVolumeMulti(
const char *name, TGeoMedium *medium)
3481 return TGeoBuilder::Instance(
this)->MakeVolumeMulti(name, medium);
3487 void TGeoManager::SetExplodedView(Int_t ibomb)
3489 if ((ibomb>=0) && (ibomb<4)) fExplodedView = ibomb;
3490 if (fPainter) fPainter->SetExplodedView(ibomb);
3496 void TGeoManager::SetPhiRange(Double_t phimin, Double_t phimax)
3498 if ((phimin==0) && (phimax==360)) {
3510 void TGeoManager::SetNsegments(Int_t nseg)
3512 if (fNsegments==nseg)
return;
3513 if (nseg>2) fNsegments = nseg;
3514 if (fPainter) fPainter->SetNsegments(nseg);
3520 Int_t TGeoManager::GetNsegments()
const
3528 void TGeoManager::BuildDefaultMaterials()
3531 TGeoVolume::CreateDummyMedium();
3537 TGeoElementTable *TGeoManager::GetElementTable()
3539 if (!fElementTable) fElementTable =
new TGeoElementTable(200);
3540 return fElementTable;
3550 TGeoNode *TGeoManager::Step(Bool_t is_geom, Bool_t cross)
3552 return GetCurrentNavigator()->Step(is_geom, cross);
3559 TGeoNode *TGeoManager::SamplePoints(Int_t npoints, Double_t &dist, Double_t epsil,
3562 return GetGeomPainter()->SamplePoints(npoints, dist, epsil, g3path);
3568 void TGeoManager::SetTopVolume(TGeoVolume *vol)
3570 if (fTopVolume==vol)
return;
3572 TSeqCollection *brlist = gROOT->GetListOfBrowsers();
3574 TBrowser *browser = 0;
3576 if (fTopVolume) fTopVolume->SetTitle(
"");
3578 vol->SetTitle(
"Top volume");
3580 TGeoNode *topn = fTopNode;
3582 while ((browser=(TBrowser*)next())) browser->RecursiveRemove(topn);
3585 fMasterVolume = vol;
3586 fMasterVolume->Grab();
3587 fUniqueVolumes->AddAtAndExpand(vol,0);
3588 if (fgVerboseLevel>0) Info(
"SetTopVolume",
"Top volume is %s. Master volume is %s", fTopVolume->GetName(),
3589 fMasterVolume->GetName());
3593 fTopNode =
new TGeoNodeMatrix(vol, gGeoIdentity);
3594 fTopNode->SetName(TString::Format(
"%s_1",vol->GetName()));
3595 fTopNode->SetNumber(1);
3596 fTopNode->SetTitle(
"Top logical node");
3597 fNodes->AddAt(fTopNode, 0);
3598 if (!GetCurrentNavigator()) {
3599 fCurrentNavigator = AddNavigator();
3602 Int_t nnavigators = 0;
3603 TGeoNavigatorArray *arr = GetListOfNavigators();
3605 nnavigators = arr->GetEntriesFast();
3606 for (Int_t i=0; i<nnavigators; i++) {
3607 TGeoNavigator *nav = (TGeoNavigator*)arr->At(i);
3609 if (fClosed) nav->GetCache()->BuildInfoBranch();
3616 void TGeoManager::SelectTrackingMedia()
3660 void TGeoManager::CheckBoundaryErrors(Int_t ntracks, Double_t radius)
3662 GetGeomPainter()->CheckBoundaryErrors(ntracks, radius);
3670 void TGeoManager::CheckBoundaryReference(Int_t icheck)
3672 GetGeomPainter()->CheckBoundaryReference(icheck);
3678 void TGeoManager::CheckPoint(Double_t x, Double_t y, Double_t z, Option_t *option)
3680 GetGeomPainter()->CheckPoint(x,y,z,option);
3691 void TGeoManager::CheckShape(TGeoShape *shape, Int_t testNo, Int_t nsamples, Option_t *option)
3693 GetGeomPainter()->CheckShape(shape, testNo, nsamples, option);
3719 void TGeoManager::CheckGeometryFull(Int_t ntracks, Double_t vx, Double_t vy, Double_t vz, Option_t *option)
3721 TString opt(option);
3723 if (!opt.Length()) {
3724 Error(
"CheckGeometryFull",
"The option string must contain a letter. See method documentation.");
3727 Bool_t checkoverlaps = opt.Contains(
"o");
3728 Bool_t checkcrossings = opt.Contains(
"b");
3733 GetGeomPainter()->CheckGeometryFull(checkoverlaps,checkcrossings,ntracks,vertex);
3739 void TGeoManager::CheckGeometry(Option_t * )
3741 if (fgVerboseLevel>0) Info(
"CheckGeometry",
"Fixing runtime shapes...");
3742 TIter next(fShapes);
3743 TIter nextv(fVolumes);
3746 Bool_t has_runtime = kFALSE;
3747 while ((shape = (TGeoShape*)next())) {
3748 if (shape->IsRunTimeShape()) {
3749 has_runtime = kTRUE;
3751 if (fIsGeomReading) shape->AfterStreamer();
3752 if (shape->TestShapeBit(TGeoShape::kGeoPcon) || shape->TestShapeBit(TGeoShape::kGeoArb8))
3753 if (!shape->TestShapeBit(TGeoShape::kGeoClosedShape)) shape->ComputeBBox();
3755 if (has_runtime) fTopNode->CheckShapes();
3756 else if (fgVerboseLevel>0) Info(
"CheckGeometry",
"...Nothing to fix");
3758 TGeoMedium *dummy = TGeoVolume::DummyMedium();
3759 while ((vol = (TGeoVolume*)nextv())) {
3760 if (vol->IsAssembly()) vol->GetShape()->ComputeBBox();
3761 else if (vol->GetMedium() == dummy) {
3762 Warning(
"CheckGeometry",
"Volume \"%s\" has no medium: assigned dummy medium and material", vol->GetName());
3763 vol->SetMedium(dummy);
3771 void TGeoManager::CheckOverlaps(Double_t ovlp, Option_t * option)
3774 Error(
"CheckOverlaps",
"Top node not set");
3777 fTopNode->CheckOverlaps(ovlp,option);
3783 void TGeoManager::PrintOverlaps()
const
3785 if (!fOverlaps)
return;
3786 Int_t novlp = fOverlaps->GetEntriesFast();
3788 TGeoManager *geom = (TGeoManager*)
this;
3789 geom->GetGeomPainter()->PrintOverlaps();
3796 Double_t TGeoManager::Weight(Double_t precision, Option_t *option)
3799 TString opt(option);
3802 TGeoVolume *volume = fTopVolume;
3803 if (opt.Contains(
"v")) {
3804 if (opt.Contains(
"a")) {
3805 if (fgVerboseLevel>0) Info(
"Weight",
"Computing analytically weight of %s", volume->GetName());
3806 weight = volume->WeightA();
3807 if (fgVerboseLevel>0) Info(
"Weight",
"Computed weight: %f [kg]\n", weight);
3810 if (fgVerboseLevel>0) {
3811 Info(
"Weight",
"Estimating weight of %s with %g %% precision", fTopVolume->GetName(), 100.*precision);
3812 printf(
" event weight err\n");
3813 printf(
"========================================\n");
3816 weight = fPainter->Weight(precision, option);
3824 ULong_t TGeoManager::SizeOf(
const TGeoNode * , Option_t * )
3832 void TGeoManager::Streamer(TBuffer &R__b)
3834 if (R__b.IsReading()) {
3835 R__b.ReadClassBuffer(TGeoManager::Class(),
this);
3836 fIsGeomReading = kTRUE;
3838 fStreamVoxels = kFALSE;
3839 fIsGeomReading = kFALSE;
3841 R__b.WriteClassBuffer(TGeoManager::Class(),
this);
3848 void TGeoManager::ExecuteEvent(Int_t event, Int_t px, Int_t py)
3850 if (!fPainter)
return;
3851 fPainter->ExecuteManagerEvent(
this, event, px, py);
3872 Int_t TGeoManager::Export(
const char *filename,
const char *name, Option_t *option)
3874 TString sfile(filename);
3875 if (sfile.Contains(
".C")) {
3877 if (fgVerboseLevel>0) Info(
"Export",
"Exporting %s %s as C++ code", GetName(), GetTitle());
3878 fTopVolume->SaveAs(filename);
3881 if (sfile.Contains(
".gdml")) {
3883 if (fgVerboseLevel>0) Info(
"Export",
"Exporting %s %s as gdml code", GetName(), GetTitle());
3886 cmd = TString::Format(
"TGDMLWrite::StartGDMLWriting(gGeoManager,\"%s\",\"%s\")", filename, option);
3887 gROOT->ProcessLineFast(cmd);
3890 if (sfile.Contains(
".root") || sfile.Contains(
".xml")) {
3892 TFile *f = TFile::Open(filename,
"recreate");
3893 if (!f || f->IsZombie()) {
3894 Error(
"Export",
"Cannot open file");
3897 TString keyname = name;
3898 if (keyname.IsNull()) keyname = GetName();
3899 TString opt = option;
3901 if (opt.Contains(
"v")) {
3902 fStreamVoxels = kTRUE;
3903 if (fgVerboseLevel>0) Info(
"Export",
"Exporting %s %s as root file. Optimizations streamed.", GetName(), GetTitle());
3905 fStreamVoxels = kFALSE;
3906 if (fgVerboseLevel>0) Info(
"Export",
"Exporting %s %s as root file. Optimizations not streamed.", GetName(), GetTitle());
3909 const char *precision_dbl = TBufferText::GetDoubleFormat();
3910 const char *precision_flt = TBufferText::GetFloatFormat();
3911 TString new_format_dbl = TString::Format(
"%%.%dg", TGeoManager::GetExportPrecision());
3912 if (sfile.Contains(
".xml")) {
3913 TBufferText::SetDoubleFormat(new_format_dbl.Data());
3914 TBufferText::SetFloatFormat(new_format_dbl.Data());
3916 Int_t nbytes = Write(keyname);
3917 if (sfile.Contains(
".xml")) {
3918 TBufferText::SetFloatFormat(precision_dbl);
3919 TBufferText::SetDoubleFormat(precision_flt);
3922 fStreamVoxels = kFALSE;
3932 void TGeoManager::LockGeometry()
3940 void TGeoManager::UnlockGeometry()
3948 Bool_t TGeoManager::IsLocked()
3958 Int_t TGeoManager::GetVerboseLevel()
3960 return fgVerboseLevel;
3966 void TGeoManager::SetVerboseLevel(Int_t vl)
3968 fgVerboseLevel = vl;
3988 TGeoManager *TGeoManager::Import(
const char *filename,
const char *name, Option_t * )
3991 ::Warning(
"TGeoManager::Import",
"TGeoMananager in lock mode. NOT IMPORTING new geometry");
3994 if (!filename)
return 0;
3995 if (fgVerboseLevel>0) ::Info(
"TGeoManager::Import",
"Reading geometry from file: %s",filename);
3997 if (gGeoManager)
delete gGeoManager;
4000 if (strstr(filename,
".gdml")) {
4002 new TGeoManager(
"GDMLImport",
"Geometry imported from GDML");
4003 TString cmd = TString::Format(
"TGDMLParse::StartGDML(\"%s\")", filename);
4004 TGeoVolume* world = (TGeoVolume*)gROOT->ProcessLineFast(cmd);
4007 ::Error(
"TGeoManager::Import",
"Cannot open file");
4010 gGeoManager->SetTopVolume(world);
4011 gGeoManager->CloseGeometry();
4012 gGeoManager->DefaultColors();
4016 TDirectory::TContext ctxt;
4020 if (strstr(filename,
"http")) f = TFile::Open(filename,
"CACHEREAD");
4021 else f = TFile::Open(filename);
4022 if (!f || f->IsZombie()) {
4023 ::Error(
"TGeoManager::Import",
"Cannot open file");
4026 if (name && strlen(name) > 0) {
4027 gGeoManager = (TGeoManager*)f->Get(name);
4029 TIter next(f->GetListOfKeys());
4031 while ((key = (TKey*)next())) {
4032 if (strcmp(key->GetClassName(),
"TGeoManager") != 0)
continue;
4033 gGeoManager = (TGeoManager*)key->ReadObj();
4039 if (!gGeoManager)
return 0;
4040 if (!gROOT->GetListOfGeometries()->FindObject(gGeoManager)) gROOT->GetListOfGeometries()->Add(gGeoManager);
4041 if (!gROOT->GetListOfBrowsables()->FindObject(gGeoManager)) gROOT->GetListOfBrowsables()->Add(gGeoManager);
4042 gGeoManager->UpdateElements();
4049 void TGeoManager::UpdateElements()
4051 if (!fElementTable)
return;
4052 TIter next(fMaterials);
4055 TGeoElement *elem, *elem_table;
4057 while ((mat=(TGeoMaterial*)next())) {
4058 if (mat->IsMixture()) {
4059 mix = (TGeoMixture*)mat;
4060 nelem = mix->GetNelements();
4061 for (i=0; i<nelem; i++) {
4062 elem = mix->GetElement(i);
4063 if (!elem)
continue;
4064 elem_table = fElementTable->GetElement(elem->Z());
4065 if (!elem_table)
continue;
4066 if (elem != elem_table) {
4067 elem_table->SetDefined(elem->IsDefined());
4068 elem_table->SetUsed(elem->IsUsed());
4070 elem_table->SetDefined();
4074 elem = mat->GetElement();
4075 if (!elem)
continue;
4076 elem_table = fElementTable->GetElement(elem->Z());
4077 if (!elem_table)
continue;
4078 if (elem != elem_table) {
4079 elem_table->SetDefined(elem->IsDefined());
4080 elem_table->SetUsed(elem->IsUsed());
4082 elem_table->SetUsed();
4091 Bool_t TGeoManager::InitArrayPNE()
const
4094 fArrayPNE =
new TObjArray(fHashPNE->GetSize());
4095 TIter next(fHashPNE);
4097 while ((obj = next())) {
4098 fArrayPNE->Add(obj);
4108 Bool_t TGeoManager::GetTminTmax(Double_t &tmin, Double_t &tmax)
const
4119 void TGeoManager::SetTminTmax(Double_t tmin, Double_t tmax)
4123 if (tmin==0 && tmax==999) fTimeCut = kFALSE;
4124 else fTimeCut = kTRUE;
4125 if (fTracks && !IsAnimatingTracks()) ModifiedPad();
4131 void TGeoManager::MasterToTop(
const Double_t *master, Double_t *top)
const
4133 GetCurrentNavigator()->MasterToLocal(master, top);
4139 void TGeoManager::TopToMaster(
const Double_t *top, Double_t *master)
const
4141 GetCurrentNavigator()->LocalToMaster(top, master);
4151 TGeoParallelWorld *TGeoManager::CreateParallelWorld(
const char *name)
4153 fParallelWorld =
new TGeoParallelWorld(name,
this);
4154 return fParallelWorld;
4162 void TGeoManager::SetUseParallelWorldNav(Bool_t flag)
4164 if (!fParallelWorld) {
4165 Error(
"SetUseParallelWorldNav",
"No parallel world geometry defined. Use CreateParallelWorld.");
4173 Error(
"SetUseParallelWorldNav",
"The geometry must be closed first");
4177 if (fParallelWorld->CloseGeometry()) fUsePWNav=kTRUE;
4180 TGeoManager::EDefaultUnits TGeoManager::GetDefaultUnits()
4182 return fgDefaultUnits;