ROOT logo
// @(#)root/proof:$Id: TProofBench.cxx 42261 2011-11-25 22:08:15Z ganis $
// Author: G.Ganis, S.Ryu Feb 2011

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofBench                                                          //
//                                                                      //
// Steering class for PROOF benchmarks                                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfigure.h"

#include "TProofBench.h"
#include "Getline.h"
#include "TProofBenchRunCPU.h"
#include "TProofBenchRunDataRead.h"
#include "TProofBenchDataSet.h"
#include "TProofNodes.h"
#include "TClass.h"
#include "TFile.h"
#include "TFileCollection.h"
#include "TFileInfo.h"
#include "THashList.h"
#include "TKey.h"
#include "TObjString.h"
#include "TProof.h"
#include "TROOT.h"
#include "TUrl.h"

#include "TCanvas.h"
#include "TGraphErrors.h"
#include "TH1F.h"
#include "TMath.h"
#include "TProfile.h"
#include "TStyle.h"

ClassImp(TProofBench)

//______________________________________________________________________________
TProofBench::TProofBench(const char *url, const char *outfile, const char *proofopt)
            : fUnlinkOutfile(kFALSE), fProofDS(0), fOutFile(0),
              fNtries(4), fHistType(0), fNHist(16), fReadType(0),
              fDataSet("BenchDataSet"), fNFilesWrk(4),
              fDataGenSel(kPROOF_BenchSelDataGenDef),
              fRunCPU(0), fRunDS(0), fDS(0), fDebug(kFALSE)
{
   // Constructor: check PROOF and load selectors PAR
   
   SetBit(kInvalidObject);
   if (!url) {
      Error("TProofBench", "specifying a PROOF master url is mandatory - cannot continue");
      return;
   }
   if (!(fProof = TProof::Open(url, proofopt)) || (fProof && !fProof->IsValid())) {
      Error("TProofBench", "could not open a valid PROOF session - cannot continue");
      return;
   }
   // By default we use the same instance for dataset actions
   fProofDS = fProof;
   // The object is now valid
   ResetBit(kInvalidObject);

   // Set output file
   if (SetOutFile(outfile, kFALSE) != 0)
      Warning("TProofBench", "problems opening '%s' - ignoring: use SetOutFile to try"
                                   " again or with another file", outfile);
} 

//______________________________________________________________________________
TProofBench::~TProofBench()
{
   // Destructor
   
   CloseOutFile();
   if (fUnlinkOutfile) gSystem->Unlink(fOutFileName);
   SafeDelete(fReadType);
   SafeDelete(fRunCPU);
   SafeDelete(fRunDS);
}

//______________________________________________________________________________
Int_t TProofBench::OpenOutFile(Bool_t wrt, Bool_t verbose)
{
   // Set the otuput file
   // Return 0 on success, -1 on error

   // Remove any bad file
   if (fOutFile && fOutFile->IsZombie()) SafeDelete(fOutFile);

   Int_t rc = 0;
   if (!fOutFile && fOutFileName.Length() > 0) {
      const char *mode = 0;
      if (wrt)
         mode = gSystem->AccessPathName(fOutFileName) ? "RECREATE" : "UPDATE";
      else
         mode = "READ";
      if (!(fOutFile = TFile::Open(fOutFileName, mode)) || (fOutFile && fOutFile->IsZombie())) {
         if (verbose)
            Warning("OpenOutFile", "problems opening '%s' - ignoring: use SetOutFile to try"
                                   " again or with another file", fOutFileName.Data());
         rc = -1;
      }
      if (fOutFile) gROOT->GetListOfFiles()->Remove(fOutFile);
   }
   return rc;
}

//______________________________________________________________________________
Int_t TProofBench::SetOutFile(const char *outfile, Bool_t verbose)
{
   // Set the output file
   // Return 0 on success, -1 on error

   Int_t rc = 0;
   // Close existing file, if any
   if (fOutFile) {
      if (!fOutFile->IsZombie()) fOutFile->Close();
      SafeDelete(fOutFile);
   }
   
   fOutFileName = outfile;
   if (fOutFileName == "<default>") {
      // Default output file: proofbench-<master>-<DayMonthYear-hhmm>.root
      TDatime dat;
      const char *lite = (fProof->IsLite()) ? "-lite" : "";
      fOutFileName.Form("proofbench-%s%s-%dw-%d-%.2d%.2d.root",
                        fProof->GetMaster(), lite, fProof->GetParallel(),
                        dat.GetDate(), dat.GetHour(), dat.GetMinute());
      Info("SetOutFile", "using default output file: '%s'", fOutFileName.Data());
      fUnlinkOutfile = kTRUE;
   }
   if (!fOutFileName.IsNull()) {
      if ((rc = OpenOutFile(kTRUE, kFALSE)) != 0 && verbose)
         Warning("SetOutFile", "problems opening '%s' - ignoring: use SetOutFile to try"
                               " again or with another file", outfile);
   }
   return rc;
}

//______________________________________________________________________________
void TProofBench::CloseOutFile()
{
   // Close output file

   if (SetOutFile(0) != 0)
      Warning("CloseOutFile", "problems closing '%s'", fOutFileName.Data());
}

//______________________________________________________________________________
Int_t TProofBench::RunCPU(Long64_t nevents, Int_t start, Int_t stop, Int_t step)
{
   // Perform the CPU run
   // Return 0 on success, -1 on error

   // Open the file for the results
   if (OpenOutFile(kTRUE) != 0) {
      Error("RunCPU", "problems opening '%s' to save the result", fOutFileName.Data());
      return -1;
   }
   fUnlinkOutfile = kFALSE;

   SafeDelete(fRunCPU);
   TPBHistType htype(TPBHistType::kHist1D);
   fRunCPU = new TProofBenchRunCPU(&htype, fNHist, fOutFile);
   if (!fCPUSel.IsNull()) fRunCPU->SetSelName(fCPUSel);
   if (!fCPUPar.IsNull()) fRunCPU->SetParList(fCPUPar);
   fRunCPU->Run(nevents, start, stop, step, fNtries, fDebug, -1);

   // Close the file
   if (SetOutFile(0) != 0)
      Warning("RunCPU", "problems closing '%s'", fOutFileName.Data());

   // Done
   return 0;
}

//______________________________________________________________________________
Int_t TProofBench::RunCPUx(Long64_t nevents, Int_t start, Int_t stop)
{
   // Perform the CPU run scanning over the number of workers per node
   // Return 0 on success, -1 on error

   // Open the file for the results
   if (OpenOutFile(kTRUE) != 0) {
      Error("RunCPUx", "problems opening '%s' to save the result", fOutFileName.Data());
      return -1;
   }
   fUnlinkOutfile = kFALSE;

   SafeDelete(fRunCPU);
   TPBHistType htype(TPBHistType::kHist1D);
   fRunCPU = new TProofBenchRunCPU(&htype, fNHist, fOutFile);
   if (!fCPUSel.IsNull()) fRunCPU->SetSelName(fCPUSel);
   if (!fCPUPar.IsNull()) fRunCPU->SetParList(fCPUPar);
   fRunCPU->Run(nevents, start, stop, -2, fNtries, fDebug, -1);

   // Close the file
   if (SetOutFile(0) != 0)
      Warning("RunCPUx", "problems closing '%s'", fOutFileName.Data());

   // Done
   return 0;
}

