source: trunk/MagicSoft/Mars/mmain/MEventDisplay.cc@ 4715

Last change on this file since 4715 was 4714, checked in by tbretz, 20 years ago
*** empty log message ***
File size: 20.9 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18! Author(s): Thomas Bretz, 10/2001 <mailto:tbretz@astro.uni-wuerzburg.de>
19!
20! Copyright: MAGIC Software Development, 2000-2003
21!
22!
23\* ======================================================================== */
24#include "MEventDisplay.h"
25
26//
27// C-lib
28//
29#include <stdlib.h> // atoi
30
31//
32// root
33//
34#include <TFile.h> // TFile
35#include <TTree.h> // TTree
36#include <TList.h> // TList::Add
37#include <TStyle.h> // gStyle->SetOptStat
38#include <TCanvas.h> // TCanvas::cd
39
40//
41// root GUI
42//
43#include <TGLabel.h> // TGLabel
44#include <TGButton.h> // TGPictureButton
45#include <TG3DLine.h> // TGHorizontal3DLine
46#include <TGTextEntry.h> // TGTextEntry
47#include <TGButtonGroup.h> // TGVButtonGroup
48#include <TRootEmbeddedCanvas.h> // TRootEmbeddedCanvas
49
50//
51// General
52//
53#include "MGList.h" // MGList
54
55#include "MLog.h"
56#include "MLogManip.h"
57
58#include "MParList.h" // MParList::AddToList
59#include "MEvtLoop.h" // MEvtLoop::GetParList
60#include "MTaskList.h" // MTaskList::AddToList
61
62//
63// Tasks
64//
65#include "MReadMarsFile.h" // MReadMarsFile
66#include "MGeomApply.h" // MGeomApply
67#include "MFDataMember.h" // MFDataMember
68#include "MMcPedestalCopy.h" // MMcPedestalCopy
69#include "MMcPedestalNSBAdd.h" // MMcPedestalNSBAdd
70
71#include "MCerPhotAnal2.h" // MCerPhotAnal2
72#include "MImgCleanStd.h" // MImgCleanStd
73#include "MHillasCalc.h" // MHillasCalc
74#include "MHillasSrcCalc.h" // MHillasSrcCalc
75//#include "MBlindPixelCalc.h" // MBlindPixelCalc
76#include "MArrivalTimeCalc.h" // MArrivalTimeCalc
77#include "MFillH.h" // MFillH
78#include "MExtractSignal.h" // MExtractsignal
79#include "MMcCalibrationUpdate.h" // MMcCalibrationUpdate
80#include "MCalibrate.h" // MCalibrate
81#include "MMcTriggerLvl2Calc.h" // MMcTriggerLvl2Calc
82
83//
84// Container
85//
86#include "MHillas.h" // MHillas::Print(const MGeomCam&)
87#include "MHillasExt.h" // MHillasExt::Print(const MGeomCam&)
88#include "MHillasSrc.h" // MHillasSrc::Print(const MGeomCam&)
89#include "MNewImagePar.h" // MNewImagePar::Print(const MGeomCam&)
90#include "MHEvent.h" // MHEvent
91#include "MHCamera.h" // MHCamera
92#include "MRawEvtData.h" // MRawEvtData
93#include "MArrivalTimeCam.h" // MArrivalTimeCam
94#include "MBadPixelsCam.h" // MBadPixelsCam
95#include "MPedPhotCam.h" // MPedPhotCam
96#include "MCalibrationChargeCam.h" // MCalibrationChargeCam
97#include "MMcTriggerLvl2.h" // MMcTriggerLvl2
98
99using namespace std;
100
101ClassImp(MEventDisplay);
102
103// --------------------------------------------------------------------------
104//
105// Constructor.
106//
107MEventDisplay::MEventDisplay(const char *fname, const char *pname, const char *cname) : MStatusDisplay()
108{
109 //
110 // Setup Task list for hillas calculation
111 //
112 SetupTaskList("Events", fname, pname, cname);
113
114 //
115 // Add MEventDisplay GUI elements to the display
116 //
117 AddUserFrame(fname);
118
119 //
120 // Show new part of the window, resize to correct aspect ratio
121 //
122 // FIXME: This should be done by MStatusDisplay automatically
123 Resize(GetWidth(), GetHeight() + fUserFrame->GetDefaultHeight());
124 SetWindowName("Event Display");
125 MapSubwindows();
126
127 //
128 // Readin first event and display it
129 //
130 ReadFirstEvent();
131}
132
133// --------------------------------------------------------------------------
134//
135// Destructor: PostProcess eventloop, delete eventloop with all containers
136//
137MEventDisplay::~MEventDisplay()
138{
139 fEvtLoop->PostProcess();
140 delete fEvtLoop;
141}
142
143Int_t MEventDisplay::GetFileType(const char *tree, const char *fname) const
144{
145 TFile f(fname, "READ");
146 TTree *t = (TTree*)f.Get(tree);
147 if (!t)
148 return -1;
149
150 if (t->FindBranch("MCerPhotEvt."))
151 return 1;
152
153 if (t->FindBranch("MRawEvtData."))
154 return 2;
155
156 return -2;
157}
158
159// --------------------------------------------------------------------------
160//
161// Setup Task and parameter list for hillas calculation,
162// preprocess tasks and read in first event (process)
163//
164void MEventDisplay::SetupTaskList(const char *tname, const char *fname,
165 const char *pname, const char *cname)
166{
167 MCalibrationChargeCam *ccam=0;
168 MPedPhotCam *pcam=0;
169
170 MBadPixelsCam *badpix = new MBadPixelsCam;
171
172 const Int_t type = GetFileType(tname, fname);
173 switch (type)
174 {
175 case 1: gLog << all << "Calibrated Data File detected..." << endl; break;
176 case 2: gLog << all << "Raw Data File detected..." << endl; break;
177 case -2: gLog << err << "File type unknown... abort." << endl; return;
178 case -1: gLog << err << "Tree " << tname << " not found... abort." << endl; return;
179 }
180
181 if (type==2)
182 {
183 TFile file(pname, "READ");
184 if (!file.IsZombie())
185 pcam = new MPedPhotCam;
186 if (pcam)
187 {
188 if (pcam->Read()<=0)
189 {
190 delete pcam;
191 pcam = NULL;
192 }
193
194 if (file.FindKey("MBadPixelsCam"))
195 {
196 MBadPixelsCam bad;
197 if (bad.Read()>0)
198 badpix->Merge(bad);
199 }
200 }
201 file.Close();
202 file.Open(cname, "READ");
203 if (!file.IsZombie())
204 ccam = new MCalibrationChargeCam;
205 if (ccam)
206 {
207 if (ccam->Read()<=0)
208 {
209 delete ccam;
210 ccam = NULL;
211 }
212
213 if (file.FindKey("MBadPixelsCam"))
214 {
215 MBadPixelsCam bad;
216 if (bad.Read()>0)
217 badpix->Merge(bad);
218 }
219 }
220 file.Close();
221 }
222
223 //
224 // Setup an empty job, with a reader task only.
225 // All tasks and parameter containers are deleted automatically
226 // (via SetOwner())
227 //
228 MTaskList *tlist = new MTaskList;
229 tlist->SetOwner();
230
231 MReadMarsFile *read = new MReadMarsFile(tname, fname);
232 read->DisableAutoScheme();
233 tlist->AddToList(read);
234
235 MGeomApply *apl = new MGeomApply;
236 tlist->AddToList(apl);
237
238 MParList *plist = new MParList;
239 plist->SetOwner();
240 plist->AddToList(tlist);
241 plist->AddToList(badpix);
242 if (pcam)
243 plist->AddToList(pcam);
244 if (ccam)
245 plist->AddToList(ccam);
246
247 fEvtLoop = new MEvtLoop;
248 fEvtLoop->SetOwner();
249 fEvtLoop->SetParList(plist);
250
251 MHEvent *evt01 = new MHEvent(MHEvent::kEvtSignalRaw);
252 MHEvent *evt02 = new MHEvent(MHEvent::kEvtSignalRaw);
253 MHEvent *evt03 = new MHEvent(MHEvent::kEvtPedestal);
254 MHEvent *evt04 = new MHEvent(MHEvent::kEvtPedestalRMS);
255 MHEvent *evt05 = new MHEvent(MHEvent::kEvtRelativeSignal);
256 MHEvent *evt06 = new MHEvent(MHEvent::kEvtCleaningLevels);
257 MHEvent *evt07 = new MHEvent(MHEvent::kEvtIdxMax);
258 MHEvent *evt08 = new MHEvent(MHEvent::kEvtArrTime);
259 MHEvent *evt09 = new MHEvent(MHEvent::kEvtTrigPix);
260 MHEvent *evt10 = new MHEvent(MHEvent::kEvtIslandIndex);
261
262 evt01->SetName("Signal");
263 evt02->SetName("Cleaned");
264 evt03->SetName("Pedestal");
265 evt04->SetName("PedRMS");
266 evt05->SetName("Signal/PedRMS");
267 evt06->SetName("CleanLevels");
268 evt07->SetName("Max Slice Idx");
269 evt08->SetName("Arrival Time");
270 evt09->SetName("Trigger");
271 evt10->SetName("Islands");
272
273 // This makes sure, that the containers are deleted...
274 plist->AddToList(evt01);
275 plist->AddToList(evt02);
276 plist->AddToList(evt03);
277 plist->AddToList(evt04);
278 plist->AddToList(evt05);
279 plist->AddToList(evt06);
280 plist->AddToList(evt07);
281 plist->AddToList(evt08);
282 plist->AddToList(evt09);
283 plist->AddToList(evt10);
284
285 MCerPhotAnal2 *nanal = new MCerPhotAnal2;
286 MFillH *fill01 = new MFillH(evt01, "MCerPhotEvt", "MFillH01");
287 MImgCleanStd *clean = new MImgCleanStd;
288 MFillH *fill02 = new MFillH(evt02, "MCerPhotEvt", "MFillH02");
289 MFillH *fill03 = new MFillH(evt03, "MPedPhotCam", "MFillH03");
290 MFillH *fill04 = new MFillH(evt04, "MPedPhotCam", "MFillH04");
291 MFillH *fill05 = new MFillH(evt05, "MCameraData", "MFillH05");
292 MFillH *fill06 = new MFillH(evt06, "MCameraData", "MFillH06");
293// MBlindPixelCalc *blind = new MBlindPixelCalc;
294 MHillasCalc *hcalc = new MHillasCalc;
295 MHillasSrcCalc *scalc = new MHillasSrcCalc;
296 MMcTriggerLvl2Calc *trcal = new MMcTriggerLvl2Calc;
297 MFillH *fill09 = new MFillH(evt09, "MMcTriggerLvl2", "MFillH09");
298 MFillH *fill10 = new MFillH(evt10, "MCerPhotEvt", "MFillH10");
299
300 // If no pedestal or no calibration file is availble
301 if (type==2)
302 {
303 if (!pcam || !ccam)
304 {
305 MFilter *f1=new MFDataMember("MRawRunHeader.fRunType", '>', 255.5);
306 MFilter *f2=new MFDataMember("MRawRunHeader.fRunType", '<', 255.5);
307 f1->SetName("MFMonteCarlo");
308 f2->SetName("MFRealData");
309
310 MMcPedestalCopy *pcopy = new MMcPedestalCopy;
311 MMcPedestalNSBAdd *pdnsb = new MMcPedestalNSBAdd;
312
313 MExtractSignal* extra = new MExtractSignal();
314 extra->SetRange(0, 14, 0, 14);
315 extra->SetSaturationLimit(240);
316
317 MMcCalibrationUpdate* mcupd = new MMcCalibrationUpdate;
318 mcupd->SetOuterPixelsGainScaling(kFALSE);
319
320 MCalibrate* mccal = new MCalibrate;
321 mccal->SetCalibrationMode(MCalibrate::kFfactor);
322
323 // MC
324 extra->SetFilter(f1);
325 mcupd->SetFilter(f1);
326 mccal->SetFilter(f1);
327 trcal->SetFilter(f1);
328 //fill09->SetFilter(f1);
329
330 // Data
331 nanal->SetFilter(f2);
332
333 // TaskList
334 tlist->AddToList(f1);
335 tlist->AddToList(f2);
336 tlist->AddToList(pcopy);
337 tlist->AddToList(pdnsb);
338
339 tlist->AddToList(extra);
340 tlist->AddToList(mcupd);
341 tlist->AddToList(mccal);
342
343
344 tlist->AddToList(nanal);
345 }
346 else
347 {
348 MCalibrate* calib = new MCalibrate;
349 tlist->AddToList(calib);
350 }
351 }
352
353 tlist->AddToList(fill01);
354 tlist->AddToList(clean);
355 tlist->AddToList(fill02);
356 tlist->AddToList(fill03);
357 tlist->AddToList(fill04);
358 tlist->AddToList(fill05);
359 tlist->AddToList(fill06);
360// tlist->AddToList(blind);
361 tlist->AddToList(hcalc);
362 tlist->AddToList(scalc);
363 tlist->AddToList(fill10);
364
365 if ((!pcam || !ccam) && type==2)
366 {
367 MArrivalTimeCalc *tcalc = new MArrivalTimeCalc;
368 MFillH *fill07 = new MFillH(evt07, "MRawEvtData", "MFillH7");
369 MFillH *fill08 = new MFillH(evt08, "MArrivalTimeCam", "MFillH8");
370 tlist->AddToList(tcalc);
371 tlist->AddToList(fill07);
372 tlist->AddToList(fill08);
373
374 tlist->AddToList(trcal);
375 tlist->AddToList(fill09);
376 }
377
378 if (type==1)
379 {
380 MFillH *fill08 = new MFillH(evt08, "MArrivalTime", "MFillH8");
381 tlist->AddToList(fill08);
382 }
383
384 //
385 // Now distribute Display to all tasks
386 //
387 tlist->SetDisplay(this);
388}
389
390// --------------------------------------------------------------------------
391//
392// Add the top part of the frame: This is filename and treename display
393//
394void MEventDisplay::AddTopFramePart1(TGCompositeFrame *frame,
395 const char *filename,
396 const char *treename)
397{
398 //
399 // --- the top1 part of the window ---
400 //
401 TGHorizontalFrame *top1 = new TGHorizontalFrame(frame, 1, 1);
402 fList->Add(top1);
403
404 //
405 // create gui elements
406 //
407 TGLabel *file = new TGLabel(top1, new TGString(Form("%s#%s", filename, treename)));
408 fList->Add(file);
409
410 //
411 // layout and add gui elements in/to frame
412 //
413 TGLayoutHints *laystd = new TGLayoutHints(kLHintsCenterX, 5, 5);
414 fList->Add(laystd);
415
416 top1->AddFrame(file, laystd);
417
418 //
419 // --- the top1 part of the window ---
420 //
421 TGHorizontalFrame *top2 = new TGHorizontalFrame(frame, 1, 1);
422 fList->Add(top2);
423
424 //
425 // layout and add frames
426 //
427 TGLayoutHints *laytop1 = new TGLayoutHints(kLHintsCenterX, 5, 5, 5);
428 fList->Add(laytop1);
429 frame->AddFrame(top1, laytop1);
430 frame->AddFrame(top2, laytop1);
431}
432
433// --------------------------------------------------------------------------
434//
435// Add the second part of the top frame: This are the event number controls
436//
437void MEventDisplay::AddTopFramePart2(TGCompositeFrame *frame)
438{
439 //
440 // --- the top2 part of the window ---
441 //
442 TGHorizontalFrame *top2 = new TGHorizontalFrame(frame, 1, 1);
443 fList->Add(top2);
444
445 //
446 // Create the gui elements
447 //
448 TGTextButton *prevevt = new TGTextButton(top2, " << ", kEvtPrev);
449 prevevt->Associate(this);
450
451 TGLabel *evtnr = new TGLabel(top2, new TGString("Event:"));
452
453 TGTextEntry *entry=new TGTextEntry(top2, new TGTextBuffer(100), kEvtNumber);
454 entry->Resize(60, entry->GetDefaultHeight());
455 entry->Associate(this);
456
457 fNumOfEvts = new TGLabel(top2, "of .");
458
459 TGTextButton *nextevt = new TGTextButton (top2, " >> ", kEvtNext);
460 nextevt->Associate(this);
461
462 //
463 // Add gui elements to 'atotodel'
464 //
465 fList->Add(prevevt);
466 fList->Add(evtnr);
467 fList->Add(entry);
468 fList->Add(fNumOfEvts);
469 fList->Add(nextevt);
470
471 //
472 // add the gui elements to the frame
473 //
474 TGLayoutHints *laystd = new TGLayoutHints(kLHintsLeft|kLHintsCenterY, 5, 5);
475 fList->Add(laystd);
476
477 top2->AddFrame(prevevt, laystd);
478 top2->AddFrame(evtnr, laystd);
479 top2->AddFrame(entry, laystd);
480 top2->AddFrame(fNumOfEvts, laystd);
481 top2->AddFrame(nextevt, laystd);
482
483 TGLayoutHints *laystd2 = new TGLayoutHints(kLHintsCenterX, 5, 5, 5, 5);
484 fList->Add(laystd2);
485 frame->AddFrame(top2, laystd2);
486
487 //
488 // Add trailing line...
489 //
490 TGHorizontal3DLine *line = new TGHorizontal3DLine(frame);
491 TGLayoutHints *layline = new TGLayoutHints(kLHintsExpandX);
492 fList->Add(line);
493 fList->Add(layline);
494 frame->AddFrame(line, layline);
495}
496
497// --------------------------------------------------------------------------
498//
499// Add the user frame part of the display
500//
501void MEventDisplay::AddUserFrame(const char* filename)
502{
503 fUserFrame->ChangeOptions(kHorizontalFrame);
504
505 TGCompositeFrame *vf1 = new TGVerticalFrame(fUserFrame, 1, 1);
506 TGCompositeFrame *vf2 = new TGVerticalFrame(fUserFrame, 1, 1);
507
508 AddTopFramePart1(vf1, filename, "Events");
509 AddTopFramePart2(vf1);
510
511 // create root embedded canvas and add it to the tab
512 TRootEmbeddedCanvas *ec = new TRootEmbeddedCanvas("Slices", vf2, vf1->GetDefaultHeight()*3/2, vf1->GetDefaultHeight(), 0);
513 vf2->AddFrame(ec);
514 fList->Add(ec);
515
516 // set background and border mode of the canvas
517 fCanvas = ec->GetCanvas();
518 fCanvas->SetBorderMode(0);
519 gROOT->GetListOfCanvases()->Add(fCanvas);
520 //fCanvas->SetBorderSize(1);
521 //fCanvas->SetBit(kNoContextMenu);
522 //fCanvas->SetFillColor(16);
523
524 TGLayoutHints *lay = new TGLayoutHints(kLHintsExpandX);
525 fUserFrame->AddFrame(vf1, lay);
526 fUserFrame->AddFrame(vf2);
527}
528
529// --------------------------------------------------------------------------
530//
531// Checks if the event number is valid, and if so reads the new event
532// and updates the display
533//
534void MEventDisplay::ReadinEvent(Int_t dir)
535{
536 MParList *plist = (MParList*) fEvtLoop->GetParList();
537 MTaskList *tlist = (MTaskList*) fEvtLoop->GetTaskList();
538 MGeomCam *geom = (MGeomCam*) plist->FindObject("MGeomCam");
539 MRawEvtData *raw = (MRawEvtData*)plist->FindObject("MRawEvtData");
540
541 //
542 // Read first event.
543 //
544 MReadTree *reader = (MReadTree*)fEvtLoop->FindTask("MRead");
545
546 const Int_t num = reader->GetNumEntry();
547
548 do
549 {
550 if (dir<0 && !reader->DecEventNum())
551 {
552 reader->SetEventNum(num);
553 return;
554 }
555 if (dir>0 && !reader->IncEventNum())
556 {
557 reader->SetEventNum(num);
558 return;
559 }
560
561 if (!tlist->Process())
562 return;
563
564 reader->DecEventNum();
565
566 } while (raw && raw->GetNumPixels()<1 && dir!=0);
567
568 //
569 // Cleare the 'FADC canvas'
570 //
571 fCanvas->Clear();
572 fCanvas->Modified();
573 fCanvas->Update();
574
575 //
576 // Print parameters
577 //
578 ((MHillas*) plist->FindObject("MHillas"))->Print(*geom);
579 ((MHillasExt*) plist->FindObject("MHillasExt"))->Print(*geom);
580 ((MHillasSrc*) plist->FindObject("MHillasSrc"))->Print(*geom);
581 ((MNewImagePar*)plist->FindObject("MNewImagePar"))->Print(*geom);
582
583 //
584 // UpdateDisplay
585 //
586 gStyle->SetOptStat(1101);
587 Update();
588
589 TGTextEntry *entry = (TGTextEntry*)fList->FindWidget(kEvtNumber);
590 entry->SetText(Form("%d", reader->GetNumEntry()+1));
591}
592
593// --------------------------------------------------------------------------
594//
595// Read first event to get display booted
596//
597void MEventDisplay::ReadFirstEvent()
598{
599 if (!fEvtLoop->PreProcess())
600 return;
601
602 //
603 // Get parlist
604 //
605 MParList *plist = (MParList*)fEvtLoop->GetParList();
606
607 //
608 // Add Geometry tab
609 //
610 AddGeometryTabs();
611
612 //
613 // Now read event...
614 //
615 ReadinEvent();
616
617 MReadTree *reader = (MReadTree*)fEvtLoop->FindTask("MRead");
618 TGString *txt = new TGString(Form("of %d", reader->GetEntries()));
619 fNumOfEvts->SetText(txt);
620
621 //
622 // Draw ellipse on top of all pads
623 //
624 TObject *hillas = plist->FindObject("MHillas");
625 for (int i=1; i<7;i++)
626 {
627 TCanvas *c = GetCanvas(i);
628 c->GetPad(1)->cd(1);
629 hillas->Draw();
630 }
631}
632
633// --------------------------------------------------------------------------
634//
635// Adds the geometry tab
636//
637void MEventDisplay::AddGeometryTabs()
638{
639 MGeomCam *geom = (MGeomCam*)fEvtLoop->GetParList()->FindObject("MGeomCam");
640 if (!geom)
641 return;
642
643 TCanvas &c1=AddTab("Geometry");
644
645 MHCamera *cam = new MHCamera(*geom);
646 cam->SetBit(TH1::kNoStats|MHCamera::kNoLegend|kCanDelete);
647 cam->Draw("pixelindex");
648
649 c1.Modified();
650 c1.Update();
651
652 TCanvas &c2=AddTab("Sectors");
653
654 cam = new MHCamera(*geom);
655 cam->SetBit(TH1::kNoStats|MHCamera::kNoLegend|kCanDelete);
656 cam->Draw("sectorindex");
657
658 c2.Modified();
659 c2.Update();
660}
661
662// --------------------------------------------------------------------------
663//
664// ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
665//
666// Processes information from all GUI items.
667// Selecting an item usually generates an event with 4 parameters.
668// The first two are packed into msg (first and second bytes).
669// The other two are parm1 and parm2.
670//
671Bool_t MEventDisplay::ProcessMessage(Long_t msg, Long_t mp1, Long_t mp2)
672{
673 switch (GET_MSG(msg))
674 {
675 case kC_TEXTENTRY:
676 switch(GET_SUBMSG(msg))
677 {
678 case kTE_ENTER:
679 switch(GET_SUBMSG(msg))
680 {
681 case kTE_ENTER:
682 {
683 TGTextEntry *entry = (TGTextEntry*)fList->FindWidget(kEvtNumber);
684 MReadTree *reader = (MReadTree*)fEvtLoop->FindTask("MRead");
685 if (reader->SetEventNum(atoi(entry->GetText())-1))
686 ReadinEvent();
687 }
688 return kTRUE;
689 }
690 return kTRUE;
691 }
692 break;
693
694 case kC_COMMAND:
695 switch (GET_SUBMSG(msg))
696 {
697 case kCM_TAB:
698 {
699 //
700 // Set name for 'FADC canvas'. The name is the anchor for MHCamera.
701 // and clear the canvas
702 TCanvas *c = GetCanvas(mp1);
703 if (!c)
704 break;
705 MHEvent *o = (MHEvent*)fEvtLoop->GetParList()->FindObject(c->GetName());
706 if (!o)
707 break;
708 fCanvas->SetName(Form("%p;%p;PixelContent", o->GetHist(), c->GetPad(1)));
709 }
710 break;
711
712 case kCM_BUTTON:
713 switch (mp1)
714 {
715 case kEvtPrev:
716 ReadinEvent(-1);
717 return kTRUE;
718
719 case kEvtNext:
720 ReadinEvent(+1);
721 return kTRUE;
722 }
723 return kTRUE;
724 }
725 break;
726 }
727
728 return MStatusDisplay::ProcessMessage(msg, mp1, mp2);
729}
Note: See TracBrowser for help on using the repository browser.