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);