//______________________________________________________________________________
void TProofBench::DrawCPU(const char *outfile, const char *opt)
{
   // Draw the CPU speedup plot.
   //  opt =    'std:'      draw standard evt/s plot
   //           'stdx:'     draw standard evt/s plot, 1 worker per node
   //           'norm:'     draw normalized plot
   //           'normx:'    draw normalized plot, 1 worker per node
   //

   // Get the TProfile an create the graphs
   TFile *fout = TFile::Open(outfile, "READ");
   if (!fout || (fout && fout->IsZombie())) {
      ::Error("DrawCPU", "could not open file '%s' ...", outfile);
      return;
   }

   TString oo(opt);
   const char *dirn = (oo.Contains("x:")) ? "RunCPUx" : "RunCPU";
   TDirectory *d = (TDirectory *) fout->Get(dirn);
   if (!d) {
      ::Error("DrawCPU", "could not find directory 'RunCPU' ...");
      fout->Close();
      delete fout;
      return;
   }
   d->cd();
   TString hprofn;
   if (!strcmp(opt, "std:")) {
      hprofn = "Prof_CPU_QR_Evts";
   } else if (!strcmp(opt, "stdx:")) {
      hprofn = "Prof_x_CPU_QR_Evts";
   } else if (!strcmp(opt, "norm:")) {
      hprofn = "Norm_CPU_QR_Evts";
   } else if (!strcmp(opt, "normx:")) {
      hprofn = "Norm_x_CPU_QR_Evts";
   } else {
      ::Error("DrawCPU", "unknown option '%s'", opt);
      fout->Close();
      delete fout;
      return;
   }
   TProfile *pf = 0;
   TList *keylist = d->GetListOfKeys();
   TKey *key = 0;
   TIter nxk(keylist);
   while ((key = (TKey *) nxk())) {
      if (TString(key->GetName()).BeginsWith(hprofn)) {
         pf = (TProfile *) d->Get(key->GetName());
         break;
      }
   }
   if (!pf) {
      ::Error("DrawCPU", "could not find '%s' ...", hprofn.Data());
      fout->Close();
      delete fout;
      return;
   }

   Int_t nbins = pf->GetNbinsX();
   TGraphErrors *gr = new TGraphErrors(nbins);
   Double_t xx, ex, yy, ey, ymi = pf->GetBinContent(1), ymx = ymi;
   Int_t k =1;
   for (;k <= nbins; k++) {
      xx = pf->GetBinCenter(k);
      ex = pf->GetBinWidth(k) * .001;
      yy = pf->GetBinContent(k);
      ey = pf->GetBinError(k);
      if (k == 1) {
         ymi = yy;
         ymx = yy;
      } else {
         if (yy < ymi) ymi = yy; 
         if (yy > ymx) ymx = yy;
      }
      gr->SetPoint(k-1, xx, yy);
      gr->SetPointError(k-1, ex, ey);
   }

   // Create the canvas
   TCanvas *cpu = new TCanvas("cpu", "Rate vs wrks",204,69,1050,502);
   cpu->Range(-3.106332,0.7490716,28.1362,1.249867);

   gStyle->SetOptTitle(0);
   gr->SetFillColor(1);
   gr->SetLineColor(13);
   gr->SetMarkerStyle(21);
   gr->SetMarkerSize(1.2);

   TH1F *hgr = new TH1F("Graph-CPU"," CPU speed-up", nbins*4,0,nbins+1);
   hgr->SetMaximum(ymx + (ymx-ymi)*0.2);
   hgr->SetMinimum(0);
   hgr->SetDirectory(0);
   hgr->SetStats(0);
//   hgr->CenterTitle(true);
   hgr->GetXaxis()->SetTitle(pf->GetXaxis()->GetTitle());
   hgr->GetXaxis()->CenterTitle(true);
   hgr->GetXaxis()->SetLabelSize(0.05);
   hgr->GetXaxis()->SetTitleSize(0.06);
   hgr->GetXaxis()->SetTitleOffset(0.62);
   hgr->GetYaxis()->SetLabelSize(0.06);
   gr->SetHistogram(hgr);

   gr->Print();
   
   gr->Draw("alp");
  
   fout->Close();
}

//______________________________________________________________________________
Int_t TProofBench::RunDataSet(const char *dset,
                              Int_t start, Int_t stop, Int_t step)
{
   // Perform a test using dataset 'dset'
   // Return 0 on success, -1 on error
   // Open the file for the results

   if (OpenOutFile(kTRUE) != 0) {
      Error("RunDataSet", "problems opening '%s' to save the result", fOutFileName.Data());
      return -1;
   }
   fUnlinkOutfile = kFALSE;

   ReleaseCache(dset);
   SafeDelete(fRunDS);
   TPBReadType *readType = fReadType;
   if (!readType) readType = new TPBReadType(TPBReadType::kReadOpt);
   fRunDS = new TProofBenchRunDataRead(fDS, readType, fOutFile); 
   if (!fDataSel.IsNull()) fRunDS->SetSelName(fDataSel);
   if (!fDataPar.IsNull()) fRunDS->SetParList(fDataPar);
   fRunDS->Run(dset, start, stop, step, fNtries, fDebug, -1);
   if (!fReadType) SafeDelete(readType);
   
   // Close the file
   if (SetOutFile(0) != 0)
      Warning("RunDataSet", "problems closing '%s'", fOutFileName.Data());
   
   // Done
   return 0;
}

//______________________________________________________________________________
Int_t TProofBench::RunDataSetx(const char *dset, Int_t start, Int_t stop)
{
   // Perform a test using dataset 'dset' scanning over the number of workers
   // per node.
   // Return 0 on success, -1 on error
   // Open the file for the results

   if (OpenOutFile(kTRUE) != 0) {
      Error("RunDataSetx", "problems opening '%s' to save the result", fOutFileName.Data());
      return -1;
   }
   fUnlinkOutfile = kFALSE;

   ReleaseCache(dset);
   SafeDelete(fRunDS);
   TPBReadType *readType = fReadType;
   if (!readType) readType = new TPBReadType(TPBReadType::kReadOpt);
   fRunDS = new TProofBenchRunDataRead(fDS, readType, fOutFile); 
   if (!fDataSel.IsNull()) fRunDS->SetSelName(fDataSel);
   if (!fDataPar.IsNull()) fRunDS->SetParList(fDataPar);
   fRunDS->Run(dset, start, stop, -2, fNtries, fDebug, -1);
   if (!fReadType) SafeDelete(readType);

   // Close the file
   if (SetOutFile(0) != 0)
      Warning("RunDataSetx", "problems closing '%s'", fOutFileName.Data());
   
   // Done
   return 0;
}

