#include #include #include #include #include #include #include #include #include class MyMainFrame { RQ_OBJECT("MyMainFrame") private: TGMainFrame *fMain; TRootEmbeddedCanvas *fEcanvas; TGNumberEntry *fNumber; TGButtonGroup *fButtonGroup; TGRadioButton *fR[7]; int fEntry; bool fLoad; TH3F* h_xyz; public: MyMainFrame(const TGWindow *p,UInt_t w,UInt_t h); virtual ~MyMainFrame(); void Load(); void Draw(); void DoSetEntry(); }; MyMainFrame::MyMainFrame(const TGWindow *p,UInt_t w,UInt_t h): fEntry = 0,fLoad = false { // Create a main frame fMain = new TGMainFrame(p,w,h); // Create canvas widget //Declare auxiliar horizontal frame, vertical frames an embedded canvas. fHf = new TGHorizontalFrame(fMain, 1200, 800); fV1 = new TGVerticalFrame(fHf, 1150, 800); fV2 = new TGVerticalFrame(fHf, 50, 800); fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fV1,1150,800); fV1->AddFrame(fEcanvas, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,10,10,10,1)); //Add TGNumberEntry to select which entry to be drawn. fNumber = new TGNumberEntry(fV2, 0, 9,999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, 150); fNumber->Connect("ValueSet(Long_t)", "MyMainFrame", this, "DoSetEntry()"); (fNumber->GetNumberEntry())->Connect("ReturnPressed()", "MyMainFrame", this, "DoSetEntry()"); //Label for the TGNumberEntry TGLabel *label = new TGLabel(fV2, "Entry"); fV2->AddFrame(label, new TGLayoutHints(kLHintsLeft|kLHintsTop, 5, 5, 3, 4)); fV2->AddFrame(fNumber,new TGLayoutHints(kLHintsCenterX|kLHintsTop,5,5,3,4)); fButtonGroup = new TGButtonGroup(fV2,"Draw mode",kVerticalFrame); fR[0] = new TGRadioButton(fButtonGroup,new TGHotString("3D")); fR[1] = new TGRadioButton(fButtonGroup,new TGHotString("XY Projection")); fR[2] = new TGRadioButton(fButtonGroup,new TGHotString("XZ Projection")); fR[3] = new TGRadioButton(fButtonGroup,new TGHotString("YZ Projection")); fR[4] = new TGRadioButton(fButtonGroup,new TGHotString("X Projection")); fR[5] = new TGRadioButton(fButtonGroup,new TGHotString("Y Projection")); fR[6] = new TGRadioButton(fButtonGroup,new TGHotString("Z Projection")); for (unsigned int i = 0; i < 7; ++i) { fR[i]->Connect("Clicked()", "MyMainFrame", this, "Draw()"); } //fR[4]->Connect("Pressed()", "MyMainFrame", this, "DoDraw()"); fR[0]->SetState(kButtonDown); fV2->AddFrame(fButtonGroup, new TGLayoutHints(kLHintsCenterX|kLHintsTop, 1, 1, 1, 1)); //Add horizontal from for Draw and Exit buttons TGHorizontalFrame *hframe = new TGHorizontalFrame(fV2,50,40); TGTextButton *draw = new TGTextButton(hframe,"&Load"); draw->Connect("Clicked()","MyMainFrame",this,"Load()"); hframe->AddFrame(draw, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); TGTextButton *exit = new TGTextButton(hframe,"&Exit", "gApplication->Terminate(0)"); hframe->AddFrame(exit, new TGLayoutHints(kLHintsCenterX,5,5,3,4)); fV2->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX|kLHintsTop,2,2,2,2)); //Add vertical frames to main frame fHf->AddFrame(fV1,new TGLayoutHints(kLHintsExpandX|kLHintsExpandY)); fHf->AddFrame(fV2,new TGLayoutHints(kLHintsRight|kLHintsExpandY)); // Add horizontal auxiliar frame to the main frame. fMain->AddFrame(fHf, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,2,2,2,2)); // Set a name to the main frame fMain->SetWindowName("Track visualization 1.0"); // Map all subwindows of main frame fMain->MapSubwindows(); // Initialize the layout algorithm fMain->Resize(fMain->GetDefaultSize()); // Map main frame fMain->MapWindow(); } void MyMainFrame::Load() { //Load file and tree TFile f("SiPM_photoelectric.evet.root"); TTree* tree = (TTree*)f.Get("EventTree"); //Get slice width TFolder* b; TBranch *bra2 = tree->GetBranch("fRawAux"); bra2->SetAddress(&b); bra2->GetEntry(fEntry); TFolder* fold_aux = dynamic_cast(b->FindObjectAny("S2PMapRebinFolder")); TClonesArray* carray_aux = dynamic_cast(fold_aux->FindObjectAny("recobase::PMaps")); recobase::PMap* pmap = (recobase::PMap*)carray_aux->ConstructedAt(0); double width = pmap->WidthOfTimeSlices(); delete b; //Load RTrack folder TFolder* a; TBranch *bra1 = tree->GetBranch("fReco"); bra1->SetAddress(&a); bra1->GetEntry(fEntry); TFolder* fold = dynamic_cast(a->FindObjectAny("RTrackFolder")); TClonesArray* carray = dynamic_cast(fold->FindObjectAny("recobase::RTracks")); int nBinsZ = (int)((300)/width); double nBinsX = 40; double nBinsY = 40; std::cout << "Check before create TH3" << std::endl; h_xyz = new TH3F("hxyz","XYZ position", nBinsZ, 0, 300, nBinsX,-80,80,nBinsY,-80,80); std::cout << "Check after create TH3" << std::endl; h_xyz->GetXaxis()->SetTitle("Z (mm)"); h_xyz->GetXaxis()->SetTitleOffset(1.5); h_xyz->GetYaxis()->SetTitle("X (mm)"); h_xyz->GetYaxis()->SetTitleOffset(1.7); h_xyz->GetZaxis()->SetTitle("Y (mm)"); h_xyz->GetZaxis()->SetTitleOffset(1.5); for(j = 0; j < carray->GetSize(); j++) { //Get RTracks recobase::RTrack* rtrack = (recobase::RTrack*)carray->ConstructedAt(j); std::cout << "RTrack Energy: " << rtrack->E() << std::endl; //Get Rslices std::vector RSliceCollection; RSliceCollection = rtrack->GetRSlices(); for(k = 0; k rcluster; rcluster = RSliceCollection[k].GetClusters(); for(k2 = 0; k2Fill(z,x,y,area); std::cout << "entries 1 : " << h_xyz->GetEntries() << std::endl;; } } } /*TList * const lof = h_xyz->GetListOfFunctions(); if (!lof) { std::cout<<"List of functions is null\n"; return; } lof->Add(new TF1("TransferFunction", transfer_function, 0., 1000., 0));*/ delete rtrack; delete tree; fLoad = true; std::cout << "entries 2 : " << h_xyz->GetEntries() << std::endl;; //Draw(); std::cout << "End" << std::endl; } void MyMainFrame::Draw() { if(fLoad) { std::cout << "entries 3: " << h_xyz->GetEntries() << std::endl;; if(fR[0]->IsOn()){ h_xyz->GetYaxis()->SetTitleOffset(1.7); h_xyz->Draw("glcolz"); } if(fR[1]->IsOn()) { h_xyz->Project3D("zy")->SetStats(false); h_xyz->Project3D("zy")->SetTitle("XY Projection"); h_xyz->GetYaxis()->SetTitleOffset(1.5); h_xyz->Project3D("zy")->Draw("colz"); } if(fR[2]->IsOn()) { h_xyz->Project3D("yx")->SetStats(false); h_xyz->Project3D("yx")->SetTitle("XZ Projection"); h_xyz->GetYaxis()->SetTitleOffset(1.5); h_xyz->Project3D("yx")->Draw("colz"); } if(fR[3]->IsOn()) { h_xyz->Project3D("zx")->SetStats(false); h_xyz->Project3D("zx")->SetTitle("YZ Projection"); h_xyz->Project3D("zx")->Draw("colz"); } if(fR[4]->IsOn()) { h_xyz->Project3D("y")->SetStats(false); h_xyz->Project3D("y")->SetTitle("X Projection"); h_xyz->GetYaxis()->SetTitleOffset(1.5); h_xyz->Project3D("y")->Draw(); } if(fR[5]->IsOn()) { h_xyz->Project3D("z")->SetStats(false); h_xyz->Project3D("z")->SetTitle("Y Projection"); h_xyz->Project3D("z")->Draw(); } if(fR[6]->IsOn()) { h_xyz->Project3D("x")->SetStats(false); h_xyz->Project3D("x")->SetTitle("Z Projection"); h_xyz->Project3D("x")->Draw(); } TCanvas *fCanvas = fEcanvas->GetCanvas(); fCanvas->cd(); fCanvas->Update(); // std::cout << "Entry number: " << fEntry << std::endl; } } void MyMainFrame::DoSetEntry() { //Set fEntry to number in the TGNumberEntry Widget fEntry = fNumber->GetNumberEntry()->GetIntNumber(); } MyMainFrame::~MyMainFrame() { // Clean up used widgets: frames, buttons, layouthints fMain->Cleanup(); delete fMain; delete h_xyz; delete fEcanvas; delete fNumber; delete fButtonGroup; for (unsigned int i = 0; i < 7; ++i) { delete fR[i]; } } Double_t transfer_function(Double_t *x, Double_t * /*param*/) { //This function is required to suppress //boxes for empty bins - make them transparent. if (x) return *x > 0 ? 1. : 0.; return 0.; } Int_t GetMaxEntry() { } void visualizationV1_5() { // Load libraries and popup the GUI... gSystem->Load("/Users/ansimez/Software/nextoffline/releases/dev/lib/Darwin-GCC/libRecoBaseTemp.dylib"); gStyle->SetCanvasPreferGL(kTRUE); new MyMainFrame(gClient->GetRoot(),1200,800); }