ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)

#include <stdio.h>
#include <stdlib.h>
#include <TROOT.h>
#include <Riostream.h>
#include <TClassTable.h>
#include <TStyle.h>
#include <TMath.h>
#include <TFile.h>
#include <TCanvas.h>
#include <TH1.h>
#include <TH2.h>
#include <TProfile.h>
#include <TLine.h>
#include <TGrid.h>
#include <TBits.h>
#include <TChain.h>
#include <TNtuple.h>
#include <TTree.h>
#include <TBranch.h>
#include <TFileMerger.h>
#include <TGridResult.h>
#include <TSystem.h>
#include <TLegend.h>

#endif

void MakePlots(TString ntupleFileName);

void ZDCQAtrending(TString period,
		   TString recoPass,
		   TString qaTrain = "QA",
		   Bool_t useOnlyMerged = kTRUE,
		   Int_t firstRun = 0,
		   Int_t lastRun = 999999999,
		   TString runListFile = "",
		   TString fileName = "QAresults.root"){

  gStyle->SetOptStat(0);

  TGrid::Connect("alien:");
  Int_t year = 0;
  if(period.Contains("LHC09")) year = 2009;
  else if(period.Contains("LHC10")) year = 2010;
  else if(period.Contains("LHC11")) year = 2011;
  
  Bool_t useExternalList = kFALSE;
  Int_t runList[10000];
  Int_t totRuns = 0;
  if(runListFile.Length()>0){
    if(!gSystem->Exec(Form("ls -l %s > /dev/null 2>&1",runListFile.Data()))){
      printf("Use Run List from %s  --- runs to be analyzed:\n",runListFile.Data());
      useExternalList = kTRUE;
      FILE* rfil = fopen(runListFile.Data(),"r");
      Int_t nrun;
      while(!feof(rfil)){
	int stat = fscanf(rfil,"%d, ",&nrun);
	if(feof(rfil)) break;
	runList[totRuns++] = nrun;
      }
      for(Int_t ir = 0; ir<totRuns; ir++){
	printf("%d\n",runList[ir]);
      }
    }
    else{
      printf("File with run list does not exist\n");
    }
  }

  TString outFilNam = Form("ZDCtrend_%s_%s_%s.root",period.Data(),recoPass.Data(),qaTrain.Data());

 
  const Int_t nVariables = 27;
  TNtuple* ntzdc = new TNtuple("ntzdc","ZDC trending",
  "nrun:meanZNC:meanZPC:meanZNA:meanZPA:meanZEM1:meanZEM2:emeanZNC:emeanZPC:emeanZNA:emeanZPA:emeanZEM1:emeanZEM2:"
  "ZNClg:ZNAlg:eZNClg:eZNAlg:pmcZNClg:pmcZNAlg:epmcZNClg:epmcZNAlg:xZNC:yZNC:xZNA:yZNA:tdcSum:tdcDiff");
  Float_t xnt[nVariables];

  TBits* readRun = new TBits(999999);
  readRun->ResetAllBits();
  if(!useExternalList){
    if(!gSystem->Exec(Form("ls -l %s > /dev/null 2>&1",outFilNam.Data()))){
      TFile* oldfil = new TFile(outFilNam.Data());
      TNtuple* ntmp = (TNtuple*)oldfil->Get("ntzdc");
      Bool_t isOK = kFALSE;
      if(ntmp){
	if(ntmp->GetNvar() == ntzdc->GetNvar()){
	  isOK = kTRUE;
	  TObjArray* arr1 = (TObjArray*)ntzdc->GetListOfBranches();
	  TObjArray* arr2 = (TObjArray*)ntmp->GetListOfBranches();
	  for(Int_t iV = 0; iV<ntmp->GetNvar(); iV++){
	    TString vnam1 = arr1->At(iV)->GetName();
	    TString vnam2 = arr2->At(iV)->GetName();
	    if(vnam1 != vnam2) isOK = kFALSE;
	    ntmp->SetBranchAddress(vnam2.Data(),&xnt[iV]);
	  }
	  if(isOK){
	    for(Int_t nE = 0; nE<ntmp->GetEntries(); nE++){
	      ntmp->GetEvent(nE);
	      Int_t theRun = (Int_t)(xnt[0]+0.0001);
	      readRun->SetBitNumber(theRun);
	      ntzdc->Fill(xnt);
	    }
	  }
	}
      }
      if(!isOK){
	printf("Ntuple in local file not OK -> will be recreated\n");
      }
      oldfil->Close();
      delete oldfil;
    }
  }

  if(!gGrid||!gGrid->IsConnected()) {
    printf("gGrid not found! exit macro\n");
    return;
  }

  TString  path = Form("/alice/data/%d/%s/",year,period.Data());
  TGridResult *gr  =  gGrid->Query(path,fileName);
  Int_t nFiles  =  gr->GetEntries();
  printf(" --->%d merged QAresults.root files found in %s\n", nFiles,path.Data());
  if(nFiles < 1) return;

  Int_t nAnalyzedFiles = 0;
  if(nFiles > 1){
    for(Int_t iFil  =  0; iFil <nFiles ; iFil++) { 
      TString fileNameLong = Form("%s",gr->GetKey(iFil,"turl"));
      if(!fileNameLong.Contains(recoPass.Data())) continue;
// Commented Sep. 2011
//      if(!fileNameLong.Contains(qaTrain.Data())) continue;
//      if(fileNameLong.Contains("TRD") || fileNameLong.Contains("EMCAL")) continue;
      TString runNumber = fileNameLong;
      runNumber.ReplaceAll(Form("alien:///alice/data/%d/%s/",year,period.Data()),"");
      runNumber.Remove(9,runNumber.Sizeof());
   
      Int_t iRun = atoi(runNumber.Data());
      //printf("  runNumber: %s -> iRun %d\n",runNumber.Data(), iRun);
      if(useExternalList){
	Bool_t keepRun = kFALSE;
	for(Int_t ir = 0; ir<totRuns; ir++){
	  if(iRun == runList[ir]){
	    keepRun = kTRUE;
	    break;
	  }
	}
	if(!keepRun) continue;
      }
      if(readRun->TestBitNumber(iRun)){ 
	printf("Run %d already in local ntuple -> skipping it\n",iRun);
	continue;
      }
      if(iRun<firstRun) continue;
      if(iRun>lastRun) continue;    

printf("  fileNameLog: %s\n",fileNameLong.Data());
      if(useOnlyMerged){
	TString isMerged = fileNameLong;
	//
	if(!isMerged.Contains(recoPass.Data())) continue;
	if(isMerged.Contains("Stage")) continue;
printf("  ->  isMerged: %s\n",isMerged.Data());
	isMerged.Remove(0,isMerged.Sizeof()-20); 
printf("  ->  isMerged: %s\n",isMerged.Data());
	if(!isMerged.Contains(qaTrain) || !isMerged.Contains("QAresults.root")) continue;
printf("isMerged %s\n",isMerged.Data());
	
      }
      printf("Open File %s  \n",fileNameLong.Data());
      

      TFile* f = TFile::Open(fileNameLong.Data());  

      TDirectoryFile* df = (TDirectoryFile*)f->Get("ZDC_Performance");
      if(!df){
	printf("Run %d ZDC_Performance MISSING -> Exit\n",iRun);
	continue;
      }
      TList* l = (TList*)df->Get("QAZDCHists");
      if(!df){
	printf("Run %d QAZDCHists TList MISSING -> Exit\n",iRun);
	continue;
      }  

      nAnalyzedFiles++;
      if(!useOnlyMerged) readRun->SetBitNumber(iRun);

      TH1F *fhTDCZNSum     = (TH1F*)l->FindObject("fhTDCZNSum");     
      TH1F *fhTDCZNDiff    = (TH1F*)l->FindObject("fhTDCZNDiff");    
      TH1F *fhZNCSpectrum  = (TH1F*)l->FindObject("fhZNCSpectrum");  
      TH1F *fhZNASpectrum  = (TH1F*)l->FindObject("fhZNASpectrum");  
      TH1F *fhZPCSpectrum  = (TH1F*)l->FindObject("fhZPCSpectrum");  
      TH1F *fhZPASpectrum  = (TH1F*)l->FindObject("fhZPASpectrum");  
      TH1F *fhZEM1Spectrum = (TH1F*)l->FindObject("fhZEM1Spectrum"); 
      TH1F *fhZEM2Spectrum = (TH1F*)l->FindObject("fhZEM2Spectrum"); 
      /*TH1F *fhZNCpmc   = (TH1F*)l->FindObject("fhZNCpmc");   
      TH1F *fhZNApmc   = (TH1F*)l->FindObject("fhZNApmc");   
      TH1F *fhZPCpmc   = (TH1F*)l->FindObject("fhZPCpmc");   
      TH1F *fhZPApmc   = (TH1F*)l->FindObject("fhZPApmc");*/   
      TH2F *fhZNCCentroid  = (TH2F*)l->FindObject("fhZNCCentroid");  
      TH2F *fhZNACentroid  = (TH2F*)l->FindObject("fhZNACentroid");   
      TH1F *fhZNCemd   = (TH1F*)l->FindObject("fhZNCemd");   
      TH1F *fhZNAemd   = (TH1F*)l->FindObject("fhZNAemd");   
      TH1F *fhPMCZNCemd    = (TH1F*)l->FindObject("fhPMCZNCemd");    
      TH1F *fhPMCZNAemd    = (TH1F*)l->FindObject("fhPMCZNAemd");    
 
      TH1D *hxZNC = fhZNCCentroid->ProjectionX("hxZNC");
      TH1D *hyZNC = fhZNCCentroid->ProjectionY("hyZNC");
      TH1D *hxZNA = fhZNACentroid->ProjectionX("hxZNA");
      TH1D *hyZNA = fhZNACentroid->ProjectionY("hyZNA");
      
      Int_t index = 0;
      xnt[index++] = (Float_t)iRun;
      xnt[index++] = fhZNCSpectrum->GetMean();
      xnt[index++] = fhZPCSpectrum->GetMean();
      xnt[index++] = fhZNASpectrum->GetMean();
      xnt[index++] = fhZPASpectrum->GetMean();
      xnt[index++] = fhZEM1Spectrum->GetMean();
      xnt[index++] = fhZEM2Spectrum->GetMean();
      if(fhZNCSpectrum->GetEntries()>0)  xnt[index++] = fhZNCSpectrum->GetMean()/fhZNCSpectrum->GetEntries();
      if(fhZPCSpectrum->GetEntries()>0)  xnt[index++] = fhZPCSpectrum->GetMean()/fhZPCSpectrum->GetEntries();
      if(fhZNASpectrum->GetEntries()>0)  xnt[index++] = fhZNASpectrum->GetMean()/fhZNASpectrum->GetEntries();
      if(fhZPASpectrum->GetEntries()>0)  xnt[index++] = fhZPASpectrum->GetMean()/fhZPASpectrum->GetEntries();
      if(fhZEM1Spectrum->GetEntries()>0) xnt[index++] = fhZEM1Spectrum->GetMean()/fhZEM1Spectrum->GetEntries();
      if(fhZEM2Spectrum->GetEntries()>0) xnt[index++] = fhZEM2Spectrum->GetMean()/fhZEM2Spectrum->GetEntries();
      xnt[index++] = fhZNCemd->GetMean();
      xnt[index++] = fhZNAemd->GetMean();
      if(fhZNCemd->GetEntries()>0) xnt[index++] = fhZNCemd->GetMean()/fhZNCemd->GetEntries();
      if(fhZNAemd->GetEntries()>0) xnt[index++] = fhZNAemd->GetMean()/fhZNAemd->GetEntries();
      xnt[index++] = fhPMCZNCemd->GetMean();
      xnt[index++] = fhPMCZNAemd->GetMean();
      if(fhPMCZNCemd->GetEntries()>0) xnt[index++] = fhPMCZNCemd->GetMean()/fhPMCZNCemd->GetEntries();
      if(fhPMCZNAemd->GetEntries()>0) xnt[index++] = fhPMCZNAemd->GetMean()/fhPMCZNAemd->GetEntries();
      xnt[index++] = hxZNC->GetMean();
      xnt[index++] = hyZNC->GetMean();
      xnt[index++] = hxZNA->GetMean();
      xnt[index++] = hyZNA->GetMean();
      xnt[index++] = fhTDCZNSum->GetMean();
      xnt[index++] = fhTDCZNDiff->GetMean();
      ntzdc->Fill(xnt);
    }
  }
  printf("Number of analyzed files  =  %d\n",nAnalyzedFiles);

  if(nAnalyzedFiles>0){
    TFile* outfil = new TFile(outFilNam.Data(),"recreate");
    outfil->cd();
    ntzdc->Write();
    outfil->Close();
    
    MakePlots(outFilNam);
  }
}