//______________________________________________________________________________
void TProofBench::DrawDataSet(const char *outfile, const char *opt, const char *type)
{
   // Draw the CPU speedup plot.
   //  opt =    'std:'          Standard scaling plot
   //           'norm:'         Normalized scaling plot
   //           'stdx:'         Standard scaling plot, 1 worker per node
   //           'normx:'        Normalized scaling plot, 1 worker per node
   // type =    'mbs'           MB/s scaling plots (default)
   //           'evts'          Event/s scaling plots
   //

   // Get the TProfile an create the graphs
   TFile *fout = TFile::Open(outfile, "READ");
   if (!fout || (fout && fout->IsZombie())) {
      ::Error("DrawDataSet", "could not open file '%s' ...", outfile);
      return;
   }
   TString oo(opt);
   const char *dirn = (oo.Contains("x:")) ? "RunDataReadx" : "RunDataRead";
   TDirectory *d = (TDirectory *) fout->Get(dirn);
   if (!d) {
      ::Error("DrawDataSet", "could not find directory 'RunDataRead' ...");
      fout->Close();
      delete fout;
      return;
   }
   d->cd();

   TString hprofn, typ("QR_IO");
   if (type && !strcmp(type, "evts")) typ = "QR_Evts";

   if (!strcmp(opt, "std:")) {
      hprofn.Form("Prof_DataRead_%s", typ.Data());
   } else if (!strcmp(opt, "stdx:")) {
      hprofn.Form("Prof_x_DataRead_%s", typ.Data());
   } else if (!strcmp(opt, "norm:")) {
      hprofn.Form("Norm_DataRead_%s", typ.Data());
   } else if (!strcmp(opt, "absx:")) {
      hprofn.Form("Norm_x_DataRead_%s", typ.Data());
   } else {
      ::Error("DrawDataSet", "unknown option '%s'", opt);
      fout->Close();
      delete fout;
      return;
   }
   TProfile *pf = 0;
   TList *keylist = d->GetListOfKeys();
   TKey *key = 0;
   TIter nxk(keylist);
   while ((key = (TKey *) nxk())) {
      if (TString(key->GetName()).BeginsWith(hprofn)) {
         pf = (TProfile *) d->Get(key->GetName());
         break;
      }
   }
   if (!pf) {
      ::Error("DrawDataSet", "could not find '%s' ...", hprofn.Data());
      fout->Close();
      delete fout;
      return;
   }
   Int_t nbins = pf->GetNbinsX();
   TGraphErrors *gr = new TGraphErrors(nbins);
   Double_t xx, ex, yy, ey, ymi = pf->GetBinContent(1), ymx = ymi;
   Int_t k =1;
   for (;k <= nbins; k++) {
      xx = pf->GetBinCenter(k);
      ex = pf->GetBinWidth(k) * .001;
      yy = pf->GetBinContent(k);
      ey = pf->GetBinError(k);
      if (k == 1) {
         ymi = yy;
         ymx = yy;
      } else {
         if (yy < ymi) ymi = yy; 
         if (yy > ymx) ymx = yy;
      }
      gr->SetPoint(k-1, xx, yy);
      gr->SetPointError(k-1, ex, ey);
      Printf("%d %f %f", (Int_t)xx, yy, ey);
   }

   // Create the canvas
   TCanvas *cpu = new TCanvas("dataset", "Rate vs wrks",204,69,1050,502);
   cpu->Range(-3.106332,0.7490716,28.1362,1.249867);

   gStyle->SetOptTitle(0);
   gr->SetFillColor(1);
   gr->SetLineColor(13);
   gr->SetMarkerStyle(21);
   gr->SetMarkerSize(1.2);

   TH1F *hgr = new TH1F("Graph-DataSet"," Data Read speed-up", nbins*4,0,nbins+1);
   hgr->SetMaximum(ymx + (ymx-ymi)*0.2);
   hgr->SetMinimum(0);
   hgr->SetDirectory(0);
   hgr->SetStats(0);
//   hgr->CenterTitle(true);
   hgr->GetXaxis()->SetTitle(pf->GetXaxis()->GetTitle());
   hgr->GetXaxis()->CenterTitle(true);
   hgr->GetXaxis()->SetLabelSize(0.05);
   hgr->GetXaxis()->SetTitleSize(0.06);
   hgr->GetXaxis()->SetTitleOffset(0.62);
   hgr->GetYaxis()->SetLabelSize(0.06);
   gr->SetHistogram(hgr);

   gr->Print();
   
   gr->Draw("alp");
  
   fout->Close();
}

//______________________________________________________________________________
Int_t TProofBench::ReleaseCache(const char *dset)
{
   // Release memory cache for dataset 'dset'
   // Return 0 on success, -1 on error

   // Do it via the dataset handler
   if (!fDS) fDS = new TProofBenchDataSet(fProofDS);
   return fDS ? fDS->ReleaseCache(dset) : -1;
}

//______________________________________________________________________________
Int_t TProofBench::RemoveDataSet(const char *dset)
{
   // Physically remove the dataset 'dset', i.e. remove the dataset and the files
   // it describes
   // Return 0 on success, -1 on error

   // Do it via the dataset handler
   if (!fDS) fDS = new TProofBenchDataSet(fProofDS);
   return fDS ? fDS->RemoveFiles(dset) : -1;
}

