I’ve been working through building my own event display with TEve, following closely the tutorials/eve/alice_vsd.C. I can display my geometry just fine in the 3D window as well as the multiview frames, but I am failing to plot any of my actual events.
My data format is atypical to any tutorial example; I’m essentially reading the x,y,z coordinates of LAr “hits” from std::vectors. I’m using TEvePointSet markers to display this information, but when it comes time to drawing them with
gEve->Redraw3D(kFALSE, kTRUE);
I get this error repeated over and over again, followed by intermittent errors with the TGLCamera
Error in <TGLPlane::Normalise>: trying to normalise plane with zero magnitude normal
Error in <TGLPerspectiveCamera::TGLCamera::FrustumCenter()>: frustum planes invalid
I’ve tried all different variations of gEve->Redraw3D() I can think of in my code, and nothing has worked. I should note when I do this the 3D geometry is not displayed at all either. I’ve pasted the relevant portions of my code below; any help would be greatly appreciated!
TEveManager::Create();
TEveGeoShape *gentle_geom = 0;
auto file = TFile::Open("guitools/simple_geom.root");
if (!file) return;
auto gse = (TEveGeoShapeExtract*) file->Get("Gentle");
gentle_geom = TEveGeoShape::ImportShapeExtract(gse, 0);
file->Close();
gEve->AddGlobalElement(gentle_geom);
gMultiView = new MultiView;
gMultiView->f3DView->GetGLViewer()->SetStyle(TGLRnrCtx::kOutline);
gMultiView->SetDepth(-10);
gMultiView->ImportGeomRPhi(gentle_geom);
gMultiView->ImportGeomRhoZ(gentle_geom);
gMultiView->SetDepth(0);
// Final stuff
//=============
gEve->GetViewers()->SwitchColorSet();
gEve->GetDefaultGLViewer()->SetStyle(TGLRnrCtx::kWireFrame);
gEve->GetBrowser()->GetTabRight()->SetTab(1);
MyMainFrame* main = new MyMainFrame(); // takes the place of make_gui(); in the tutorial, it's almost verbatim what exists in that function just with additional buttons/text boxes for my event display GUI.
gEve->AddEvent(new TEveEventManager("Event", "ICARUS CAF Event"));
GetSpectrumSelection(); // Fills the hit position vectors for the LAr hits
gEve->Redraw3D(kTRUE); // Reset camera after the first event has been shown.
LoadHits();
gEve->Redraw3D(kFALSE,kFALSE);
void LoadHits()
{
int c = 0;
for (int sliceID : uniqueSliceIDs) { // loop through all unique slices in a neutrino spill
int target = sliceID;
std::vector<int> indices = findItems(SliceID[spill], target); //finds all the indices in my hits vector for this slice
char slice[5];
sprintf(slice,"%d",target);
auto marker = new TEvePointSet(slice,indices.size()); // create the TEvePointSet object for each slice and reserve the number of points by the number of hits present in the slice
marker->SetOwnIds(kTRUE);
marker->SetElementName(slice);
marker->SetMarkerSize(.5);
marker->SetMarkerStyle(2);
for (auto &e: indices) { // loop through all the hits in the slice
if (SliceID[spill][e] != sliceID) { continue; } // I only want the hits for this slice
marker->SetPoint(e,X[spill][e],Z[spill][e],Y[spill][e]); // set each point in the TEvePointSet for each hit
marker->SetPointId(new TNamed(Form("Point %d", e), ""));
}
marker->SetMainColor(1+c);
marker->IncDenyDestroy();
marker->SetTitle(TString::Format("N=%d", marker->Size()));
gEve->AddElement(marker);
c++;
}
gEve->Redraw3D(kFALSE,kTRUE); // once all the TEvePointSet objects are filled per neutrino spill, plot them in my TEve
}
ROOT Version: v6_22_08d
Platform: linux-gnu
Compiler: linuxx8664gcc