void MakePlots(TString ntupleFileName){
  TFile* fil = new TFile(ntupleFileName.Data(),"read");
  if(!fil){
    printf("File with ntuple does not exist\n");
    return;
  }
  TNtuple* ntzdc = (TNtuple*)fil->Get("ntzdc");

  Float_t nrun;
  Float_t meanZNC,meanZPC,meanZNA,meanZPA,meanZEM1,meanZEM2;
  Float_t emeanZNC,emeanZPC,emeanZNA,emeanZPA,emeanZEM1,emeanZEM2;
  Float_t ZNClg,ZNAlg,pmcZNClg,pmcZNAlg;
  Float_t eZNClg,eZNAlg,epmcZNClg,epmcZNAlg;
  Float_t xZNC,yZNC,xZNA,yZNA,tdcSum,tdcDiff;
  
  ntzdc->SetBranchAddress("nrun",&nrun);
  ntzdc->SetBranchAddress("meanZNC",&meanZNC);
  ntzdc->SetBranchAddress("meanZPC",&meanZPC);
  ntzdc->SetBranchAddress("meanZNA",&meanZNA);
  ntzdc->SetBranchAddress("meanZPA",&meanZPA);
  ntzdc->SetBranchAddress("meanZEM1",&meanZEM1);
  ntzdc->SetBranchAddress("meanZEM2",&meanZEM2);
  ntzdc->SetBranchAddress("emeanZNC",&emeanZNC);
  ntzdc->SetBranchAddress("emeanZPC",&emeanZPC);
  ntzdc->SetBranchAddress("emeanZNA",&emeanZNA);
  ntzdc->SetBranchAddress("emeanZPA",&emeanZPA);
  ntzdc->SetBranchAddress("emeanZEM1",&emeanZEM1);
  ntzdc->SetBranchAddress("emeanZEM2",&emeanZEM2);
  ntzdc->SetBranchAddress("ZNClg",&ZNClg);
  ntzdc->SetBranchAddress("ZNAlg",&ZNAlg);
  ntzdc->SetBranchAddress("eZNClg",&eZNClg);
  ntzdc->SetBranchAddress("eZNAlg",&eZNAlg);
  ntzdc->SetBranchAddress("pmcZNClg",&pmcZNClg);
  ntzdc->SetBranchAddress("pmcZNAlg",&pmcZNAlg);
  ntzdc->SetBranchAddress("epmcZNClg",&epmcZNClg);
  ntzdc->SetBranchAddress("epmcZNAlg",&epmcZNAlg);
  ntzdc->SetBranchAddress("xZNC",&xZNC);
  ntzdc->SetBranchAddress("yZNC",&yZNC);
  ntzdc->SetBranchAddress("xZNA",&xZNA);
  ntzdc->SetBranchAddress("yZNA",&yZNA);
  ntzdc->SetBranchAddress("tdcSum",&tdcSum);
  ntzdc->SetBranchAddress("tdcDiff",&tdcDiff);

  TH1F *hznc      = new TH1F("hznc","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hzna      = new TH1F("hzna","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hzpc      = new TH1F("hzpc","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hzpa      = new TH1F("hzpa","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hzem1     = new TH1F("hzem1","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hzem2     = new TH1F("hzem2","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hznclg    = new TH1F("hznclg","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hznalg    = new TH1F("hznalg","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hpmcznclg = new TH1F("hpmcznclg","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hpmcznalg = new TH1F("hpmcznalg","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hxznc     = new TH1F("hxznc","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hyznc     = new TH1F("hyznc","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hxzna     = new TH1F("hxzna","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *hyzna     = new TH1F("hyzna","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *htdcsum   = new TH1F("htdcsum","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());
  TH1F *htdcdiff  = new TH1F("htdcdiff","",(Int_t)ntzdc->GetEntries(),0.,ntzdc->GetEntries());

  for(Int_t i = 0; i<ntzdc->GetEntries();i++){
    ntzdc->GetEvent(i);
    //
    hznc->SetBinContent(i+1, meanZNC);
    hznc->SetBinError(i+1, emeanZNC);
    hznc->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hznc->GetXaxis()->SetTitle("RUN #");
    hznc->GetYaxis()->SetTitle("ZNC mean signal");
    hzpc->SetBinContent(i+1, meanZPC);
    hzpc->SetBinError(i+1, emeanZPC);
    hzpc->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hzpc->GetXaxis()->SetTitle("RUN #");
    hzpc->GetYaxis()->SetTitle("ZPC mean signal");
    hzna->SetBinContent(i+1, meanZNA);
    hzna->SetBinError(i+1, emeanZNA);
    hzna->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hzna->GetXaxis()->SetTitle("RUN #");
    hzna->GetYaxis()->SetTitle("ZNA mean signal");
    hzpa->SetBinContent(i+1, meanZPA);
    hzpa->SetBinError(i+1, emeanZPA);
    hzpa->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hzpa->GetXaxis()->SetTitle("RUN #");
    hzpa->GetYaxis()->SetTitle("ZPA mean signal");
    hzem1->SetBinContent(i+1, meanZEM1);
    hzem1->SetBinError(i+1, emeanZEM1);
    hzem1->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hzem1->GetXaxis()->SetTitle("RUN #");
    hzem1->GetYaxis()->SetTitle("ZEM1 mean signal");
    hzem2->SetBinContent(i+1, meanZEM2);
    hzem2->SetBinError(i+1, emeanZEM2);
    hzem2->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hzem2->GetXaxis()->SetTitle("RUN #");
    hzem2->GetYaxis()->SetTitle("ZEM1 mean signal");
    hznclg->SetBinContent(i+1, ZNClg);
    hznclg->SetBinError(i+1, eZNClg);
    hznclg->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hznclg->GetXaxis()->SetTitle("RUN #");
    hznclg->GetYaxis()->SetTitle("ZNC LG mean signal");
    hznalg->SetBinContent(i+1, ZNAlg);
    hznalg->SetBinError(i+1, eZNAlg);
    hznalg->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hznalg->GetXaxis()->SetTitle("RUN #");
    hznalg->GetYaxis()->SetTitle("ZNA LG mean signal");
    hpmcznclg->SetBinContent(i+1, pmcZNClg);
    hpmcznclg->SetBinError(i+1, epmcZNClg);
    hpmcznclg->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hpmcznclg->GetXaxis()->SetTitle("RUN #");
    hpmcznclg->GetYaxis()->SetTitle("ZNC LG PMC mean signal");
    hpmcznalg->SetBinContent(i+1, pmcZNAlg);
    hpmcznalg->SetBinError(i+1, epmcZNAlg);
    hpmcznalg->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hpmcznalg->GetXaxis()->SetTitle("RUN #");
    hpmcznalg->GetYaxis()->SetTitle("ZNC LG PMC mean signal");
    hxznc->SetBinContent(i+1, xZNC);
    hxznc->SetBinError(i+1, 0.1*xZNC);
    hxznc->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hxznc->GetXaxis()->SetTitle("RUN #");
    hxznc->GetYaxis()->SetTitle("X_{ZN} (cm)");
    hyznc->SetBinContent(i+1, yZNC);
    hyznc->SetBinError(i+1, 0.1*yZNC);
    hyznc->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hyznc->GetXaxis()->SetTitle("RUN #");
    hyznc->GetYaxis()->SetTitle("Y_{ZN} (cm)");
    hxzna->SetBinContent(i+1, xZNA);
    hxzna->SetBinError(i+1, 0.1*xZNA);
    hxzna->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hxzna->GetXaxis()->SetTitle("RUN #");
    hxzna->GetYaxis()->SetTitle("X_{ZN} (cm)");
    hyzna->SetBinContent(i+1, yZNA);
    hyzna->SetBinError(i+1, 0.1*yZNA);
    hyzna->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    hyzna->GetXaxis()->SetTitle("RUN #");
    hyzna->GetYaxis()->SetTitle("Y_{ZN} (cm)");
    htdcsum->SetBinContent(i+1, tdcSum);
    htdcsum->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    htdcsum->GetXaxis()->SetTitle("RUN #");
    htdcsum->GetYaxis()->SetTitle("TDC Sum (ns)");
    htdcdiff->SetBinContent(i+1, tdcDiff);
    htdcdiff->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
    htdcdiff->GetXaxis()->SetTitle("RUN #");
    htdcdiff->GetYaxis()->SetTitle("TDC Diff (ns)");
  }

  
  TCanvas *c1 = new TCanvas("c1", "Mean value ZNs", 0, 0, 1200, 1000);
  c1->Divide(1,2);
  //
  c1->cd(1); 
  hznc->SetMarkerColor(kAzure+6); hznc->SetLineColor(kAzure+6); 
  hznc->SetMarkerStyle(21);
  hznc->Draw(""); 
  hzna->SetMarkerColor(kPink-2);  hzna->SetLineColor(kPink-2);
  hzna->SetMarkerStyle(20);
  hzna->Draw("SAME"); 
  //
  TLegend *l1 = new TLegend(0.44,0.18,0.54,0.32);
  l1->SetFillColor(kWhite);
  l1->AddEntry(hznc," ZNC " ,"P");
  l1->AddEntry(hzna," ZNA " ,"P");
  l1->Draw("");
  //
  c1->cd(2);
  hznalg->SetMarkerColor(kBlue+1); hznalg->SetLineColor(kBlue+1); 
  hznalg->SetMarkerStyle(20);  hznalg->SetMinimum(0);
  hznalg->Draw("");
  hznclg->SetMarkerColor(kPink+5); hznclg->SetLineColor(kPink+5); 
  hznclg->SetMarkerStyle(21);
  hznclg->Draw("SAME"); 
  //
  TLegend *l2 = new TLegend(0.44,0.18,0.54,0.32);
  l2->SetFillColor(kWhite);
  l2->AddEntry(hznc," ZNC LG " ,"P");
  l2->AddEntry(hzna," ZNA LG " ,"P");
  l2->Draw("");
  

  TCanvas *c1b = new TCanvas("c1b", "Mean value ZEMs ZPs", 200, 0, 1200, 1000);
  c1b->Divide(1,2);
  c1b->cd(1); 
  hzpc->SetMarkerColor(kAzure+6); hzpc->SetLineColor(kAzure+6); 
  hzpc->SetMarkerStyle(21);
  hzpc->Draw(""); 
  hzpa->SetMarkerColor(kPink-2);  hzpa->SetLineColor(kPink-2);
  hzpa->SetMarkerStyle(20);
  hzpa->Draw("SAME"); 
  //
  TLegend *l3 = new TLegend(0.44,0.18,0.54,0.32);
  l3->SetFillColor(kWhite);
  l3->AddEntry(hzpc," ZPC " ,"P");
  l3->AddEntry(hzpa," ZPA " ,"P");
  l3->Draw("");
  
  c1b->cd(2);
  hzem1->SetMarkerColor(kTeal-7); hzem1->SetLineColor(kTeal-7);
  hzem1->SetMarkerStyle(29);
  hzem2->SetMarkerColor(kTeal+5); hzem2->SetLineColor(kTeal+5);
  hzem2->SetMarkerStyle(30);
  hzem2->Draw(""); 
  hzem1->Draw("SAME"); 
  //
  TLegend *l4 = new TLegend(0.44,0.18,0.54,0.32);
  l4->SetFillColor(kWhite);
  l4->AddEntry(hzem1," ZEM1 " ,"P");
  l4->AddEntry(hzem2," ZEM2 " ,"P");
  l4->Draw("");
 
  
  /*TCanvas *c2 = new TCanvas("c2", "ZN centroids", 400, 400, 1200, 1000);
  c2->Divide(1,2);
  //
  c2->cd(1);
  hxznc->SetMarkerColor(kAzure+5); hxznc->SetLineColor(kAzure+5);
  hxznc->SetMarkerStyle(21); 
  hxzna->SetMarkerColor(kPink+5); hxzna->SetLineColor(kPink+5);
  hxzna->SetMarkerStyle(20); 
  hxznc->Draw(""); 
  hxzna->Draw("SAME");
  c2->cd(2);
  hyznc->SetMarkerColor(kAzure+5); hyznc->SetLineColor(kAzure+5);
  hyznc->SetMarkerStyle(21); 
  hyzna->SetMarkerColor(kPink+5); hyzna->SetLineColor(kPink+5);
  hyzna->SetMarkerStyle(20); 
  hyznc->Draw(""); 
  hyzna->Draw("SAME");*/

  
  TCanvas *c3 = new TCanvas("c3", "LG signals", 600, 0, 1200, 1000);
  c3->Divide(1,2);
  //
  c3->cd(1);
  hznalg->SetMarkerColor(kBlue+1); hznalg->SetLineColor(kBlue+1); 
  hznalg->SetMarkerStyle(20);
  hznalg->Draw(""); 
  hznclg->SetMarkerColor(kPink+5); hznclg->SetLineColor(kPink+5); 
  hznclg->SetMarkerStyle(21);
  hznclg->Draw("SAME"); 
  TLegend *l7 = new TLegend(0.44,0.18,0.54,0.32);
  l7->SetFillColor(kWhite);
  l7->AddEntry(hznclg," ZNC LG " ,"P");
  l7->AddEntry(hznalg," ZNA LG " ,"P");
  l7->Draw("");
  //
  c3->cd(2);
  hpmcznalg->SetMarkerColor(kAzure+7); hpmcznalg->SetLineColor(kAzure+7); 
  hpmcznalg->SetMarkerStyle(20); hpmcznalg->SetMinimum(0);
  hpmcznalg->Draw(""); 
  hpmcznclg->SetMarkerColor(kPink+6); hpmcznclg->SetLineColor(kPink+6); 
  hpmcznclg->SetMarkerStyle(21);
  hpmcznclg->Draw("SAME"); 
  TLegend *l8 = new TLegend(0.44,0.15,0.58,0.32);
  l8->SetFillColor(kWhite);
  l8->AddEntry(hpmcznclg," ZNC LG PMC" ,"P");
  l8->AddEntry(hpmcznalg," ZNA LG PMC" ,"P");
  l8->Draw("");
}
 ZDCQAtrending.C:1
 ZDCQAtrending.C:2
 ZDCQAtrending.C:3
 ZDCQAtrending.C:4
 ZDCQAtrending.C:5
 ZDCQAtrending.C:6
 ZDCQAtrending.C:7
 ZDCQAtrending.C:8
 ZDCQAtrending.C:9
 ZDCQAtrending.C:10
 ZDCQAtrending.C:11
 ZDCQAtrending.C:12
 ZDCQAtrending.C:13
 ZDCQAtrending.C:14
 ZDCQAtrending.C:15
 ZDCQAtrending.C:16
 ZDCQAtrending.C:17
 ZDCQAtrending.C:18
 ZDCQAtrending.C:19
 ZDCQAtrending.C:20
 ZDCQAtrending.C:21
 ZDCQAtrending.C:22
 ZDCQAtrending.C:23
 ZDCQAtrending.C:24
 ZDCQAtrending.C:25
 ZDCQAtrending.C:26
 ZDCQAtrending.C:27
 ZDCQAtrending.C:28
 ZDCQAtrending.C:29
 ZDCQAtrending.C:30
 ZDCQAtrending.C:31
 ZDCQAtrending.C:32
 ZDCQAtrending.C:33
 ZDCQAtrending.C:34
 ZDCQAtrending.C:35
 ZDCQAtrending.C:36
 ZDCQAtrending.C:37
 ZDCQAtrending.C:38
 ZDCQAtrending.C:39
 ZDCQAtrending.C:40
 ZDCQAtrending.C:41
 ZDCQAtrending.C:42
 ZDCQAtrending.C:43
 ZDCQAtrending.C:44
 ZDCQAtrending.C:45
 ZDCQAtrending.C:46
 ZDCQAtrending.C:47
 ZDCQAtrending.C:48
 ZDCQAtrending.C:49
 ZDCQAtrending.C:50
 ZDCQAtrending.C:51
 ZDCQAtrending.C:52
 ZDCQAtrending.C:53
 ZDCQAtrending.C:54
 ZDCQAtrending.C:55
 ZDCQAtrending.C:56
 ZDCQAtrending.C:57
 ZDCQAtrending.C:58
 ZDCQAtrending.C:59
 ZDCQAtrending.C:60
 ZDCQAtrending.C:61
 ZDCQAtrending.C:62
 ZDCQAtrending.C:63
 ZDCQAtrending.C:64
 ZDCQAtrending.C:65
 ZDCQAtrending.C:66
 ZDCQAtrending.C:67
 ZDCQAtrending.C:68
 ZDCQAtrending.C:69
 ZDCQAtrending.C:70
 ZDCQAtrending.C:71
 ZDCQAtrending.C:72
 ZDCQAtrending.C:73
 ZDCQAtrending.C:74
 ZDCQAtrending.C:75
 ZDCQAtrending.C:76
 ZDCQAtrending.C:77
 ZDCQAtrending.C:78
 ZDCQAtrending.C:79
 ZDCQAtrending.C:80
 ZDCQAtrending.C:81
 ZDCQAtrending.C:82
 ZDCQAtrending.C:83
 ZDCQAtrending.C:84
 ZDCQAtrending.C:85
 ZDCQAtrending.C:86
 ZDCQAtrending.C:87
 ZDCQAtrending.C:88
 ZDCQAtrending.C:89
 ZDCQAtrending.C:90
 ZDCQAtrending.C:91
 ZDCQAtrending.C:92
 ZDCQAtrending.C:93
 ZDCQAtrending.C:94
 ZDCQAtrending.C:95
 ZDCQAtrending.C:96
 ZDCQAtrending.C:97
 ZDCQAtrending.C:98
 ZDCQAtrending.C:99
 ZDCQAtrending.C:100
 ZDCQAtrending.C:101
 ZDCQAtrending.C:102
 ZDCQAtrending.C:103
 ZDCQAtrending.C:104
 ZDCQAtrending.C:105
 ZDCQAtrending.C:106
 ZDCQAtrending.C:107
 ZDCQAtrending.C:108
 ZDCQAtrending.C:109
 ZDCQAtrending.C:110
 ZDCQAtrending.C:111
 ZDCQAtrending.C:112
 ZDCQAtrending.C:113
 ZDCQAtrending.C:114
 ZDCQAtrending.C:115
 ZDCQAtrending.C:116
 ZDCQAtrending.C:117
 ZDCQAtrending.C:118
 ZDCQAtrending.C:119
 ZDCQAtrending.C:120
 ZDCQAtrending.C:121
 ZDCQAtrending.C:122
 ZDCQAtrending.C:123
 ZDCQAtrending.C:124
 ZDCQAtrending.C:125
 ZDCQAtrending.C:126
 ZDCQAtrending.C:127
 ZDCQAtrending.C:128
 ZDCQAtrending.C:129
 ZDCQAtrending.C:130
 ZDCQAtrending.C:131
 ZDCQAtrending.C:132
 ZDCQAtrending.C:133
 ZDCQAtrending.C:134
 ZDCQAtrending.C:135
 ZDCQAtrending.C:136
 ZDCQAtrending.C:137
 ZDCQAtrending.C:138
 ZDCQAtrending.C:139
 ZDCQAtrending.C:140
 ZDCQAtrending.C:141
 ZDCQAtrending.C:142
 ZDCQAtrending.C:143
 ZDCQAtrending.C:144
 ZDCQAtrending.C:145
 ZDCQAtrending.C:146
 ZDCQAtrending.C:147
 ZDCQAtrending.C:148
 ZDCQAtrending.C:149
 ZDCQAtrending.C:150
 ZDCQAtrending.C:151
 ZDCQAtrending.C:152
 ZDCQAtrending.C:153
 ZDCQAtrending.C:154
 ZDCQAtrending.C:155
 ZDCQAtrending.C:156
 ZDCQAtrending.C:157
 ZDCQAtrending.C:158
 ZDCQAtrending.C:159
 ZDCQAtrending.C:160
 ZDCQAtrending.C:161
 ZDCQAtrending.C:162
 ZDCQAtrending.C:163
 ZDCQAtrending.C:164
 ZDCQAtrending.C:165
 ZDCQAtrending.C:166
 ZDCQAtrending.C:167
 ZDCQAtrending.C:168
 ZDCQAtrending.C:169
 ZDCQAtrending.C:170
 ZDCQAtrending.C:171
 ZDCQAtrending.C:172
 ZDCQAtrending.C:173
 ZDCQAtrending.C:174
 ZDCQAtrending.C:175
 ZDCQAtrending.C:176
 ZDCQAtrending.C:177
 ZDCQAtrending.C:178
 ZDCQAtrending.C:179
 ZDCQAtrending.C:180
 ZDCQAtrending.C:181
 ZDCQAtrending.C:182
 ZDCQAtrending.C:183
 ZDCQAtrending.C:184
 ZDCQAtrending.C:185
 ZDCQAtrending.C:186
 ZDCQAtrending.C:187
 ZDCQAtrending.C:188
 ZDCQAtrending.C:189
 ZDCQAtrending.C:190
 ZDCQAtrending.C:191
 ZDCQAtrending.C:192
 ZDCQAtrending.C:193
 ZDCQAtrending.C:194
 ZDCQAtrending.C:195
 ZDCQAtrending.C:196
 ZDCQAtrending.C:197
 ZDCQAtrending.C:198
 ZDCQAtrending.C:199
 ZDCQAtrending.C:200
 ZDCQAtrending.C:201
 ZDCQAtrending.C:202
 ZDCQAtrending.C:203
 ZDCQAtrending.C:204
 ZDCQAtrending.C:205
 ZDCQAtrending.C:206
 ZDCQAtrending.C:207
 ZDCQAtrending.C:208
 ZDCQAtrending.C:209
 ZDCQAtrending.C:210
 ZDCQAtrending.C:211
 ZDCQAtrending.C:212
 ZDCQAtrending.C:213
 ZDCQAtrending.C:214
 ZDCQAtrending.C:215
 ZDCQAtrending.C:216
 ZDCQAtrending.C:217
 ZDCQAtrending.C:218
 ZDCQAtrending.C:219
 ZDCQAtrending.C:220
 ZDCQAtrending.C:221
 ZDCQAtrending.C:222
 ZDCQAtrending.C:223
 ZDCQAtrending.C:224
 ZDCQAtrending.C:225
 ZDCQAtrending.C:226
 ZDCQAtrending.C:227
 ZDCQAtrending.C:228
 ZDCQAtrending.C:229
 ZDCQAtrending.C:230
 ZDCQAtrending.C:231
 ZDCQAtrending.C:232
 ZDCQAtrending.C:233
 ZDCQAtrending.C:234
 ZDCQAtrending.C:235
 ZDCQAtrending.C:236
 ZDCQAtrending.C:237
 ZDCQAtrending.C:238
 ZDCQAtrending.C:239
 ZDCQAtrending.C:240
 ZDCQAtrending.C:241
 ZDCQAtrending.C:242
 ZDCQAtrending.C:243
 ZDCQAtrending.C:244
 ZDCQAtrending.C:245
 ZDCQAtrending.C:246
 ZDCQAtrending.C:247
 ZDCQAtrending.C:248
 ZDCQAtrending.C:249
 ZDCQAtrending.C:250
 ZDCQAtrending.C:251
 ZDCQAtrending.C:252
 ZDCQAtrending.C:253
 ZDCQAtrending.C:254
 ZDCQAtrending.C:255
 ZDCQAtrending.C:256
 ZDCQAtrending.C:257
 ZDCQAtrending.C:258
 ZDCQAtrending.C:259
 ZDCQAtrending.C:260
 ZDCQAtrending.C:261
 ZDCQAtrending.C:262
 ZDCQAtrending.C:263
 ZDCQAtrending.C:264
 ZDCQAtrending.C:265
 ZDCQAtrending.C:266
 ZDCQAtrending.C:267
 ZDCQAtrending.C:268
 ZDCQAtrending.C:269
 ZDCQAtrending.C:270
 ZDCQAtrending.C:271
 ZDCQAtrending.C:272
 ZDCQAtrending.C:273
 ZDCQAtrending.C:274
 ZDCQAtrending.C:275
 ZDCQAtrending.C:276
 ZDCQAtrending.C:277
 ZDCQAtrending.C:278
 ZDCQAtrending.C:279
 ZDCQAtrending.C:280
 ZDCQAtrending.C:281
 ZDCQAtrending.C:282
 ZDCQAtrending.C:283
 ZDCQAtrending.C:284
 ZDCQAtrending.C:285
 ZDCQAtrending.C:286
 ZDCQAtrending.C:287
 ZDCQAtrending.C:288
 ZDCQAtrending.C:289
 ZDCQAtrending.C:290
 ZDCQAtrending.C:291
 ZDCQAtrending.C:292
 ZDCQAtrending.C:293
 ZDCQAtrending.C:294
 ZDCQAtrending.C:295
 ZDCQAtrending.C:296
 ZDCQAtrending.C:297
 ZDCQAtrending.C:298
 ZDCQAtrending.C:299
 ZDCQAtrending.C:300
 ZDCQAtrending.C:301
 ZDCQAtrending.C:302
 ZDCQAtrending.C:303
 ZDCQAtrending.C:304
 ZDCQAtrending.C:305
 ZDCQAtrending.C:306
 ZDCQAtrending.C:307
 ZDCQAtrending.C:308
 ZDCQAtrending.C:309
 ZDCQAtrending.C:310
 ZDCQAtrending.C:311
 ZDCQAtrending.C:312
 ZDCQAtrending.C:313
 ZDCQAtrending.C:314
 ZDCQAtrending.C:315
 ZDCQAtrending.C:316
 ZDCQAtrending.C:317
 ZDCQAtrending.C:318
 ZDCQAtrending.C:319
 ZDCQAtrending.C:320
 ZDCQAtrending.C:321
 ZDCQAtrending.C:322
 ZDCQAtrending.C:323
 ZDCQAtrending.C:324
 ZDCQAtrending.C:325
 ZDCQAtrending.C:326
 ZDCQAtrending.C:327
 ZDCQAtrending.C:328
 ZDCQAtrending.C:329
 ZDCQAtrending.C:330
 ZDCQAtrending.C:331
 ZDCQAtrending.C:332
 ZDCQAtrending.C:333
 ZDCQAtrending.C:334
 ZDCQAtrending.C:335
 ZDCQAtrending.C:336
 ZDCQAtrending.C:337
 ZDCQAtrending.C:338
 ZDCQAtrending.C:339
 ZDCQAtrending.C:340
 ZDCQAtrending.C:341
 ZDCQAtrending.C:342
 ZDCQAtrending.C:343
 ZDCQAtrending.C:344
 ZDCQAtrending.C:345
 ZDCQAtrending.C:346
 ZDCQAtrending.C:347
 ZDCQAtrending.C:348
 ZDCQAtrending.C:349
 ZDCQAtrending.C:350
 ZDCQAtrending.C:351
 ZDCQAtrending.C:352
 ZDCQAtrending.C:353
 ZDCQAtrending.C:354
 ZDCQAtrending.C:355
 ZDCQAtrending.C:356
 ZDCQAtrending.C:357
 ZDCQAtrending.C:358
 ZDCQAtrending.C:359
 ZDCQAtrending.C:360
 ZDCQAtrending.C:361
 ZDCQAtrending.C:362
 ZDCQAtrending.C:363
 ZDCQAtrending.C:364
 ZDCQAtrending.C:365
 ZDCQAtrending.C:366
 ZDCQAtrending.C:367
 ZDCQAtrending.C:368
 ZDCQAtrending.C:369
 ZDCQAtrending.C:370
 ZDCQAtrending.C:371
 ZDCQAtrending.C:372
 ZDCQAtrending.C:373
 ZDCQAtrending.C:374
 ZDCQAtrending.C:375
 ZDCQAtrending.C:376
 ZDCQAtrending.C:377
 ZDCQAtrending.C:378
 ZDCQAtrending.C:379
 ZDCQAtrending.C:380
 ZDCQAtrending.C:381
 ZDCQAtrending.C:382
 ZDCQAtrending.C:383
 ZDCQAtrending.C:384
 ZDCQAtrending.C:385
 ZDCQAtrending.C:386
 ZDCQAtrending.C:387
 ZDCQAtrending.C:388
 ZDCQAtrending.C:389
 ZDCQAtrending.C:390
 ZDCQAtrending.C:391
 ZDCQAtrending.C:392
 ZDCQAtrending.C:393
 ZDCQAtrending.C:394
 ZDCQAtrending.C:395
 ZDCQAtrending.C:396
 ZDCQAtrending.C:397
 ZDCQAtrending.C:398
 ZDCQAtrending.C:399
 ZDCQAtrending.C:400
 ZDCQAtrending.C:401
 ZDCQAtrending.C:402
 ZDCQAtrending.C:403
 ZDCQAtrending.C:404
 ZDCQAtrending.C:405
 ZDCQAtrending.C:406
 ZDCQAtrending.C:407
 ZDCQAtrending.C:408
 ZDCQAtrending.C:409
 ZDCQAtrending.C:410
 ZDCQAtrending.C:411
 ZDCQAtrending.C:412
 ZDCQAtrending.C:413
 ZDCQAtrending.C:414
 ZDCQAtrending.C:415
 ZDCQAtrending.C:416
 ZDCQAtrending.C:417
 ZDCQAtrending.C:418
 ZDCQAtrending.C:419
 ZDCQAtrending.C:420
 ZDCQAtrending.C:421
 ZDCQAtrending.C:422
 ZDCQAtrending.C:423
 ZDCQAtrending.C:424
 ZDCQAtrending.C:425
 ZDCQAtrending.C:426
 ZDCQAtrending.C:427
 ZDCQAtrending.C:428
 ZDCQAtrending.C:429
 ZDCQAtrending.C:430
 ZDCQAtrending.C:431
 ZDCQAtrending.C:432
 ZDCQAtrending.C:433
 ZDCQAtrending.C:434
 ZDCQAtrending.C:435
 ZDCQAtrending.C:436
 ZDCQAtrending.C:437
 ZDCQAtrending.C:438
 ZDCQAtrending.C:439
 ZDCQAtrending.C:440
 ZDCQAtrending.C:441
 ZDCQAtrending.C:442
 ZDCQAtrending.C:443
 ZDCQAtrending.C:444
 ZDCQAtrending.C:445
 ZDCQAtrending.C:446
 ZDCQAtrending.C:447
 ZDCQAtrending.C:448
 ZDCQAtrending.C:449
 ZDCQAtrending.C:450
 ZDCQAtrending.C:451
 ZDCQAtrending.C:452
 ZDCQAtrending.C:453
 ZDCQAtrending.C:454
 ZDCQAtrending.C:455
 ZDCQAtrending.C:456
 ZDCQAtrending.C:457
 ZDCQAtrending.C:458
 ZDCQAtrending.C:459
 ZDCQAtrending.C:460
 ZDCQAtrending.C:461
 ZDCQAtrending.C:462
 ZDCQAtrending.C:463
 ZDCQAtrending.C:464
 ZDCQAtrending.C:465
 ZDCQAtrending.C:466
 ZDCQAtrending.C:467
 ZDCQAtrending.C:468
 ZDCQAtrending.C:469
 ZDCQAtrending.C:470
 ZDCQAtrending.C:471
 ZDCQAtrending.C:472
 ZDCQAtrending.C:473
 ZDCQAtrending.C:474
 ZDCQAtrending.C:475
 ZDCQAtrending.C:476
 ZDCQAtrending.C:477
 ZDCQAtrending.C:478
 ZDCQAtrending.C:479
 ZDCQAtrending.C:480
 ZDCQAtrending.C:481
 ZDCQAtrending.C:482
 ZDCQAtrending.C:483
 ZDCQAtrending.C:484
 ZDCQAtrending.C:485
 ZDCQAtrending.C:486
 ZDCQAtrending.C:487
 ZDCQAtrending.C:488
 ZDCQAtrending.C:489
 ZDCQAtrending.C:490
 ZDCQAtrending.C:491
 ZDCQAtrending.C:492
 ZDCQAtrending.C:493
 ZDCQAtrending.C:494
 ZDCQAtrending.C:495
 ZDCQAtrending.C:496
 ZDCQAtrending.C:497
 ZDCQAtrending.C:498
 ZDCQAtrending.C:499
 ZDCQAtrending.C:500
 ZDCQAtrending.C:501
 ZDCQAtrending.C:502
 ZDCQAtrending.C:503
 ZDCQAtrending.C:504
 ZDCQAtrending.C:505
 ZDCQAtrending.C:506
 ZDCQAtrending.C:507
 ZDCQAtrending.C:508
 ZDCQAtrending.C:509
 ZDCQAtrending.C:510
 ZDCQAtrending.C:511
 ZDCQAtrending.C:512