//______________________________________________________________________________
Int_t TProofBench::MakeDataSet(const char *dset, Long64_t nevt, const char *fnroot,
                               Bool_t regenerate)
{
   // Create the largest dataset for the run.
   // Defaults for
   //          dataset name, filename root
   // are
   //          "BenchDataSet", "event"
   // respectively.
   // Default selector is TSelEventGen. Use SetDataGenSel and SetDataGenOar to change it
   // and to pass the list of PARs defining the alternative selector.
   // These can be changed via dset, sel and fnroot, respectively.
   // The argument 'nevt' controls the number of events per file (-1 for the default,
   // which is 30000).
   // Return 0 on success, -1 on error

   if (dset && strlen(dset) > 0) fDataSet = dset;

   // Load the selector, if needed
   if (!TClass::GetClass(fDataGenSel)) {
      // Is it the default selector?
      if (fDataGenSel == kPROOF_BenchSelDataGenDef) {
         // Load the parfile
#ifdef R__HAVE_CONFIG
         TString par = TString::Format("%s/%s%s.par", ROOTETCDIR, kPROOF_BenchParDir, kPROOF_BenchDataSelPar);
#else
         TString par = TString::Format("$ROOTSYS/etc/%s%s.par", kPROOF_BenchParDir, kPROOF_BenchDataSelPar);
#endif
         Info("MakeDataSet", "uploading '%s' ...", par.Data());
         if (fProof->UploadPackage(par) != 0) {
            Error("MakeDataSet", "problems uploading '%s' - cannot continue", par.Data());
            return -1;
         }
         Info("MakeDataSet", "enabling '%s' ...", kPROOF_BenchDataSelPar);
         if (fProof->EnablePackage(kPROOF_BenchDataSelPar) != 0) {
            Error("MakeDataSet", "problems enabling '%s' - cannot continue", kPROOF_BenchDataSelPar);
            return -1;
         }
      } else {
         if (fDataGenPar.IsNull()) {
            Error("MakeDataSet", "you should load the class '%s' before running the benchmark", fDataGenSel.Data());
            return -1;
         }
      }
      // Load additional PAR files, if any or required by the alternative selector
      TString par;
      Int_t from = 0;
      while (fDataGenPar.Tokenize(par, from, ",")) {
         Info("MakeDataSet", "Uploading '%s' ...", par.Data());
         if (fProof->UploadPackage(par) != 0) {
            Error("MakeDataSet", "problems uploading '%s' - cannot continue", par.Data());
            return -1;
         }
         Info("MakeDataSet", "Enabling '%s' ...", par.Data());
         if (fProof->EnablePackage(par) != 0) {
            Error("MakeDataSet", "problems enabling '%s' - cannot continue", par.Data());
            return -1;
         }
      }
      // Check
      if (!TClass::GetClass(fDataGenSel)) {
         Error("MakeDataSet", "failed to load '%s'", fDataGenSel.Data());
         return -1;
      }
   }

   // For files, 30000 evst each (about 600 MB total) per worker
   TString fn, fnr = (fnroot && strlen(fnroot) > 0) ? fnroot : "event";
   TProofNodes pn(fProof);
   TMap *filesmap = new TMap;
   TMap *nodesmap = pn.GetMapOfNodes();
   TIter nxnd(nodesmap);
   TList *wli = 0;
   TObject *obj = 0;
   Int_t kf = 1;
   while ((obj = nxnd()) != 0) {
      if ((wli = dynamic_cast<TList *>(nodesmap->GetValue(obj)))) {
         THashList *fli = new THashList;
         Int_t nf = wli->GetSize() * fNFilesWrk;
         TSlaveInfo *wi = (TSlaveInfo *) wli->First();
         while (nf--) {
            fn.Form("%s-%s-%d.root", fnr.Data(), wi->GetName(), kf++);
            // Add to the node list for generation
            fli->Add(new TObjString(fn));
         }
         filesmap->Add(new TObjString(obj->GetName()), fli);
      }
   }
   filesmap->Print();
   // Prepare for file generation ... add map in the input list
   filesmap->SetName("PROOF_FilesToProcess");
   fProof->AddInput(filesmap);

   // Set parameters for processing
   TString oldpack;
   if (TProof::GetParameter(fProof->GetInputList(), "PROOF_Packetizer", oldpack) != 0) oldpack = "";
   fProof->SetParameter("PROOF_Packetizer", "TPacketizerFile");
   Int_t oldnotass = -1;
   if (TProof::GetParameter(fProof->GetInputList(), "PROOF_ProcessNotAssigned", oldnotass) != 0) oldnotass = -1;
   fProof->SetParameter("PROOF_ProcessNotAssigned", (Int_t)0);

   // Process
   Long64_t ne = (nevt > 0) ? nevt : 30000;
   fProof->SetParameter("PROOF_BenchmarkNEvents", ne);
   fProof->SetParameter("PROOF_BenchmarkRegenerate", Int_t(regenerate));
   fProof->Process(fDataGenSel, (Long64_t) 1);
   fProof->DeleteParameters("PROOF_BenchmarkNEvents");
   fProof->DeleteParameters("PROOF_BenchmarkRegenerate");

   // Restore parameters
   if (!oldpack.IsNull())
      fProof->SetParameter("PROOF_Packetizer", oldpack);
   else
      fProof->DeleteParameters("PROOF_Packetizer");
   if (oldnotass != -1)
      fProof->SetParameter("PROOF_ProcessNotAssigned", oldnotass);
   else
      fProof->DeleteParameters("PROOF_ProcessNotAssigned");
   
   // Cleanup
   if (fProof->GetInputList()) fProof->GetInputList()->Remove(filesmap);
   filesmap->SetOwner(kTRUE);
   delete filesmap;

   // The dataset to be registered in the end with proper port
   TFileCollection *fc = new TFileCollection("dum", "dum");

   if (fProof->GetOutputList()) {
      fProof->GetOutputList()->Print();
      TIter nxout(fProof->GetOutputList());
      while ((obj = nxout())) {
         TList *fli = dynamic_cast<TList *>(obj);
         if (fli && TString(fli->GetName()).BeginsWith("PROOF_FilesGenerated_")) {
            TIter nxfg(fli);
            TFileInfo *fi = 0;
            while ((fi = (TFileInfo *) nxfg()))
               fc->Add(fi);
            fli->SetOwner(kFALSE);
         }
      }
      // Register the new dataset, overwriting any existing dataset wth the same name
      // trusting the existing information
      fc->Update();
      if (fc->GetNFiles() > 0) {
         if (!(fProof->RegisterDataSet(fDataSet, fc, "OT")))
            Warning("MakeDataSet", "problems registering '%s'", dset);
      } else {
         Warning("MakeDataSet", "dataset '%s' is empty!", dset);
      }
   } else {
      Warning("MakeDataSet", "PROOF output list is empty!");
   }

   SafeDelete(fc);

   // Get updated information
   fc = fProof->GetDataSet(fDataSet);
   fc->Print("F");
   
   SafeDelete(fc);

   // Done
   return 0;
}

