/// \file
/// \ingroup tutorial_net
/// Client program which creates and fills 2 histograms and a TTree.
/// Every 1000000 fills the histograms and TTree is send to the server which displays the histogram.
///
/// To run this demo do the following:
///   - Open at least 2 windows
///   - Start ROOT in the first windows
///   - Execute in the first window: .x parallelMergeServer.C
///   - Execute in the other windows: root.exe -b -q .x 'parallelMergeClient.C("<socket path printed by server>")'
///     (You can put it in the background if wanted).
/// If you want to run the hserv.C on a different host, just change
/// "localhost" in the TSocket ctor below to the desired hostname.
///
/// \macro_code
///
/// \authors Fons Rademakers, Philippe Canal

#include "TMessage.h"
#include "TBenchmark.h"
#include "TSocket.h"
#include "TH2.h"
#include "TTree.h"
#include "TParallelMergingFile.h"
#include "TRandom.h"
#include "TError.h"

#include <string>

void parallelMergeClient(const std::string &socketPath)
{
   gBenchmark->Start("treeClient");

   TParallelMergingFile *file =
      (TParallelMergingFile *)TFile::Open((std::string("mergedClient.root?pmerge=") + socketPath).c_str(), "RECREATE");

   file->Write();
   file->UploadAndReset();       // We do this early to get assigned an index.
   UInt_t idx = file->GetServerIdx();

   TH1 *hpx;
   if (idx%2 == 0) {
      // Create the histogram
      hpx = new TH1F("hpx","This is the px distribution",100,-4,4);
      hpx->SetFillColor(48);  // set nice fill-color
   } else {
      hpx = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
   }
   Float_t px, py;
   TTree *tree = new TTree("tree","tree");
   tree->SetAutoFlush(4000000);
   tree->Branch("px",&px);
   tree->Branch("py",&py);

   // Fill histogram randomly
   gRandom->SetSeed();
   const int kUPDATE = 1000000;
   for (int i = 0; i < 25000000; ) {
      gRandom->Rannor(px,py);
      if (idx%2 == 0)
         hpx->Fill(px);
      else
         hpx->Fill(px,py);
      tree->Fill();
      ++i;
      if (i && (i%kUPDATE) == 0) {
         file->Write();
      }
   }
   file->Write();
   delete file;

   gBenchmark->Show("treeClient");
}
