// @(#)root/proofplayer:$Id$
// Author: G. Ganis May 2012

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TStatsFeedback                                                       //
//                                                                      //
// Utility class to display PROOF stats feedback histos during queries. //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TStatsFeedback.h"

#include "TError.h"
#include "TH1.h"
#include "TH2.h"
#include "THashList.h"
#include "TObjString.h"
#include "TProof.h"
#include "TProofDebug.h"
#include "TROOT.h"
#include "TSeqCollection.h"
#include "TStyle.h"
#include "TVirtualPad.h"

ClassImp(TStatsFeedback)


//______________________________________________________________________________
TStatsFeedback::TStatsFeedback(TProof *proof)
{
   // Constructor

   if (proof == 0) proof = gProof;

   TProof *p = dynamic_cast<TProof*>(proof);
   if (p == 0) {
      Error("TStatsFeedback", "no valid proof session found");
      SetBit(TObject::kInvalidObject);
      return;
   }
   fProof = p;
   fName = fProof->GetSessionTag();

   if (!(proof->Connect("Feedback(TList *objs)", "TStatsFeedback",
                  this, "Feedback(TList *objs)"))) {
      Error("TStatsFeedback", "Connect() failed");
      SetBit(TObject::kInvalidObject);
      return;
   }
}

//______________________________________________________________________________
TStatsFeedback::~TStatsFeedback()
{
   // Destructor

   fProof->Disconnect("Feedback(TList*)", this, "Feedback(TList*");
}

