43 #define kMemValuePos 8
44 #define kMemValuePosMaster 8
45 #define kEventNumberPos 13
47 ClassImp(TProofProgressMemoryPlot);
52 TProofProgressMemoryPlot::TProofProgressMemoryPlot(TProofProgressDialog *d,
54 : TGTransientFrame(gClient->GetRoot(),
55 gClient->GetRoot(), w, h)
65 SetCleanup(kDeepCleanup);
66 TGHorizontalFrame *htotal =
new TGHorizontalFrame(
this, w, h);
68 TGVerticalFrame *vworkers =
new TGVerticalFrame(htotal);
69 TGLabel *label1 =
new TGLabel(vworkers,
"Choose workers:");
72 fWorkers = BuildLogList(vworkers);
73 fWorkers->Resize(102,52);
74 fWorkers->SetMultipleSelections(kTRUE);
77 TGPopupMenu *pm =
new TGPopupMenu(gClient->GetRoot());
78 pm->AddEntry(
"Select All", 0);
79 pm->AddEntry(
"Clear All", 1);
81 fAllWorkers =
new TGSplitButton(vworkers,
new TGHotString(
"Select ... "), pm);
82 fAllWorkers->Connect(
"ItemClicked(Int_t)",
"TProofProgressMemoryPlot",
this,
84 fAllWorkers->SetSplit(kFALSE);
87 fWorkers->Select(0, kTRUE);
88 fWorkers->Select(1, kTRUE);
90 fPlot =
new TGTextButton(vworkers,
"Plot");
91 fPlot->Connect(
"Clicked()",
"TProofProgressMemoryPlot",
this,
"DoPlot()");
92 vworkers->AddFrame(label1,
new TGLayoutHints(kLHintsLeft | kLHintsTop, 7, 2, 5, 2));
93 vworkers->AddFrame(fAllWorkers,
new TGLayoutHints(kLHintsExpandX | kLHintsTop, 5, 2, 2, 2));
94 vworkers->AddFrame(fWorkers,
new TGLayoutHints(kLHintsExpandX | kLHintsTop | kLHintsExpandY, 2, 2, 5, 2));
95 vworkers->AddFrame(fPlot,
new TGLayoutHints(kLHintsExpandX | kLHintsBottom, 2, 2, 2, 2));
96 htotal->AddFrame(vworkers,
new TGLayoutHints(kLHintsCenterY | kLHintsLeft | kLHintsExpandY, 2, 2, 2, 2));
98 fWorkersPlot =
new TRootEmbeddedCanvas(
"WorkersCanvas", htotal, 300, 300);
99 htotal->AddFrame(fWorkersPlot,
new TGLayoutHints(kLHintsCenterY | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
100 fMasterPlot =
new TRootEmbeddedCanvas(
"MasterCanvas", htotal, 300, 300);
101 htotal->AddFrame(fMasterPlot,
new TGLayoutHints(kLHintsCenterY | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 2, 2, 2 ,2));
103 AddFrame(htotal,
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
105 title.Form(
"PROOF Memory Consumption: %s", (fDialog->fProof ?
106 fDialog->fProof->GetMaster() :
"<dummy>"));
107 SetWindowName(title);
119 TProofProgressMemoryPlot::~TProofProgressMemoryPlot()
135 fDialog->fMemWindow = 0;
143 TGListBox* TProofProgressMemoryPlot::BuildLogList(TGFrame *parent)
145 TGListBox *c =
new TGListBox(parent);
146 c->AddEntry(
"average", 0);
148 SafeDelete(fProofLog);
151 TProofMgr *mgr = TProof::Mgr(fDialog->fSessionUrl.Data());
152 if (mgr) fProofLog = mgr->GetSessionLogs(0, 0,
"Svc.*Memory");
153 if (fDialog->fStatus==TProofProgressDialog::kRunning) {
160 TList *elem = fProofLog->GetListOfLogs();
162 TProofLogElem *pe = 0;
166 while ((pe=(TProofLogElem*)next())){
167 TUrl url(pe->GetTitle());
168 buf = TString::Format(
"%s %s", pe->GetName(), url.GetHost());
169 c->AddEntry(buf.Data(), is);
179 void TProofProgressMemoryPlot::Clear(Option_t *)
182 fWorkersPlot->GetCanvas()->Clear();
184 fMasterPlot->GetCanvas()->Clear();
190 void TProofProgressMemoryPlot::DoPlot()
194 if (!fProofLog || !fFullLogs ||
195 (fDialog && fDialog->fStatus == TProofProgressDialog::kRunning)){
197 SafeDelete(fProofLog);
199 TProofMgr *mgr = TProof::Mgr(fDialog->fSessionUrl.Data());
200 if (mgr) fProofLog = mgr->GetSessionLogs(0, 0,
"Svc.*Memory");
201 if (fDialog->fStatus==TProofProgressDialog::kRunning) {
207 Error(
"DoPlot",
"TProofProgessDialog instance undefined - protocol error?");
214 Error(
"DoPlot",
"could not get a valid instance of TProofLog");
220 TList *elem = fProofLog->GetListOfLogs();
221 if (!elem) {Error(
"DoPlot",
"No log elements\n");
return;}
223 TProofLogElem *ple=0;
229 TList *selected =
new TList;
230 fWorkers->GetSelectedEntries(selected);
231 TIter nextworker(selected);
232 TGTextLBEntry *selworker;
249 while ((selworker=(TGTextLBEntry*)nextworker())){
251 snprintf(name,
sizeof(name)-1,
"%s", selworker->GetText()->GetString());
253 token = strtok(name,
" ");
254 if (token && !strcmp(token,
"average")) {
255 gr = DoAveragePlot(max, min);
256 if (gr && gr->GetN()>0){
258 fWPlot =
new TMultiGraph();
261 legw =
new TLegend(0.1, 0.7, 0.4, 0.9);
262 legw->SetHeader(
"Workers");
264 gr->SetMarkerColor(1);
265 gr->SetMarkerStyle(2);
266 gr->SetMarkerSize(1);
269 fWPlot->Add(gr,
"l");
270 legw->AddEntry(gr, token,
"l");
272 TProofLogElem *pltemp = (TProofLogElem*)elem->At(min+1);
273 gr = DoWorkerPlot(pltemp);
274 if (gr && gr->GetN()>0){
276 fWPlot =
new TMultiGraph();
279 legw =
new TLegend(0.1, 0.7, 0.4, 0.9);
280 legw->SetHeader(
"Workers");
285 fWPlot->Add(gr,
"l");
286 legw->AddEntry(gr, TString::Format(
"%s - min", pltemp->GetName()) ,
"l");
288 pltemp = (TProofLogElem*)elem->At(max+1);
289 gr = DoWorkerPlot(pltemp);
290 if (gr && gr->GetN()>0){
292 fWPlot =
new TMultiGraph();
295 legw =
new TLegend(0.1, 0.7, 0.4, 0.9);
296 legw->SetHeader(
"Workers");
301 fWPlot->Add(gr,
"l");
302 legw->AddEntry(gr, TString::Format(
"%s - max", pltemp->GetName()),
"l");
309 ple = (TProofLogElem*)elem->FindObject(token);
310 const char *role = ple->GetRole();
314 gr = DoWorkerPlot(ple);
315 if (gr && gr->GetN()>0) {
317 fWPlot =
new TMultiGraph();
320 legw =
new TLegend(0.1, 0.7, 0.4, 0.9);
321 legw->SetHeader(
"Workers");
324 gr->SetLineColor(iwelem+3);
325 fWPlot->Add(gr,
"l");
326 legw->AddEntry(gr, token,
"l");
332 gr = DoMasterPlot(ple);
333 if (gr && gr->GetN()>0){
335 fMPlot =
new TMultiGraph();
338 legm =
new TLegend(0.1, 0.7, 0.4, 0.9);
339 legm->SetHeader(
"Master");
342 gr->SetLineColor(imelem+1);
343 fMPlot->Add(gr,
"l");
344 legm->AddEntry(gr, token,
"l");
352 fWorkersPlot->GetCanvas()->cd();
354 if (fWPlot->GetXaxis())
355 fWPlot->GetXaxis()->SetTitle(
"Events Processed");
356 if (fWPlot->GetYaxis())
357 fWPlot->GetYaxis()->SetTitle(
"MBytes");
358 if (legw) legw->Draw();
362 fMasterPlot->GetCanvas()->cd();
364 if (fMPlot->GetXaxis())
365 fMPlot->GetXaxis()->SetTitle(
"Objects Merged");
366 if (fMPlot->GetYaxis())
367 fMPlot->GetYaxis()->SetTitle(
"MBytes");
368 if (legm) legm->Draw();
370 fWorkersPlot->GetCanvas()->Update();
371 fMasterPlot->GetCanvas()->Update();
379 TGraph *TProofProgressMemoryPlot::DoAveragePlot(Int_t &max_el, Int_t &min_el)
381 TList *elem = fProofLog->GetListOfLogs();
383 Error(
"DoAveragePlot",
"Empty log");
388 TProofLogElem *ple=0;
390 Double_t min_av = 10E9;
392 Long64_t maxevent = 0;
394 TObjString *curline = 0;
395 TObjString *prevline = 0;
396 Long64_t curevent_value;
397 Long64_t prevevent_value;
398 Long64_t *last =
new Long64_t[elem->GetEntries()];
399 Long64_t vmem = -1, rmem = -1, nevt = -1;
402 for (Int_t i=0; i<elem->GetEntries(); i++) {
405 while ((ple = (TProofLogElem *)next())){
407 const char *role = ple->GetRole();
408 if (role[0] !=
'w')
continue;
409 TList *lines = ple->GetMacro()->GetListOfLines();
410 if (!lines || lines->GetSize() <= 0)
continue;
411 curline = (TObjString *) lines->Last();
412 if (!curline)
continue;
414 if (ParseLine(curline->String(), vmem, rmem, curevent_value) != 0) {
415 Warning(
"DoAveragePlot",
"error parsing line: '%s'", curline->String().Data());
418 if (maxevent < curevent_value) maxevent = curevent_value;
419 last[ielem] = curevent_value;
422 prevline = (TObjString *)lines->Before(curline);
425 if (ParseLine(prevline->String(), vmem, rmem, prevevent_value) != 0) {
426 Warning(
"DoAveragePlot",
"error parsing line: '%s'", curline->String().Data());
428 step = curevent_value - prevevent_value;
434 Int_t maxlines = Int_t(maxevent/(1.*step));
436 for (Int_t i=0; i<ielem; i++){
440 Double_t *av_mem =
new Double_t[maxlines];
441 Int_t *nw =
new Int_t[maxlines];
442 for (Int_t i=0; i<maxlines; i++){
450 while ((ple = (TProofLogElem*)next())){
451 const char *role = ple->GetRole();
452 if (role[0]!=
'w')
continue;
453 TList *lines = ple->GetMacro()->GetListOfLines();
454 if (!lines || lines->GetSize() <= 0)
continue;
455 TIter prev(lines, kIterBackward);
458 while ((curline = (TObjString*)prev()) && iline<last[ielem]){
461 if (ParseLine(curline->String(), vmem, rmem, nevt) != 0) {
462 Warning(
"DoWorkerPlot",
"error parsing line: '%s'", curline->String().Data());
465 av_mem[last[ielem] -1 - iline] += vmem;
466 nw[last[ielem] -1 - iline]++;
467 if (last[ielem] > 0) cur_av += (Double_t)vmem / last[ielem];
470 if (cur_av > max_av){
474 if (cur_av < min_av){
481 TGraph *gr =
new TGraph(maxlines);
483 for (Int_t i=0; i<maxlines; i++){
484 gr->SetPoint(i, (i+1)*step, av_mem[i]/(nw[i]*1024.));
505 Int_t TProofProgressMemoryPlot::ParseLine(TString l,
506 Long64_t &v, Long64_t &r, Long64_t &e)
509 if (l.IsNull())
return -1;
512 if (v < 0 && r < 0 && e < 0)
return 0;
516 if ((from = l.Index(
"Memory")) == kNPOS)
return -1;
524 if (!l.Tokenize(tok, from,
" "))
return -1;
530 if ((from = l.Index(
"virtual", from)) == kNPOS)
return -1;
532 if (!l.Tokenize(tok, from,
" "))
return -1;
538 if ((from = l.Index(
"event", from)) == kNPOS)
return -1;
540 if (!l.Tokenize(tok, from,
" "))
return -1;
551 TGraph *TProofProgressMemoryPlot::DoWorkerPlot(TProofLogElem *ple)
554 TList *lines = ple->GetMacro()->GetListOfLines();
560 Long64_t vmem = -1, rmem = -1, nevt = -1;
563 curline = (TObjString*)lines->Last();
564 Long64_t lastevent_value = 0;
565 if (ParseLine(curline->String(), vmem, rmem, lastevent_value) != 0) {
566 Error(
"DoWorkerPlot",
"error parsing line: '%s'", curline->String().Data());
571 TObjString *prevline = (TObjString*)lines->Before(curline);
572 Long64_t prevevent_value = 0;
573 if (prevline && ParseLine(prevline->String(), vmem, rmem, prevevent_value) != 0) {
574 Error(
"DoWorkerPlot",
"error parsing line: '%s'", prevline->String().Data());
577 Long64_t step = lastevent_value - prevevent_value;
579 Error(
"DoWorkerPlot",
"null or negative step (%lld) - cannot continue", step);
583 Int_t nlines = lastevent_value/step;
584 TGraph *gr =
new TGraph(nlines);
586 TIter prevl(lines, kIterBackward);
589 while ((curline = (TObjString*)prevl()) && iline<nlines){
592 if (ParseLine(curline->String(), vmem, rmem, nevt) != 0) {
593 Warning(
"DoWorkerPlot",
"error parsing line: '%s'", curline->String().Data());
596 gr->SetPoint(nlines-1-iline, lastevent_value-iline*step, vmem/1024.);
607 TGraph *TProofProgressMemoryPlot::DoMasterPlot(TProofLogElem *ple)
609 TList *lines = ple->GetMacro()->GetListOfLines();
610 TIter prevline(lines, kIterBackward);
614 while ((curline = (TObjString*)prevline())) {
615 if (curline->String().Contains(
"Start"))
break;
619 Long64_t vmem = -1, rmem = -1, nevt = -1;
621 Int_t nlines = iline;
623 TGraph *gr =
new TGraph(nlines);
626 while ((curline = (TObjString*)prevline()) && iline<nlines) {
629 if (ParseLine(curline->String(), vmem, rmem, nevt) != 0) {
630 Warning(
"DoWorkerPlot",
"error parsing line: '%s'", curline->String().Data());
633 gr->SetPoint(nlines-iline, nlines-iline, vmem/1024.);
642 void TProofProgressMemoryPlot::Select(Int_t
id)
644 Int_t nen = fWorkers->GetNumberOfEntries();
645 Bool_t sel =
id ? 0 : 1;
647 for (Int_t ie=0; ie<nen; ie++) {
648 fWorkers->Select(ie, sel);