//______________________________________________________________________________
Int_t TProofBench::CopyDataSet(const char *dset, const char *dsetdst, const char *destdir)
{
   // Copy the files of dataset 'dset' to 'destdir' and create a new dataset named 'dsetdst'
   // decribing them.
   // Return 0 on success, -1 on error

   // Make some checks
   if (!fProof) {
      Error("CopyDataSet", "no PROOF found - cannot continue");
      return -1;
   }
   if (!dset || (dset && !fProof->ExistsDataSet(dset))) {
      Error("CopyDataSet", "dataset '%s' does not exist", dset);
      return -1;
   }
   if (!dsetdst || (dsetdst && fProof->ExistsDataSet(dsetdst))) {
      if (isatty(0) != 0 && isatty(1) != 0) {
         Printf("Target dataset '%s' exists already:"
                                          " do you want to remove it first?", dsetdst);
         const char *a = Getline("[Y,n] ");
         Printf("a: %s", a);
         if (a[0] == 'Y' || a[0] == 'y' || a[0] == '\n') {
            Info("CopyDataSet", "removing dataset '%s' ...", dsetdst);
            RemoveDataSet(dsetdst);
         } else {
            return -1;
         }
      } else {
         Error("CopyDataSet", "destination dataset '%s' does already exist: remove it first", dsetdst);
         return -1;
      }
   }

   // The TFileCollection object for the new dataset
   TFileCollection *fc = fProof->GetDataSet(dset);
   if (!fc) {
      Error("CopyDataSet", "problems retrieving TFileCollection for dataset '%s'", dset);
      return -1;
   }
   TFileCollection *fcn = new TFileCollection(dsetdst, "");
   TString fn;
   TFileInfo *fi = 0;
   TIter nxfi(fc->GetList());
   while ((fi = (TFileInfo *) nxfi())) {
      fn.Form("%s/%s", destdir, gSystem->BaseName(fi->GetCurrentUrl()->GetFile()));
      Info("CopyDataSet", "adding info for file '%s'", fn.Data());
      fcn->Add(new TFileInfo(fn));
   }
   delete fc;
      
   // Do it via the dataset handler
   if (!fDS) fDS = new TProofBenchDataSet(fProofDS);
   if (fDS->CopyFiles(dset, destdir) != 0) {
      Error("CopyDataSet", "problems copying files of dataset '%s' to dest dir '%s'", dset, destdir);
      delete fcn;
      return -1;
   }

   // Register the new dataset, overwriting any existing dataset wth the same name
   // trusting the existing information
   Int_t rc = 0;
   if (!(fProof->RegisterDataSet(dsetdst, fcn, "OT"))) {
      Error("CopyDataSet", "problems registering and verifying '%s'", dsetdst);
      rc = -1;
   }
   delete fcn;

   // Done
   return rc;
}