//______________________________________________________________________________
void TStatsFeedback::Feedback(TList *objs)
{
   // Display feedback

   TSeqCollection *canvases = gROOT->GetListOfCanvases();

   PDB(kFeedback,1) Info("Feedback", "%d Objects", objs->GetSize());

   // Attach to the histograms we want to plot
   TH1D *hevt = 0, *hpck = 0;
   TH1I *hass = 0;
   TIter next(objs);
   TObject *o = 0;
   while((o = next())) {
      if (!strcmp(o->GetName(), "PROOF_EventsHist")) {
         hevt = dynamic_cast<TH1D *>(o);
      } else if (!strcmp(o->GetName(), "PROOF_PacketsHist")) {
         hpck = dynamic_cast<TH1D *>(o);
      } else if (!strcmp(o->GetName(), "PROOF_ProcPcktHist")) {
         hass = dynamic_cast<TH1I *>(o);
      }
      if (hevt && hpck && hass) break;
   }
   if (!hevt && !hpck && !hass) {
      Warning("Feedback", "none of the requested histograms has been found!");
      return;
   }

   // Number of histograms
   Int_t nh = 3;
   if (!hass) nh = 2;
   // Create or attach to canvas
   TString cvnm = TString::Format("Stats: %s", fProof->GetSessionTag());
   TVirtualPad *cv = 0;
   if (gROOT->GetListOfCanvases())
      cv = (TVirtualPad *) canvases->FindObject(cvnm.Data());
   if (cv && nh == 3 && !cv->GetPad(3)) SafeDelete(cv);
   if (!cv) {
      Int_t h = (nh == 3) ? 600 : 400;
      TString cvcmd = TString::Format("new TCanvas(\"%s\", \"Feedback Stats\",10,300,600,%d)",
                                      cvnm.Data(), h);
      if (!(cv = (TVirtualPad *) gROOT->ProcessLine(cvcmd))) {
         Warning("Feedback", "could not create canvas!");
         return;
      }
      PDB(kFeedback,2) Info("Feedback", "created canvas %s", cvnm.Data());
      // Create pads
      cv->Divide(1, nh);
   } else {
      cv->cd();
      PDB(kFeedback,2) Info("Feedback", "using canvas %s", cvnm.Data());
   }
   TVirtualPad *pd1 = (TVirtualPad *) cv->GetPad(1);
   TVirtualPad *pd2 = (TVirtualPad *) cv->GetPad(2);
   TVirtualPad *pd3 = (nh == 3) ? (TVirtualPad *) cv->GetPad(3) : 0;

   UInt_t optstat = gStyle->GetOptStat();
   gStyle->SetOptStat(11);
   // Plot
   if (hevt) {
      if (pd1) pd1->cd();
      hevt->SetFillColor(kGreen);
      hevt->DrawCopy();
   }
   if (hpck) {
      if (pd2) pd2->cd();
      hpck->SetFillColor(kAzure-5);
      hpck->DrawCopy();
   }
   if (hass) {
      if (pd3) pd3->cd();
      hass->SetFillColor(kGray);
      hass->SetMaximum(2);
      hass->DrawCopy();
   }

   cv->cd();
   cv->Update();
   gStyle->SetOptStat(optstat);
}
 TStatsFeedback.cxx:1
 TStatsFeedback.cxx:2
 TStatsFeedback.cxx:3
 TStatsFeedback.cxx:4
 TStatsFeedback.cxx:5
 TStatsFeedback.cxx:6
 TStatsFeedback.cxx:7
 TStatsFeedback.cxx:8
 TStatsFeedback.cxx:9
 TStatsFeedback.cxx:10
 TStatsFeedback.cxx:11
 TStatsFeedback.cxx:12
 TStatsFeedback.cxx:13
 TStatsFeedback.cxx:14
 TStatsFeedback.cxx:15
 TStatsFeedback.cxx:16
 TStatsFeedback.cxx:17
 TStatsFeedback.cxx:18
 TStatsFeedback.cxx:19
 TStatsFeedback.cxx:20
 TStatsFeedback.cxx:21
 TStatsFeedback.cxx:22
 TStatsFeedback.cxx:23
 TStatsFeedback.cxx:24
 TStatsFeedback.cxx:25
 TStatsFeedback.cxx:26
 TStatsFeedback.cxx:27
 TStatsFeedback.cxx:28
 TStatsFeedback.cxx:29
 TStatsFeedback.cxx:30
 TStatsFeedback.cxx:31
 TStatsFeedback.cxx:32
 TStatsFeedback.cxx:33
 TStatsFeedback.cxx:34
 TStatsFeedback.cxx:35
 TStatsFeedback.cxx:36
 TStatsFeedback.cxx:37
 TStatsFeedback.cxx:38
 TStatsFeedback.cxx:39
 TStatsFeedback.cxx:40
 TStatsFeedback.cxx:41
 TStatsFeedback.cxx:42
 TStatsFeedback.cxx:43
 TStatsFeedback.cxx:44
 TStatsFeedback.cxx:45
 TStatsFeedback.cxx:46
 TStatsFeedback.cxx:47
 TStatsFeedback.cxx:48
 TStatsFeedback.cxx:49
 TStatsFeedback.cxx:50
 TStatsFeedback.cxx:51
 TStatsFeedback.cxx:52
 TStatsFeedback.cxx:53
 TStatsFeedback.cxx:54
 TStatsFeedback.cxx:55
 TStatsFeedback.cxx:56
 TStatsFeedback.cxx:57
 TStatsFeedback.cxx:58
 TStatsFeedback.cxx:59
 TStatsFeedback.cxx:60
 TStatsFeedback.cxx:61
 TStatsFeedback.cxx:62
 TStatsFeedback.cxx:63
 TStatsFeedback.cxx:64
 TStatsFeedback.cxx:65
 TStatsFeedback.cxx:66
 TStatsFeedback.cxx:67
 TStatsFeedback.cxx:68
 TStatsFeedback.cxx:69
 TStatsFeedback.cxx:70
 TStatsFeedback.cxx:71
 TStatsFeedback.cxx:72
 TStatsFeedback.cxx:73
 TStatsFeedback.cxx:74
 TStatsFeedback.cxx:75
 TStatsFeedback.cxx:76
 TStatsFeedback.cxx:77
 TStatsFeedback.cxx:78
 TStatsFeedback.cxx:79
 TStatsFeedback.cxx:80
 TStatsFeedback.cxx:81
 TStatsFeedback.cxx:82
 TStatsFeedback.cxx:83
 TStatsFeedback.cxx:84
 TStatsFeedback.cxx:85
 TStatsFeedback.cxx:86
 TStatsFeedback.cxx:87
 TStatsFeedback.cxx:88
 TStatsFeedback.cxx:89
 TStatsFeedback.cxx:90
 TStatsFeedback.cxx:91
 TStatsFeedback.cxx:92
 TStatsFeedback.cxx:93
 TStatsFeedback.cxx:94
 TStatsFeedback.cxx:95
 TStatsFeedback.cxx:96
 TStatsFeedback.cxx:97
 TStatsFeedback.cxx:98
 TStatsFeedback.cxx:99
 TStatsFeedback.cxx:100
 TStatsFeedback.cxx:101
 TStatsFeedback.cxx:102
 TStatsFeedback.cxx:103
 TStatsFeedback.cxx:104
 TStatsFeedback.cxx:105
 TStatsFeedback.cxx:106
 TStatsFeedback.cxx:107
 TStatsFeedback.cxx:108
 TStatsFeedback.cxx:109
 TStatsFeedback.cxx:110
 TStatsFeedback.cxx:111
 TStatsFeedback.cxx:112
 TStatsFeedback.cxx:113
 TStatsFeedback.cxx:114
 TStatsFeedback.cxx:115
 TStatsFeedback.cxx:116
 TStatsFeedback.cxx:117
 TStatsFeedback.cxx:118
 TStatsFeedback.cxx:119
 TStatsFeedback.cxx:120
 TStatsFeedback.cxx:121
 TStatsFeedback.cxx:122
 TStatsFeedback.cxx:123
 TStatsFeedback.cxx:124
 TStatsFeedback.cxx:125
 TStatsFeedback.cxx:126
 TStatsFeedback.cxx:127
 TStatsFeedback.cxx:128
 TStatsFeedback.cxx:129
 TStatsFeedback.cxx:130
 TStatsFeedback.cxx:131
 TStatsFeedback.cxx:132
 TStatsFeedback.cxx:133
 TStatsFeedback.cxx:134
 TStatsFeedback.cxx:135
 TStatsFeedback.cxx:136
 TStatsFeedback.cxx:137
 TStatsFeedback.cxx:138
 TStatsFeedback.cxx:139
 TStatsFeedback.cxx:140
 TStatsFeedback.cxx:141
 TStatsFeedback.cxx:142
 TStatsFeedback.cxx:143
 TStatsFeedback.cxx:144
 TStatsFeedback.cxx:145
 TStatsFeedback.cxx:146
 TStatsFeedback.cxx:147
 TStatsFeedback.cxx:148
 TStatsFeedback.cxx:149
 TStatsFeedback.cxx:150