/** * @file geoEveViewer.cc * @brief * @author John Watts * @version 0.1 * @date 2015-08-21 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * @brief * Display a gdml file in an eve viewer * * @param TString geoname name of gdml file to display */ class geoEveViewer{ public: /** * @brief * Constructor * * @param TString geoname name of gdml file to display */ geoEveViewer(TString geoname="geometry.gdml"); /** * @brief * Destructor */ virtual ~geoEveViewer(); /** * @brief * Get get the TGeoManager * @return TGeoManager* */ TGeoManager* Get_Manager(){return geo_manager; }; /** * @brief * Get the top volume of the geometry * @return TGeoVolume* */ TGeoVolume* GetTopVolume(){return geo_manager->GetTopVolume(); }; /** * @brief * Print the geometry volume tree */ void Print_Volumes(){geo_manager->GetListOfVolumes()->Print(); }; /** * @brief * Export the geometry volume tree to a root file */ void Export(){ geo_manager->Export(geoname(0,geoname.Length()-5)+".root","manager","vg"); }; /** * @brief * Print the node tree */ void Print_Nodes(TObjArray* vlist=0); /** * @brief * Shoot a vector from a given point in a given direction through the geometry * and optional print the encounter volumes * @param TVector3 pstart Starting point * @param TVector3 dirstart Starting direction (direction cosines) * @param Bool_t verbose kTRUE/print out encountered volumes * @return std::vector A vector of encountered volume names */ std::vector Start_Track(TVector3 pstart= TVector3(0.,0.,0.), TVector3 dirstart= TVector3(0.,0.,1.), Bool_t verbose= kTRUE); /** * @brief * Draw the geometry * @param TString pviewer The type of viewer to use for display * Types are eve, pad, ogl, and x3d */ void Draw(TString pviewer="eve"); /** * @brief * Display the geometry using raytrace */ void Raytrace(); /** * @brief * Shoot a vector from a given point in a given direction through the geometry * and print the encounter volumes * @param TVector3 pstart Starting point * @param TVector3 dirstart Starting direction (direction cosines) */ void Print_Stack(TString filter="*", TVector3 top=TVector3(0.,0.,0.), TVector3 dir=TVector3(0.,0.,1.)); /** * @brief * Shoot a vector from a given point in a given direction through the geometry * @param Char_t ptransparency Set the geometry tranparency 0/clear 100/opake */ void SetTransparency(Char_t ptransparency=50); protected: void DrawTrack(TVirtualGeoTrack *track); TGeoManager* geo_manager; TEveManager* evem; TEveCompound* cmp; TString viewer; Color_t color; Char_t transparency; TString geoname; }; //********************************************************************** geoEveViewer::geoEveViewer(TString pgeoname) : geoname(pgeoname), evem(0), viewer("eve"), color(0), transparency(50) { // TString expand=gSystem->ExpandFileName(geoname); //TGDMLParse::StartGDML does not properly expand file names // geo_manager=TGeoManager::Import(expand); geo_manager=TGeoManager::Import(geoname); geo_manager->SetNsegments(40); TIterator *volumes=geo_manager->GetListOfVolumes()->MakeIterator(); TGeoVolume *volume; while( ( volume=(TGeoVolume*)(volumes->Next()) ) ){ volume->SetLineColor(color); volume->SetTransparency(transparency); color++; color=(color)%216; } color=2; Draw(viewer); }; //********************************************************************** geoEveViewer::~geoEveViewer() { delete geo_manager; }; //********************************************************************** void geoEveViewer::Print_Nodes(TObjArray* vlist) { if ( vlist==0 ) vlist=geo_manager->GetListOfNodes(); vlist->Print(); for(Int_t i=0; iGetEntriesFast(); i++){ TGeoNode* node=(TGeoNode*)vlist->At(i); if( node->GetNdaughters() > 0 )Print_Nodes(node->GetNodes()); //recursize call } }; //********************************************************************** void geoEveViewer::Draw(TString pviewer) { //viewers: eve,pad,ogl,x3d viewer=pviewer; if( viewer != "eve" ){ GetTopVolume()->Draw(viewer); geo_manager->DrawTracks(); return; }else if( !evem ){ // Make Eve Window Manager evem=TEveManager::Create(); TGeoNode *node=geo_manager->GetTopNode(); TEveGeoTopNode* its = new TEveGeoTopNode(geo_manager, node); its->SetVisOption(0); its->UseNodeTrans(); evem->AddGlobalElement(its); cmp = new TEveCompound("Tracks"); cmp->SetMainColor(kGreen); evem->AddElement(cmp); } evem->GetDefaultGLViewer()->UpdateScene(); }; //********************************************************************** void geoEveViewer::DrawTrack(TVirtualGeoTrack *track) { //Process tracks if( viewer != "eve" )return; cmp->OpenCompound(); TEveLine *line=new TEveLine; line->SetMainColor(color); line->SetLineStyle(1); line->SetLineWidth(1); // line->SetMarkerColor(color); line->SetRnrPoints(true); for(Int_t j=0; jGetNpoints(); j++){ Double_t x,y,z,t; track->GetPoint(j, x, y, z, t); line->SetNextPoint(x, y, z); } cmp->AddElement(line); color++; color=(color)%216; cmp->CloseCompound(); evem->Redraw3D(kFALSE); }; //********************************************************************** void geoEveViewer::Raytrace() { GetTopVolume()->Raytrace(); }; //********************************************************************** void geoEveViewer::Print_Stack(TString filter, TVector3 top, TVector3 dir) { TRegexp reg(filter, 1); std::vector pname=Start_Track(top, dir, false); TVirtualGeoTrack *track=geo_manager->GetTrackOfId(0); for(Int_t i=0; iGetNpoints(); i++){ if( !(pname[i](reg) == 1) ){ const Double_t* point=track->GetPoint(i); cout< geoEveViewer::Start_Track(TVector3 pstart, TVector3 dirstart, Bool_t verbose) { TGeoNode *nextnode=geo_manager->InitTrack( pstart.x(), pstart.y(), pstart.z(), dirstart.x(), dirstart.y(), dirstart.z()); Int_t id(0); Int_t track_index=geo_manager->AddTrack(id, 0, 0); TVirtualGeoTrack *track=geo_manager->GetTrack(track_index); Double_t time(0.); track->AddPoint(pstart.x(), pstart.y(), pstart.z(), time); const char *path = geo_manager->GetPath(); TString name=nextnode->GetName(); if(verbose)cout<<" Start Node "< pointname; pointname.push_back(name); while( (nextnode=geo_manager->FindNextBoundaryAndStep()) ){ name=nextnode->GetName(); pointname.push_back(name); TVector3 point=geo_manager->GetCurrentPoint(); track->AddPoint(point.x(), point.y(), point.z(), time); time++; if(verbose){ Double_t step=geo_manager->GetStep(); Double_t safety=geo_manager->GetSafeDistance(); cout<GetMedium()->GetMaterial()->GetName()<GetListOfMaterials()); while (TGeoMaterial *m = (TGeoMaterial *)materials())m->SetTransparency(transparency); Draw(viewer); return; };