//______________________________________________________________________________
void TProofBench::SetProofDS(TProof *pds)
{
   // Set the PROOF instance to be used for dataset operations, like releasing
   // cache ...
   // Use SetProofDS(0) to reset and using the default PROOF
   
   if (pds && !pds->IsValid()) {
      Error("SetProofDS", "trying to set an invalid PROOF instance");
      return;
   }
   fProofDS = pds ? pds : fProof;
   if (fProofDS) {
      SafeDelete(fDS);
      fDS = new TProofBenchDataSet(fProofDS);
   }
   // Done
   return;
}

 TProofBench.cxx:1
 TProofBench.cxx:2
 TProofBench.cxx:3
 TProofBench.cxx:4
 TProofBench.cxx:5
 TProofBench.cxx:6
 TProofBench.cxx:7
 TProofBench.cxx:8
 TProofBench.cxx:9
 TProofBench.cxx:10
 TProofBench.cxx:11
 TProofBench.cxx:12
 TProofBench.cxx:13
 TProofBench.cxx:14
 TProofBench.cxx:15
 TProofBench.cxx:16
 TProofBench.cxx:17
 TProofBench.cxx:18
 TProofBench.cxx:19
 TProofBench.cxx:20
 TProofBench.cxx:21
 TProofBench.cxx:22
 TProofBench.cxx:23
 TProofBench.cxx:24
 TProofBench.cxx:25
 TProofBench.cxx:26
 TProofBench.cxx:27
 TProofBench.cxx:28
 TProofBench.cxx:29
 TProofBench.cxx:30
 TProofBench.cxx:31
 TProofBench.cxx:32
 TProofBench.cxx:33
 TProofBench.cxx:34
 TProofBench.cxx:35
 TProofBench.cxx:36
 TProofBench.cxx:37
 TProofBench.cxx:38
 TProofBench.cxx:39
 TProofBench.cxx:40
 TProofBench.cxx:41
 TProofBench.cxx:42
 TProofBench.cxx:43
 TProofBench.cxx:44
 TProofBench.cxx:45
 TProofBench.cxx:46
 TProofBench.cxx:47
 TProofBench.cxx:48
 TProofBench.cxx:49
 TProofBench.cxx:50
 TProofBench.cxx:51
 TProofBench.cxx:52
 TProofBench.cxx:53
 TProofBench.cxx:54
 TProofBench.cxx:55
 TProofBench.cxx:56
 TProofBench.cxx:57
 TProofBench.cxx:58
 TProofBench.cxx:59
 TProofBench.cxx:60
 TProofBench.cxx:61
 TProofBench.cxx:62
 TProofBench.cxx:63
 TProofBench.cxx:64
 TProofBench.cxx:65
 TProofBench.cxx:66
 TProofBench.cxx:67
 TProofBench.cxx:68
 TProofBench.cxx:69
 TProofBench.cxx:70
 TProofBench.cxx:71
 TProofBench.cxx:72
 TProofBench.cxx:73
 TProofBench.cxx:74
 TProofBench.cxx:75
 TProofBench.cxx:76
 TProofBench.cxx:77
 TProofBench.cxx:78
 TProofBench.cxx:79
 TProofBench.cxx:80
 TProofBench.cxx:81
 TProofBench.cxx:82
 TProofBench.cxx:83
 TProofBench.cxx:84
 TProofBench.cxx:85
 TProofBench.cxx:86
 TProofBench.cxx:87
 TProofBench.cxx:88
 TProofBench.cxx:89
 TProofBench.cxx:90
 TProofBench.cxx:91
 TProofBench.cxx:92
 TProofBench.cxx:93
 TProofBench.cxx:94
 TProofBench.cxx:95
 TProofBench.cxx:96
 TProofBench.cxx:97
 TProofBench.cxx:98
 TProofBench.cxx:99
 TProofBench.cxx:100
 TProofBench.cxx:101
 TProofBench.cxx:102
 TProofBench.cxx:103
 TProofBench.cxx:104
 TProofBench.cxx:105
 TProofBench.cxx:106
 TProofBench.cxx:107
 TProofBench.cxx:108
 TProofBench.cxx:109
 TProofBench.cxx:110
 TProofBench.cxx:111
 TProofBench.cxx:112
 TProofBench.cxx:113
 TProofBench.cxx:114
 TProofBench.cxx:115
 TProofBench.cxx:116
 TProofBench.cxx:117
 TProofBench.cxx:118
 TProofBench.cxx:119
 TProofBench.cxx:120
 TProofBench.cxx:121
 TProofBench.cxx:122
 TProofBench.cxx:123
 TProofBench.cxx:124
 TProofBench.cxx:125
 TProofBench.cxx:126
 TProofBench.cxx:127
 TProofBench.cxx:128
 TProofBench.cxx:129
 TProofBench.cxx:130
 TProofBench.cxx:131
 TProofBench.cxx:132
 TProofBench.cxx:133
 TProofBench.cxx:134
 TProofBench.cxx:135
 TProofBench.cxx:136
 TProofBench.cxx:137
 TProofBench.cxx:138
 TProofBench.cxx:139
 TProofBench.cxx:140
 TProofBench.cxx:141
 TProofBench.cxx:142
 TProofBench.cxx:143
 TProofBench.cxx:144
 TProofBench.cxx:145
 TProofBench.cxx:146
 TProofBench.cxx:147
 TProofBench.cxx:148
 TProofBench.cxx:149
 TProofBench.cxx:150
 TProofBench.cxx:151
 TProofBench.cxx:152
 TProofBench.cxx:153
 TProofBench.cxx:154
 TProofBench.cxx:155
 TProofBench.cxx:156
 TProofBench.cxx:157
 TProofBench.cxx:158
 TProofBench.cxx:159
 TProofBench.cxx:160
 TProofBench.cxx:161
 TProofBench.cxx:162
 TProofBench.cxx:163
 TProofBench.cxx:164
 TProofBench.cxx:165
 TProofBench.cxx:166
 TProofBench.cxx:167
 TProofBench.cxx:168
 TProofBench.cxx:169
 TProofBench.cxx:170
 TProofBench.cxx:171
 TProofBench.cxx:172
 TProofBench.cxx:173
 TProofBench.cxx:174
 TProofBench.cxx:175
 TProofBench.cxx:176
 TProofBench.cxx:177
 TProofBench.cxx:178
 TProofBench.cxx:179
 TProofBench.cxx:180
 TProofBench.cxx:181
 TProofBench.cxx:182
 TProofBench.cxx:183
 TProofBench.cxx:184
 TProofBench.cxx:185
 TProofBench.cxx:186
 TProofBench.cxx:187
 TProofBench.cxx:188
 TProofBench.cxx:189
 TProofBench.cxx:190
 TProofBench.cxx:191
 TProofBench.cxx:192
 TProofBench.cxx:193
 TProofBench.cxx:194
 TProofBench.cxx:195
 TProofBench.cxx:196
 TProofBench.cxx:197
 TProofBench.cxx:198
 TProofBench.cxx:199
 TProofBench.cxx:200
 TProofBench.cxx:201
 TProofBench.cxx:202
 TProofBench.cxx:203
 TProofBench.cxx:204
 TProofBench.cxx:205
 TProofBench.cxx:206
 TProofBench.cxx:207
 TProofBench.cxx:208
 TProofBench.cxx:209
 TProofBench.cxx:210
 TProofBench.cxx:211
 TProofBench.cxx:212
 TProofBench.cxx:213
 TProofBench.cxx:214
 TProofBench.cxx:215
 TProofBench.cxx:216
 TProofBench.cxx:217
 TProofBench.cxx:218
 TProofBench.cxx:219
 TProofBench.cxx:220
 TProofBench.cxx:221
 TProofBench.cxx:222
 TProofBench.cxx:223
 TProofBench.cxx:224
 TProofBench.cxx:225
 TProofBench.cxx:226
 TProofBench.cxx:227
 TProofBench.cxx:228
 TProofBench.cxx:229
 TProofBench.cxx:230
 TProofBench.cxx:231
 TProofBench.cxx:232
 TProofBench.cxx:233
 TProofBench.cxx:234
 TProofBench.cxx:235
 TProofBench.cxx:236
 TProofBench.cxx:237
 TProofBench.cxx:238
 TProofBench.cxx:239
 TProofBench.cxx:240
 TProofBench.cxx:241
 TProofBench.cxx:242
 TProofBench.cxx:243
 TProofBench.cxx:244
 TProofBench.cxx:245
 TProofBench.cxx:246
 TProofBench.cxx:247
 TProofBench.cxx:248
 TProofBench.cxx:249
 TProofBench.cxx:250
 TProofBench.cxx:251
 TProofBench.cxx:252
 TProofBench.cxx:253
 TProofBench.cxx:254
 TProofBench.cxx:255
 TProofBench.cxx:256
 TProofBench.cxx:257
 TProofBench.cxx:258
 TProofBench.cxx:259
 TProofBench.cxx:260
 TProofBench.cxx:261
 TProofBench.cxx:262
 TProofBench.cxx:263
 TProofBench.cxx:264
 TProofBench.cxx:265
 TProofBench.cxx:266
 TProofBench.cxx:267
 TProofBench.cxx:268
 TProofBench.cxx:269
 TProofBench.cxx:270
 TProofBench.cxx:271
 TProofBench.cxx:272
 TProofBench.cxx:273
 TProofBench.cxx:274
 TProofBench.cxx:275
 TProofBench.cxx:276
 TProofBench.cxx:277
 TProofBench.cxx:278
 TProofBench.cxx:279
 TProofBench.cxx:280
 TProofBench.cxx:281
 TProofBench.cxx:282
 TProofBench.cxx:283
 TProofBench.cxx:284
 TProofBench.cxx:285
 TProofBench.cxx:286
 TProofBench.cxx:287
 TProofBench.cxx:288
 TProofBench.cxx:289
 TProofBench.cxx:290
 TProofBench.cxx:291
 TProofBench.cxx:292
 TProofBench.cxx:293
 TProofBench.cxx:294
 TProofBench.cxx:295
 TProofBench.cxx:296
 TProofBench.cxx:297
 TProofBench.cxx:298
 TProofBench.cxx:299
 TProofBench.cxx:300
 TProofBench.cxx:301
 TProofBench.cxx:302
 TProofBench.cxx:303
 TProofBench.cxx:304
 TProofBench.cxx:305
 TProofBench.cxx:306
 TProofBench.cxx:307
 TProofBench.cxx:308
 TProofBench.cxx:309
 TProofBench.cxx:310
 TProofBench.cxx:311
 TProofBench.cxx:312
 TProofBench.cxx:313
 TProofBench.cxx:314
 TProofBench.cxx:315
 TProofBench.cxx:316
 TProofBench.cxx:317
 TProofBench.cxx:318
 TProofBench.cxx:319
 TProofBench.cxx:320
 TProofBench.cxx:321
 TProofBench.cxx:322
 TProofBench.cxx:323
 TProofBench.cxx:324
 TProofBench.cxx:325
 TProofBench.cxx:326
 TProofBench.cxx:327
 TProofBench.cxx:328
 TProofBench.cxx:329
 TProofBench.cxx:330
 TProofBench.cxx:331
 TProofBench.cxx:332
 TProofBench.cxx:333
 TProofBench.cxx:334
 TProofBench.cxx:335
 TProofBench.cxx:336
 TProofBench.cxx:337
 TProofBench.cxx:338
 TProofBench.cxx:339
 TProofBench.cxx:340
 TProofBench.cxx:341
 TProofBench.cxx:342
 TProofBench.cxx:343
 TProofBench.cxx:344
 TProofBench.cxx:345
 TProofBench.cxx:346
 TProofBench.cxx:347
 TProofBench.cxx:348
 TProofBench.cxx:349
 TProofBench.cxx:350
 TProofBench.cxx:351
 TProofBench.cxx:352
 TProofBench.cxx:353
 TProofBench.cxx:354
 TProofBench.cxx:355
 TProofBench.cxx:356
 TProofBench.cxx:357
 TProofBench.cxx:358
 TProofBench.cxx:359
 TProofBench.cxx:360
 TProofBench.cxx:361
 TProofBench.cxx:362
 TProofBench.cxx:363
 TProofBench.cxx:364
 TProofBench.cxx:365
 TProofBench.cxx:366
 TProofBench.cxx:367
 TProofBench.cxx:368
 TProofBench.cxx:369
 TProofBench.cxx:370
 TProofBench.cxx:371
 TProofBench.cxx:372
 TProofBench.cxx:373
 TProofBench.cxx:374
 TProofBench.cxx:375
 TProofBench.cxx:376
 TProofBench.cxx:377
 TProofBench.cxx:378
 TProofBench.cxx:379
 TProofBench.cxx:380
 TProofBench.cxx:381
 TProofBench.cxx:382
 TProofBench.cxx:383
 TProofBench.cxx:384
 TProofBench.cxx:385
 TProofBench.cxx:386
 TProofBench.cxx:387
 TProofBench.cxx:388
 TProofBench.cxx:389
 TProofBench.cxx:390
 TProofBench.cxx:391
 TProofBench.cxx:392
 TProofBench.cxx:393
 TProofBench.cxx:394
 TProofBench.cxx:395
 TProofBench.cxx:396
 TProofBench.cxx:397
 TProofBench.cxx:398
 TProofBench.cxx:399
 TProofBench.cxx:400
 TProofBench.cxx:401
 TProofBench.cxx:402
 TProofBench.cxx:403
 TProofBench.cxx:404
 TProofBench.cxx:405
 TProofBench.cxx:406
 TProofBench.cxx:407
 TProofBench.cxx:408
 TProofBench.cxx:409
 TProofBench.cxx:410
 TProofBench.cxx:411
 TProofBench.cxx:412
 TProofBench.cxx:413
 TProofBench.cxx:414
 TProofBench.cxx:415
 TProofBench.cxx:416
 TProofBench.cxx:417
 TProofBench.cxx:418
 TProofBench.cxx:419
 TProofBench.cxx:420
 TProofBench.cxx:421
 TProofBench.cxx:422
 TProofBench.cxx:423
 TProofBench.cxx:424
 TProofBench.cxx:425
 TProofBench.cxx:426
 TProofBench.cxx:427
 TProofBench.cxx:428
 TProofBench.cxx:429
 TProofBench.cxx:430
 TProofBench.cxx:431
 TProofBench.cxx:432
 TProofBench.cxx:433
 TProofBench.cxx:434
 TProofBench.cxx:435
 TProofBench.cxx:436
 TProofBench.cxx:437
 TProofBench.cxx:438
 TProofBench.cxx:439
 TProofBench.cxx:440
 TProofBench.cxx:441
 TProofBench.cxx:442
 TProofBench.cxx:443
 TProofBench.cxx:444
 TProofBench.cxx:445
 TProofBench.cxx:446
 TProofBench.cxx:447
 TProofBench.cxx:448
 TProofBench.cxx:449
 TProofBench.cxx:450
 TProofBench.cxx:451
 TProofBench.cxx:452
 TProofBench.cxx:453
 TProofBench.cxx:454
 TProofBench.cxx:455
 TProofBench.cxx:456
 TProofBench.cxx:457
 TProofBench.cxx:458
 TProofBench.cxx:459
 TProofBench.cxx:460
 TProofBench.cxx:461
 TProofBench.cxx:462
 TProofBench.cxx:463
 TProofBench.cxx:464
 TProofBench.cxx:465
 TProofBench.cxx:466
 TProofBench.cxx:467
 TProofBench.cxx:468
 TProofBench.cxx:469
 TProofBench.cxx:470
 TProofBench.cxx:471
 TProofBench.cxx:472
 TProofBench.cxx:473
 TProofBench.cxx:474
 TProofBench.cxx:475
 TProofBench.cxx:476
 TProofBench.cxx:477
 TProofBench.cxx:478
 TProofBench.cxx:479
 TProofBench.cxx:480
 TProofBench.cxx:481
 TProofBench.cxx:482
 TProofBench.cxx:483
 TProofBench.cxx:484
 TProofBench.cxx:485
 TProofBench.cxx:486
 TProofBench.cxx:487
 TProofBench.cxx:488
 TProofBench.cxx:489
 TProofBench.cxx:490
 TProofBench.cxx:491
 TProofBench.cxx:492
 TProofBench.cxx:493
 TProofBench.cxx:494
 TProofBench.cxx:495
 TProofBench.cxx:496
 TProofBench.cxx:497
 TProofBench.cxx:498
 TProofBench.cxx:499
 TProofBench.cxx:500
 TProofBench.cxx:501
 TProofBench.cxx:502
 TProofBench.cxx:503
 TProofBench.cxx:504
 TProofBench.cxx:505
 TProofBench.cxx:506
 TProofBench.cxx:507
 TProofBench.cxx:508
 TProofBench.cxx:509
 TProofBench.cxx:510
 TProofBench.cxx:511
 TProofBench.cxx:512
 TProofBench.cxx:513
 TProofBench.cxx:514
 TProofBench.cxx:515
 TProofBench.cxx:516
 TProofBench.cxx:517
 TProofBench.cxx:518
 TProofBench.cxx:519
 TProofBench.cxx:520
 TProofBench.cxx:521
 TProofBench.cxx:522
 TProofBench.cxx:523
 TProofBench.cxx:524
 TProofBench.cxx:525
 TProofBench.cxx:526
 TProofBench.cxx:527
 TProofBench.cxx:528
 TProofBench.cxx:529
 TProofBench.cxx:530
 TProofBench.cxx:531
 TProofBench.cxx:532
 TProofBench.cxx:533
 TProofBench.cxx:534
 TProofBench.cxx:535
 TProofBench.cxx:536
 TProofBench.cxx:537
 TProofBench.cxx:538
 TProofBench.cxx:539
 TProofBench.cxx:540
 TProofBench.cxx:541
 TProofBench.cxx:542
 TProofBench.cxx:543
 TProofBench.cxx:544
 TProofBench.cxx:545
 TProofBench.cxx:546
 TProofBench.cxx:547
 TProofBench.cxx:548
 TProofBench.cxx:549
 TProofBench.cxx:550
 TProofBench.cxx:551
 TProofBench.cxx:552
 TProofBench.cxx:553
 TProofBench.cxx:554
 TProofBench.cxx:555
 TProofBench.cxx:556
 TProofBench.cxx:557
 TProofBench.cxx:558
 TProofBench.cxx:559
 TProofBench.cxx:560
 TProofBench.cxx:561
 TProofBench.cxx:562
 TProofBench.cxx:563
 TProofBench.cxx:564
 TProofBench.cxx:565
 TProofBench.cxx:566
 TProofBench.cxx:567
 TProofBench.cxx:568
 TProofBench.cxx:569
 TProofBench.cxx:570
 TProofBench.cxx:571
 TProofBench.cxx:572
 TProofBench.cxx:573
 TProofBench.cxx:574
 TProofBench.cxx:575
 TProofBench.cxx:576
 TProofBench.cxx:577
 TProofBench.cxx:578
 TProofBench.cxx:579
 TProofBench.cxx:580
 TProofBench.cxx:581
 TProofBench.cxx:582
 TProofBench.cxx:583
 TProofBench.cxx:584
 TProofBench.cxx:585
 TProofBench.cxx:586
 TProofBench.cxx:587
 TProofBench.cxx:588
 TProofBench.cxx:589
 TProofBench.cxx:590
 TProofBench.cxx:591
 TProofBench.cxx:592
 TProofBench.cxx:593
 TProofBench.cxx:594
 TProofBench.cxx:595
 TProofBench.cxx:596
 TProofBench.cxx:597
 TProofBench.cxx:598
 TProofBench.cxx:599
 TProofBench.cxx:600
 TProofBench.cxx:601
 TProofBench.cxx:602
 TProofBench.cxx:603
 TProofBench.cxx:604
 TProofBench.cxx:605
 TProofBench.cxx:606
 TProofBench.cxx:607
 TProofBench.cxx:608
 TProofBench.cxx:609
 TProofBench.cxx:610
 TProofBench.cxx:611
 TProofBench.cxx:612
 TProofBench.cxx:613
 TProofBench.cxx:614
 TProofBench.cxx:615
 TProofBench.cxx:616
 TProofBench.cxx:617
 TProofBench.cxx:618
 TProofBench.cxx:619
 TProofBench.cxx:620
 TProofBench.cxx:621
 TProofBench.cxx:622
 TProofBench.cxx:623
 TProofBench.cxx:624
 TProofBench.cxx:625
 TProofBench.cxx:626
 TProofBench.cxx:627
 TProofBench.cxx:628
 TProofBench.cxx:629
 TProofBench.cxx:630
 TProofBench.cxx:631
 TProofBench.cxx:632
 TProofBench.cxx:633
 TProofBench.cxx:634
 TProofBench.cxx:635
 TProofBench.cxx:636
 TProofBench.cxx:637
 TProofBench.cxx:638
 TProofBench.cxx:639
 TProofBench.cxx:640
 TProofBench.cxx:641
 TProofBench.cxx:642
 TProofBench.cxx:643
 TProofBench.cxx:644
 TProofBench.cxx:645
 TProofBench.cxx:646
 TProofBench.cxx:647
 TProofBench.cxx:648
 TProofBench.cxx:649
 TProofBench.cxx:650
 TProofBench.cxx:651
 TProofBench.cxx:652
 TProofBench.cxx:653
 TProofBench.cxx:654
 TProofBench.cxx:655
 TProofBench.cxx:656
 TProofBench.cxx:657
 TProofBench.cxx:658
 TProofBench.cxx:659
 TProofBench.cxx:660
 TProofBench.cxx:661
 TProofBench.cxx:662
 TProofBench.cxx:663
 TProofBench.cxx:664
 TProofBench.cxx:665
 TProofBench.cxx:666
 TProofBench.cxx:667
 TProofBench.cxx:668
 TProofBench.cxx:669
 TProofBench.cxx:670
 TProofBench.cxx:671
 TProofBench.cxx:672
 TProofBench.cxx:673
 TProofBench.cxx:674
 TProofBench.cxx:675
 TProofBench.cxx:676
 TProofBench.cxx:677
 TProofBench.cxx:678
 TProofBench.cxx:679
 TProofBench.cxx:680
 TProofBench.cxx:681
 TProofBench.cxx:682
 TProofBench.cxx:683
 TProofBench.cxx:684
 TProofBench.cxx:685
 TProofBench.cxx:686
 TProofBench.cxx:687
 TProofBench.cxx:688
 TProofBench.cxx:689
 TProofBench.cxx:690
 TProofBench.cxx:691
 TProofBench.cxx:692
 TProofBench.cxx:693
 TProofBench.cxx:694
 TProofBench.cxx:695
 TProofBench.cxx:696
 TProofBench.cxx:697
 TProofBench.cxx:698
 TProofBench.cxx:699
 TProofBench.cxx:700
 TProofBench.cxx:701
 TProofBench.cxx:702
 TProofBench.cxx:703
 TProofBench.cxx:704
 TProofBench.cxx:705
 TProofBench.cxx:706
 TProofBench.cxx:707
 TProofBench.cxx:708
 TProofBench.cxx:709
 TProofBench.cxx:710
 TProofBench.cxx:711
 TProofBench.cxx:712
 TProofBench.cxx:713
 TProofBench.cxx:714
 TProofBench.cxx:715
 TProofBench.cxx:716
 TProofBench.cxx:717
 TProofBench.cxx:718
 TProofBench.cxx:719
 TProofBench.cxx:720
 TProofBench.cxx:721
 TProofBench.cxx:722
 TProofBench.cxx:723
 TProofBench.cxx:724
 TProofBench.cxx:725
 TProofBench.cxx:726
 TProofBench.cxx:727
 TProofBench.cxx:728
 TProofBench.cxx:729
 TProofBench.cxx:730
 TProofBench.cxx:731
 TProofBench.cxx:732
 TProofBench.cxx:733
 TProofBench.cxx:734
 TProofBench.cxx:735
 TProofBench.cxx:736
 TProofBench.cxx:737
 TProofBench.cxx:738
 TProofBench.cxx:739
 TProofBench.cxx:740
 TProofBench.cxx:741
 TProofBench.cxx:742
 TProofBench.cxx:743
 TProofBench.cxx:744
 TProofBench.cxx:745
 TProofBench.cxx:746
 TProofBench.cxx:747
 TProofBench.cxx:748
 TProofBench.cxx:749
 TProofBench.cxx:750
 TProofBench.cxx:751
 TProofBench.cxx:752
 TProofBench.cxx:753
 TProofBench.cxx:754
 TProofBench.cxx:755
 TProofBench.cxx:756
 TProofBench.cxx:757
 TProofBench.cxx:758
 TProofBench.cxx:759
 TProofBench.cxx:760
 TProofBench.cxx:761
 TProofBench.cxx:762
 TProofBench.cxx:763
 TProofBench.cxx:764
 TProofBench.cxx:765
 TProofBench.cxx:766
 TProofBench.cxx:767
 TProofBench.cxx:768
 TProofBench.cxx:769
 TProofBench.cxx:770
 TProofBench.cxx:771
 TProofBench.cxx:772
 TProofBench.cxx:773
 TProofBench.cxx:774
 TProofBench.cxx:775
 TProofBench.cxx:776
 TProofBench.cxx:777
 TProofBench.cxx:778
 TProofBench.cxx:779
 TProofBench.cxx:780
 TProofBench.cxx:781
 TProofBench.cxx:782