ROOT logo
/* $Id:  $ */
//--------------------------------------------------
// Example macro to check QA outputs from the histograms itself
// Executed with Root 

//The input file needs: 
// 1.  the root output from AliAnaCalorimeterQA (or QA train) run by run ie runnumber.root 
// placed in the directory period/pass/
// 2.  the run list (runlist.txt) of these run output placed in the directory period/pass/ runlist mean : index runnumber//
// Trigger
// 2 trigger options " MB"  : CaloQA_default output from train
//                   " EMC" : CaloQA_EMC7

// Configured by options of EMCAL  checker with:
// a. cell multiplicity
// b. cluster multiplicity/event
// c. Cells per Cluster 
// d. mean cluster energy 

// more checker valuse could be added based on request (more canvas)
//
// Author: Yaxian Mao
// Modified M. Germain
//

#include <TFile.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TH3D.h>
#include <Riostream.h>
#include <TCanvas.h>
#include <TGraphErrors.h>
#include <TGrid.h>
#include <TFileMerger.h>
#include <TMultiGraph.h>
#include <TROOT.h>
#include <TString.h>
#include <TStyle.h>
#include <TLegend.h>
#include <TGridCollection.h>
#include <TROOT.h>
#include <TGridResult.h>
#include <TClonesArray.h>
#include <TObjString.h>
#include <stdio.h>

#include <string> 
#include <fstream>
#include <iostream>
#include <sstream>  // Required for stringstreams

using namespace std;

void  trendingCluster(TString fCalorimeter = "EMCAL", TString period = "LHC11h", TString pass = "pass1_HLT", const Int_t n = 10, TString fTrigger = "MB"){
  
  FILE * pFile;
  
  TString file = "";
  if (fTrigger=="EMC") file = "/scratch/alicehp2/germain/QA/"+period+"/"+ pass + "/runlist.txt" ;
  else                 file = "/scratch/alicehp2/germain/QA/"+period+"/"+ pass + "/runlistMB.txt" ;
  
  //cout<<file<<endl;
  pFile = fopen(file.Data(), "r"); //open the text file where include the run list and correct run index
  
  cout<<file<<endl;
  cout << " fcalo: " << fCalorimeter << "; period: " << period << "; pass: " << pass << "  trigger "<<fTrigger<<  endl; 
  char outfilename [100]     ;
  
  Int_t index[500];
  Int_t p;
  Int_t q;
  Int_t ncols;
  Int_t nlines = 0 ;
  Int_t RunId[500] ;
  Double_t x[500] ;
  Double_t xrun[500] ;
  //TString label; 
  
  while (1){
    ncols = fscanf(pFile,"%d  %d ",&p,&q);
    if (ncols< 0) break;
    x[nlines]=p;
    index[nlines]=p;
    RunId[nlines]=q;
    xrun[nlines]=1.*q;
    nlines++;
  }
  fclose(pFile);
  const Int_t nRun = nlines ;
  
  Double_t xe[nRun] ;
  Double_t nEvent[nRun] ;
  //  Double_t TimeMean[nRun] ;
  //  Double_t TimeRMS[nRun] ;
  Double_t CellMean[nRun] ;
  Double_t CellRMS[nRun] ;
  Double_t ClusterMean[nRun] ;
  Double_t ClusterRMS[nRun] ;
  Double_t EtotalMean[nRun] ;//total energy deposited per event
  Double_t EtotalRMS[nRun] ;
  
  Double_t CellPerClusterMean[nRun] ;
  Double_t CellPerClusterRMS[nRun] ;
  Double_t ECell1Mean[nRun] ;//total energy deposited per event without 1 cell clusters
  Double_t ECell1RMS[nRun] ;
  
  TFile * f ;
  TDirectoryFile * dir;
  TList * outputList;
  
  TH1F * fhNEvents;
  TH1F * fhE;
  TH1F * fhNClusters;
  TH1F * fhNCells;
  TH2F * fhIM ;
  TH3D * fhNCellsPerCluster ;
  TH2F * fhTimeAmp ;
  
  TH1F * NCells[n];
  TH1F * NClusters[n];
  TH2F * NCellsPerCluster[n];
  TH1F * E[n];
  
  TGraphErrors * AverNcellsSM[n];
  TGraphErrors * AverNclustersSM[n];
  TGraphErrors * AverNcellsPerClusterSM[n];
  TGraphErrors * AverESM[n];
  TGraphErrors * AverTimeSM[n];
  TGraphErrors * AverMggSM[n];
  TGraphErrors * AverEcell1SM[n];
  
  Double_t CellMeanSM[n][nRun] ;
  Double_t CellRMSSM[n][nRun] ;
  Double_t ClusterMeanSM[n][nRun] ;
  Double_t ClusterRMSSM[n][nRun] ;
  Double_t EtotalMeanSM[n][nRun] ;//total energy deposited per event
  Double_t EtotalRMSSM[n][nRun] ;
  Double_t CellPerClusterMeanSM[n][nRun] ;
  Double_t CellPerClusterRMSSM[n][nRun] ;
  Double_t ECell1MeanSM[n][nRun] ;//total energy deposited per event without 1 cell clusters
  Double_t ECell1RMSSM[n][nRun] ;
  
  
  TString namefile = "/scratch/alicehp2/germain/QA/"+period+"/"+pass+"/"+ fCalorimeter + period + pass + fTrigger+"data.txt";
  
  fstream QAData(namefile, ios::out); //write the QA check values at the end
  
  cout << " namefile " << namefile << endl;
  cout << " nRun " << nRun <<  " index(nRun) " << index[nRun-1]  << endl;
  
  for(Int_t i = 0 ; i < nRun ; i++){
    
    xe[i] = 0.5 ; 
    
    TString name = "/scratch/alicehp2/germain/QA/"+period +"/"+ pass + "/";
    
    name += RunId[i] ;
    name += ".root";
    f = TFile::Open(name.Data(),"read") ;
    if (!f) continue; 
    
    //  cout << " i = " << i << " file opend Output" <<  RunId[i]<< endl;
    
    if(fTrigger=="EMC"){        dir = (TDirectoryFile *)f->Get("CaloQA_EMC7");
      outputList = (TList*)dir->Get("CaloQA_EMC7");
    }
    else{
      dir = (TDirectoryFile *)f->Get("CaloQA_default");
      outputList = (TList*)dir->Get("CaloQA_default");
    }
    
    //define the averages for checking Histograms
    //
    
    fhNEvents =(TH1F *)outputList->FindObject("hNEvents");
    nEvent[i]=fhNEvents->GetEntries();
    cout <<  " Run " << RunId[i]<< " nevent " << nEvent[i]<< endl;
    if( nEvent[i] == 0) continue ;
    if( nEvent[i] <  2) continue ;
    fhE = (TH1F *)outputList->FindObject(fCalorimeter+"_hE");
    
    Double_t energy = 0. ;
    
    for(Int_t ibin = fhE->FindBin(0.3) ; ibin <fhE->FindBin(50.) ; ibin++){ //Starting from 0.3eV
      energy+=fhE->GetBinCenter(ibin)*fhE->GetBinContent(ibin);
    }
    EtotalMean[i]=energy/fhE->Integral(fhE->FindBin(0.3), fhE->FindBin(50.)) ;
    EtotalRMS[i]=fhE->GetMeanError();
    
    
    
    //for single module check
    for(Int_t ism = 0 ; ism < n ; ism++){
      TString nameNCell = Form("%s_hNCells_Mod%d",fCalorimeter.Data(),ism);
      
      TString nameNCluster = Form("%s_hNClusters_Mod%d",fCalorimeter.Data(),ism);
      TString nameNCellPerCluster = Form("%s_hNCellsPerCluster_Mod%d",fCalorimeter.Data(),ism);
      TString nameE = Form("%s_hE_Mod%d",fCalorimeter.Data(),ism);
      
      NCells[ism] = (TH1F*)outputList->FindObject(nameNCell.Data());
      NClusters[ism] = (TH1F*)outputList->FindObject(nameNCluster.Data());
      NCellsPerCluster[ism] = (TH2F*)outputList->FindObject(nameNCellPerCluster.Data());
      E[ism] = (TH1F*)outputList->FindObject(nameE.Data());
      CellMeanSM[ism][i]=NCells[ism]->GetMean();
      CellRMSSM[ism][i]=NCells[ism]->GetMeanError();
      ClusterMeanSM[ism][i]=NClusters[ism]->GetMean();
      ClusterRMSSM[ism][i]=NClusters[ism]->GetMeanError();
      CellPerClusterMeanSM[ism][i]=NCellsPerCluster[ism]->GetMean(2);
      CellPerClusterRMSSM[ism][i]=NCellsPerCluster[ism]->GetMeanError(2);
      //   cout<<"SM = "<<ism<<" Mean : = "<<CellPerClusterMeanSM[ism][i]<<endl ;
      ECell1MeanSM[ism][i] =NCellsPerCluster[ism]->ProjectionX("",2,300,"")->Integral(5,100)/(nEvent[i]);
      ECell1RMSSM[ism][i] =NCellsPerCluster[ism]->ProjectionX("",2,300,"")->GetMeanError();
      Double_t energySM = 0. ;
      for(Int_t ibin = E[ism]->FindBin(0.3) ; ibin <E[ism]->FindBin(50.) ; ibin++){ //starting from 0.3GeV
        energySM+=E[ism]->GetBinCenter(ibin)*(E[ism]->GetBinContent(ibin));
      }
      EtotalMeanSM[ism][i]=energySM/(E[ism]->Integral(E[ism]->FindBin(0.3),E[ism]->FindBin(50.)));
      
      EtotalRMSSM[ism][i]=E[ism]->GetMeanError();
      
      if(ism==0) {
        fhNCells = (TH1F*)NCells[ism]->Clone("NCells");
        fhNClusters = (TH1F*)NClusters[ism]->Clone("NClusters");  
      }
      else {
        fhNCells->Add(NCells[ism],1);
        fhNClusters->Add(NClusters[ism],1);
      }
    } //per SM loop
    ClusterMean[i]=fhNClusters->GetMean();
    ClusterRMS[i]=fhNClusters->GetMeanError();  
    CellMean[i]=fhNCells->GetMean();
    CellRMS[i]=fhNCells->GetMeanError();  
    outputList->Clear() ; 
    dir->Close();
    f->Close();
    f=NULL;
    dir=NULL;
    outputList=NULL;
    
    //if you want to write all the QA check values at the end, otherwise just comment out below
    // becareful with different detectors as the check output are different since different modules/SM for different detetcor
    
    QAData <<i+1<<"   "<< RunId[i] <<"    "<< nEvent[i]        
    //   <<"   "<< RunId[i]<<"   "<<CellMean[i]
    //   <<" "<< CellMeanSM[0][i] <<"   "<< CellMeanSM[1][i]
    //     <<"   "<<CellMeanSM[2][i] 
    //     <<"   "<< RunId[i] <<" "<<ClusterMean[i] 
    //     <<" "<< ClusterMeanSM[0][i]<<" "<< ClusterMeanSM[1][i]
    //     <<" "<< ClusterMeanSM[2][i]
    //     <<"   "<< RunId[i]<<"   "<< CellPerClusterMean[i]
    //     <<" "<< CellPerClusterMeanSM[0][i]<<" "<< CellPerClusterMeanSM[1][i]
    //     <<" "<< CellPerClusterMeanSM[2][i]
    //     <<"   "<< RunId[i]<<"   "<< EtotalMean[i]
    //     <<" "<< EtotalMeanSM[0][i] <<" "<< EtotalMeanSM[1][i]
    //     <<" "<< EtotalMeanSM[2][i] 
    
    <<"\n" ; 
    
  } // end loop on nrun
  
  
  QAData.close();
  
  TString base = "/scratch/alicehp2/germain/QA/";
  base += period ;
  base += "/";
  base += pass ;
  base += "/";
  
  base += fTrigger;
  TString ClusterAverages ; ClusterAverages = base +  "ClusterAverages.gif";
  TString Entries  ;  Entries = base + "Nentries.gif";
  TString ClusterAveragesEnergy ; ClusterAveragesEnergy = base +  "ClusterAveragesEnergy.gif";
  TString ClusterAveragesEntries ; ClusterAveragesEntries = base +  "ClusterAveragesEntries.gif";
  TString ClusterAveragesCells ; ClusterAveragesCells = base +  "ClusterAveragescells.gif";
  
  
  cout << "c11 nEvents" << endl;
  //just for the canvas defination
  
  cout << " index(0)" << index[nRun-1] << " index(20) " << index[20] <<endl;
  TH1F * dummy = new TH1F("dummy", "dummy", nRun, 0., nRun+0.5); 
  //  TH1F * dummy = new TH1F("dummy", "dummy", index[nRun-1], 0., index[nRun-1]+0.5); 
  dummy->SetTitle("") ; 
  dummy->SetStats(kFALSE) ; 
  dummy->SetAxisRange(0., nRun, "X") ; 
  
  for(Int_t i = 0 ; i < nRun ; i++){
    TString label = " ";
    label+=RunId[i];
    cout <<" run "<< RunId[i] << " label " <<label << endl;
    
    dummy->GetXaxis()->SetBinLabel(i+1,label.Data());
    dummy->GetXaxis()->LabelsOption("v");
  }
  
  
  
  //number of events passes  physics selection for each run
  TCanvas  * c11 = new TCanvas("nEvents", "nEvents", 1000, 500);
  c11->SetFillColor(0);
  c11->SetBorderSize(0);
  c11->SetFrameBorderMode(0); 
  gStyle->SetOptStat(0);  
  c11->SetLogy();
  c11->SetGrid();
  // dummy->GetXaxis()->SetTitle("RUN");    
  dummy->GetXaxis()->SetTitleOffset(0.05);
  dummy->GetYaxis()->SetTitle("N_{events}"); 
  dummy->SetMinimum(1.) ;  //should addjust based on the statistics 
  dummy->SetMaximum(1.e6) ; //should addjust based on the statistics 
  dummy->Draw();
  TGraph * nEvents = new TGraph(nRun, x, nEvent);
  nEvents->SetMarkerStyle(20);
  nEvents->SetMarkerColor(1);
  nEvents->SetLineColor(2);
  nEvents->Draw("same PL") ;
  c11->Update();
  
  
  if (fTrigger=="MB")sprintf(outfilename,"nEventMB.gif");
  if (fTrigger=="EMC")sprintf(outfilename,"nEventEMC.gif");
  
  
  c11->SaveAs(Entries);
  
  
  cout << "c1 Aver NCell" << endl;
  
  TCanvas  * c1 = new TCanvas("AverNCell", "AverNCell", 600, 600);
  // c1->SetLogy();
  c1->SetFillColor(0);
  c1->SetBorderSize(0);
  c1->SetFrameBorderMode(0); 
  gStyle->SetOptStat(0);  
  TH1F * h1 = (TH1F*)dummy->Clone("");
  h1->GetXaxis()->SetTitle("RUN Index");    
  h1->GetYaxis()->SetTitle("<N_{cells}>");  
  h1->SetMinimum(0.) ; 
  h1->SetMaximum(10.) ; 
  if(fCalorimeter=="EMCAL") h1->SetMaximum(5.) ;
  h1->Draw();
  
  TGraphErrors * AverNcells = new TGraphErrors(nRun, x, CellMean, xe, CellRMS);
  
  AverNcells->SetMarkerColor(1);
  AverNcells->SetMarkerStyle(20);
  AverNcells->Draw("same P") ;  
  for(Int_t ism = 0 ; ism < n ; ism++){
    AverNcellsSM[ism] = new TGraphErrors(nRun, x, CellMeanSM[ism], xe, CellRMSSM[ism]);
    AverNcellsSM[ism]->SetMarkerColor(ism+2);
    AverNcellsSM[ism]->SetMarkerStyle(21+ism);
    AverNcellsSM[ism]->Draw("same P");
  }
  
  
  
  TLegend  * l1 = new TLegend(0.4, 0.6, 0.75, 0.85);
  l1->SetFillColor(0);
  l1->SetBorderSize(0);
  l1->SetTextSize(0.02);
  l1->AddEntry(AverNcells, "<# of cells>", "") ;
  l1->AddEntry(AverNcells, Form("det = %s",fCalorimeter.Data()), "") ;
  l1->AddEntry(AverNcells,"average", "p");
  for(Int_t ism = 0 ; ism < n ; ism++){
    TString projname = Form("SM_ %d",ism);
    l1->AddEntry(AverNcellsSM[ism],projname.Data(), "p");
  }
  l1->Draw("same");
  c1->Update();
  
  
  TCanvas  * c200 = new TCanvas("ClusterAverages", "ClusterAverages", 1000, 500);
  c200->SetFillColor(0);
  c200->SetBorderSize(0);
  c200->SetFrameBorderMode(0); 
  c200->SetGrid();
  
  gPad->SetLeftMargin(0.08);
  gPad->SetRightMargin(0.02);
  gPad->SetGrid();
  
  TH1F * h2 = (TH1F*)dummy->Clone("");
  
  h2->GetYaxis()->SetTitle("<N_{clusters}>/event");  
  
  if (fTrigger=="EMC") h2->SetMaximum(70) ;
  else                 h2->SetMaximum(50) ;
  h2->SetMinimum(10) ; // for Pb Pb
  h2->Draw();
  
  TGraphErrors * AverNclusters = new TGraphErrors(nRun, x, ClusterMean, xe, ClusterRMS);
  AverNclusters->SetMarkerStyle(20);
  AverNclusters->SetMarkerColor(1);
  AverNclusters->Draw("same P") ;  
  
  for(Int_t ism = 0 ; ism < n ; ism++){
    AverNclustersSM[ism] = new TGraphErrors(nRun, x, ClusterMeanSM[ism], xe, ClusterRMSSM[ism]);
    AverNclustersSM[ism]->SetMarkerColor(ism+2);
    AverNclustersSM[ism]->SetMarkerStyle(21+ism);
    
    AverNclustersSM[ism]->Draw("same P");  
  }
  
  
  TLegend  * l200 = new TLegend(0.4, 0.6, 0.75, 0.85);
  l200->SetFillColor(0);
  l200->SetBorderSize(0);
  l200->SetTextSize(0.02);
  l200->AddEntry(AverNclusters, "<# of clusters>", "") ;
  l200->AddEntry(AverNclusters, Form("det = %s",fCalorimeter.Data()), "") ;
  l200->AddEntry(AverNclusters,"average", "p");
  
  for(Int_t ism = 0 ; ism < n ; ism++){
    TString projname = Form("SM_ %d",ism);
    l200->AddEntry(AverNclustersSM[ism],projname.Data(), "p");
  }
  
  l200->Draw("same");
  c200->Update();
  c200->SaveAs(ClusterAveragesEntries);
  
  TCanvas  * c201 = new TCanvas("ClusterAveragesEnergy", "ClusterAveragesEnergy", 1000, 500);
  c201->SetFillColor(0);
  c201->SetBorderSize(0);
  c201->SetFrameBorderMode(0); 
  c201->SetGrid();
  
  
  gPad->SetLeftMargin(0.08);
  gPad->SetRightMargin(0.02);
  gPad->SetGrid();
  
  
  TH1F * h3 = (TH1F*)dummy->Clone("");
  
  h3->GetYaxis()->SetTitle("<E> (GeV)");  
  h3->SetMinimum(0.2) ; 
  h3->SetMaximum(1.) ; 
  h3->Draw();
  
  TGraphErrors * AverE = new TGraphErrors(nRun, x, EtotalMean, xe, EtotalRMS);
  AverE->SetMarkerStyle(20);
  AverE->SetMarkerColor(1);
  AverE->Draw("same P");
  
  for(Int_t ism = 0 ; ism < n ; ism++){
    AverESM[ism] = new TGraphErrors(nRun, x, EtotalMeanSM[ism], xe, EtotalRMSSM[ism]);
    AverESM[ism]->SetMarkerColor(ism+2);
    AverESM[ism]->SetMarkerStyle(21+ism);
    AverESM[ism]->Draw("same P");
    
  }
  
  TLegend  * l3 = new TLegend(0.4, 0.6, 0.75, 0.85);
  l3->SetFillColor(0);
  l3->SetBorderSize(0);
  l3->SetTextSize(0.02);
  l3->AddEntry(AverE, "<E>", "") ;
  l3->AddEntry(AverE, Form("det = %s",fCalorimeter.Data()), "") ;
  l3->AddEntry(AverE,"average", "p");
  
  for(Int_t ism = 0 ; ism < n ; ism++){
    TString projname = Form("SM_ %d",ism);
    l3->AddEntry(AverESM[ism],projname.Data(), "p");
  }
  
  l3->Draw("same");
  
  c201->SaveAs(ClusterAveragesEnergy);
  
  
  TCanvas  * c202 = new TCanvas("ClusterAveragesCells", "ClusterAveragesCells", 1000, 500);
  c202->SetFillColor(0);
  c202->SetBorderSize(0);
  c202->SetFrameBorderMode(0); 
  c202->SetGrid();
  
  gPad->SetLeftMargin(0.08);
  gPad->SetRightMargin(0.02); 
  
  gPad->SetGrid();
  
  
  TH1F * h4 = (TH1F*)dummy->Clone("");
  
  h4->GetYaxis()->SetTitle("<N_{CellsPerCluster}>");  
  h4->SetMinimum(1.5) ; 
  h4->SetMaximum(5.5) ; 
  h4->Draw();
  
  
  TGraphErrors * AverCellPerCluster = new TGraphErrors(nRun, x, CellPerClusterMean, xe, CellPerClusterRMS);
  AverCellPerCluster->SetMarkerStyle(20);
  AverCellPerCluster->SetMarkerColor(1);
  
  for(Int_t ism = 0 ; ism < n ; ism++){
    AverNcellsPerClusterSM[ism] = new TGraphErrors(nRun, x, CellPerClusterMeanSM[ism], xe, CellPerClusterRMSSM[ism]);
    AverNcellsPerClusterSM[ism]->SetMarkerColor(ism+2);
    AverNcellsPerClusterSM[ism]->SetMarkerStyle(21+ism);
    AverNcellsPerClusterSM[ism]->Draw("same P");
    
  }
  
  TLegend  * l4 = new TLegend(0.4, 0.6, 0.75, 0.85);
  l4->SetFillColor(0);
  l4->SetBorderSize(0);
  l4->SetTextSize(0.02);
  l4->AddEntry(AverCellPerCluster, "<# of cells per cluster>", "") ;
  l4->AddEntry(AverCellPerCluster, Form("det = %s",fCalorimeter.Data()), "") ;
  l4->AddEntry(AverCellPerCluster,"average", "p");
  
  for(Int_t ism = 0 ; ism < n ; ism++){
    TString projname = Form("SM_ %d",ism);
    l4->AddEntry(AverNcellsPerClusterSM[ism],projname.Data(), "p");
  }
  
  l4->Draw("same");
  
  c202->SaveAs(ClusterAveragesCells);
  
}
 trendingCluster.C:1
 trendingCluster.C:2
 trendingCluster.C:3
 trendingCluster.C:4
 trendingCluster.C:5
 trendingCluster.C:6
 trendingCluster.C:7
 trendingCluster.C:8
 trendingCluster.C:9
 trendingCluster.C:10
 trendingCluster.C:11
 trendingCluster.C:12
 trendingCluster.C:13
 trendingCluster.C:14
 trendingCluster.C:15
 trendingCluster.C:16
 trendingCluster.C:17
 trendingCluster.C:18
 trendingCluster.C:19
 trendingCluster.C:20
 trendingCluster.C:21
 trendingCluster.C:22
 trendingCluster.C:23
 trendingCluster.C:24
 trendingCluster.C:25
 trendingCluster.C:26
 trendingCluster.C:27
 trendingCluster.C:28
 trendingCluster.C:29
 trendingCluster.C:30
 trendingCluster.C:31
 trendingCluster.C:32
 trendingCluster.C:33
 trendingCluster.C:34
 trendingCluster.C:35
 trendingCluster.C:36
 trendingCluster.C:37
 trendingCluster.C:38
 trendingCluster.C:39
 trendingCluster.C:40
 trendingCluster.C:41
 trendingCluster.C:42
 trendingCluster.C:43
 trendingCluster.C:44
 trendingCluster.C:45
 trendingCluster.C:46
 trendingCluster.C:47
 trendingCluster.C:48
 trendingCluster.C:49
 trendingCluster.C:50
 trendingCluster.C:51
 trendingCluster.C:52
 trendingCluster.C:53
 trendingCluster.C:54
 trendingCluster.C:55
 trendingCluster.C:56
 trendingCluster.C:57
 trendingCluster.C:58
 trendingCluster.C:59
 trendingCluster.C:60
 trendingCluster.C:61
 trendingCluster.C:62
 trendingCluster.C:63
 trendingCluster.C:64
 trendingCluster.C:65
 trendingCluster.C:66
 trendingCluster.C:67
 trendingCluster.C:68
 trendingCluster.C:69
 trendingCluster.C:70
 trendingCluster.C:71
 trendingCluster.C:72
 trendingCluster.C:73
 trendingCluster.C:74
 trendingCluster.C:75
 trendingCluster.C:76
 trendingCluster.C:77
 trendingCluster.C:78
 trendingCluster.C:79
 trendingCluster.C:80
 trendingCluster.C:81
 trendingCluster.C:82
 trendingCluster.C:83
 trendingCluster.C:84
 trendingCluster.C:85
 trendingCluster.C:86
 trendingCluster.C:87
 trendingCluster.C:88
 trendingCluster.C:89
 trendingCluster.C:90
 trendingCluster.C:91
 trendingCluster.C:92
 trendingCluster.C:93
 trendingCluster.C:94
 trendingCluster.C:95
 trendingCluster.C:96
 trendingCluster.C:97
 trendingCluster.C:98
 trendingCluster.C:99
 trendingCluster.C:100
 trendingCluster.C:101
 trendingCluster.C:102
 trendingCluster.C:103
 trendingCluster.C:104
 trendingCluster.C:105
 trendingCluster.C:106
 trendingCluster.C:107
 trendingCluster.C:108
 trendingCluster.C:109
 trendingCluster.C:110
 trendingCluster.C:111
 trendingCluster.C:112
 trendingCluster.C:113
 trendingCluster.C:114
 trendingCluster.C:115
 trendingCluster.C:116
 trendingCluster.C:117
 trendingCluster.C:118
 trendingCluster.C:119
 trendingCluster.C:120
 trendingCluster.C:121
 trendingCluster.C:122
 trendingCluster.C:123
 trendingCluster.C:124
 trendingCluster.C:125
 trendingCluster.C:126
 trendingCluster.C:127
 trendingCluster.C:128
 trendingCluster.C:129
 trendingCluster.C:130
 trendingCluster.C:131
 trendingCluster.C:132
 trendingCluster.C:133
 trendingCluster.C:134
 trendingCluster.C:135
 trendingCluster.C:136
 trendingCluster.C:137
 trendingCluster.C:138
 trendingCluster.C:139
 trendingCluster.C:140
 trendingCluster.C:141
 trendingCluster.C:142
 trendingCluster.C:143
 trendingCluster.C:144
 trendingCluster.C:145
 trendingCluster.C:146
 trendingCluster.C:147
 trendingCluster.C:148
 trendingCluster.C:149
 trendingCluster.C:150
 trendingCluster.C:151
 trendingCluster.C:152
 trendingCluster.C:153
 trendingCluster.C:154
 trendingCluster.C:155
 trendingCluster.C:156
 trendingCluster.C:157
 trendingCluster.C:158
 trendingCluster.C:159
 trendingCluster.C:160
 trendingCluster.C:161
 trendingCluster.C:162
 trendingCluster.C:163
 trendingCluster.C:164
 trendingCluster.C:165
 trendingCluster.C:166
 trendingCluster.C:167
 trendingCluster.C:168
 trendingCluster.C:169
 trendingCluster.C:170
 trendingCluster.C:171
 trendingCluster.C:172
 trendingCluster.C:173
 trendingCluster.C:174
 trendingCluster.C:175
 trendingCluster.C:176
 trendingCluster.C:177
 trendingCluster.C:178
 trendingCluster.C:179
 trendingCluster.C:180
 trendingCluster.C:181
 trendingCluster.C:182
 trendingCluster.C:183
 trendingCluster.C:184
 trendingCluster.C:185
 trendingCluster.C:186
 trendingCluster.C:187
 trendingCluster.C:188
 trendingCluster.C:189
 trendingCluster.C:190
 trendingCluster.C:191
 trendingCluster.C:192
 trendingCluster.C:193
 trendingCluster.C:194
 trendingCluster.C:195
 trendingCluster.C:196
 trendingCluster.C:197
 trendingCluster.C:198
 trendingCluster.C:199
 trendingCluster.C:200
 trendingCluster.C:201
 trendingCluster.C:202
 trendingCluster.C:203
 trendingCluster.C:204
 trendingCluster.C:205
 trendingCluster.C:206
 trendingCluster.C:207
 trendingCluster.C:208
 trendingCluster.C:209
 trendingCluster.C:210
 trendingCluster.C:211
 trendingCluster.C:212
 trendingCluster.C:213
 trendingCluster.C:214
 trendingCluster.C:215
 trendingCluster.C:216
 trendingCluster.C:217
 trendingCluster.C:218
 trendingCluster.C:219
 trendingCluster.C:220
 trendingCluster.C:221
 trendingCluster.C:222
 trendingCluster.C:223
 trendingCluster.C:224
 trendingCluster.C:225
 trendingCluster.C:226
 trendingCluster.C:227
 trendingCluster.C:228
 trendingCluster.C:229
 trendingCluster.C:230
 trendingCluster.C:231
 trendingCluster.C:232
 trendingCluster.C:233
 trendingCluster.C:234
 trendingCluster.C:235
 trendingCluster.C:236
 trendingCluster.C:237
 trendingCluster.C:238
 trendingCluster.C:239
 trendingCluster.C:240
 trendingCluster.C:241
 trendingCluster.C:242
 trendingCluster.C:243
 trendingCluster.C:244
 trendingCluster.C:245
 trendingCluster.C:246
 trendingCluster.C:247
 trendingCluster.C:248
 trendingCluster.C:249
 trendingCluster.C:250
 trendingCluster.C:251
 trendingCluster.C:252
 trendingCluster.C:253
 trendingCluster.C:254
 trendingCluster.C:255
 trendingCluster.C:256
 trendingCluster.C:257
 trendingCluster.C:258
 trendingCluster.C:259
 trendingCluster.C:260
 trendingCluster.C:261
 trendingCluster.C:262
 trendingCluster.C:263
 trendingCluster.C:264
 trendingCluster.C:265
 trendingCluster.C:266
 trendingCluster.C:267
 trendingCluster.C:268
 trendingCluster.C:269
 trendingCluster.C:270
 trendingCluster.C:271
 trendingCluster.C:272
 trendingCluster.C:273
 trendingCluster.C:274
 trendingCluster.C:275
 trendingCluster.C:276
 trendingCluster.C:277
 trendingCluster.C:278
 trendingCluster.C:279
 trendingCluster.C:280
 trendingCluster.C:281
 trendingCluster.C:282
 trendingCluster.C:283
 trendingCluster.C:284
 trendingCluster.C:285
 trendingCluster.C:286
 trendingCluster.C:287
 trendingCluster.C:288
 trendingCluster.C:289
 trendingCluster.C:290
 trendingCluster.C:291
 trendingCluster.C:292
 trendingCluster.C:293
 trendingCluster.C:294
 trendingCluster.C:295
 trendingCluster.C:296
 trendingCluster.C:297
 trendingCluster.C:298
 trendingCluster.C:299
 trendingCluster.C:300
 trendingCluster.C:301
 trendingCluster.C:302
 trendingCluster.C:303
 trendingCluster.C:304
 trendingCluster.C:305
 trendingCluster.C:306
 trendingCluster.C:307
 trendingCluster.C:308
 trendingCluster.C:309
 trendingCluster.C:310
 trendingCluster.C:311
 trendingCluster.C:312
 trendingCluster.C:313
 trendingCluster.C:314
 trendingCluster.C:315
 trendingCluster.C:316
 trendingCluster.C:317
 trendingCluster.C:318
 trendingCluster.C:319
 trendingCluster.C:320
 trendingCluster.C:321
 trendingCluster.C:322
 trendingCluster.C:323
 trendingCluster.C:324
 trendingCluster.C:325
 trendingCluster.C:326
 trendingCluster.C:327
 trendingCluster.C:328
 trendingCluster.C:329
 trendingCluster.C:330
 trendingCluster.C:331
 trendingCluster.C:332
 trendingCluster.C:333
 trendingCluster.C:334
 trendingCluster.C:335
 trendingCluster.C:336
 trendingCluster.C:337
 trendingCluster.C:338
 trendingCluster.C:339
 trendingCluster.C:340
 trendingCluster.C:341
 trendingCluster.C:342
 trendingCluster.C:343
 trendingCluster.C:344
 trendingCluster.C:345
 trendingCluster.C:346
 trendingCluster.C:347
 trendingCluster.C:348
 trendingCluster.C:349
 trendingCluster.C:350
 trendingCluster.C:351
 trendingCluster.C:352
 trendingCluster.C:353
 trendingCluster.C:354
 trendingCluster.C:355
 trendingCluster.C:356
 trendingCluster.C:357
 trendingCluster.C:358
 trendingCluster.C:359
 trendingCluster.C:360
 trendingCluster.C:361
 trendingCluster.C:362
 trendingCluster.C:363
 trendingCluster.C:364
 trendingCluster.C:365
 trendingCluster.C:366
 trendingCluster.C:367
 trendingCluster.C:368
 trendingCluster.C:369
 trendingCluster.C:370
 trendingCluster.C:371
 trendingCluster.C:372
 trendingCluster.C:373
 trendingCluster.C:374
 trendingCluster.C:375
 trendingCluster.C:376
 trendingCluster.C:377
 trendingCluster.C:378
 trendingCluster.C:379
 trendingCluster.C:380
 trendingCluster.C:381
 trendingCluster.C:382
 trendingCluster.C:383
 trendingCluster.C:384
 trendingCluster.C:385
 trendingCluster.C:386
 trendingCluster.C:387
 trendingCluster.C:388
 trendingCluster.C:389
 trendingCluster.C:390
 trendingCluster.C:391
 trendingCluster.C:392
 trendingCluster.C:393
 trendingCluster.C:394
 trendingCluster.C:395
 trendingCluster.C:396
 trendingCluster.C:397
 trendingCluster.C:398
 trendingCluster.C:399
 trendingCluster.C:400
 trendingCluster.C:401
 trendingCluster.C:402
 trendingCluster.C:403
 trendingCluster.C:404
 trendingCluster.C:405
 trendingCluster.C:406
 trendingCluster.C:407
 trendingCluster.C:408
 trendingCluster.C:409
 trendingCluster.C:410
 trendingCluster.C:411
 trendingCluster.C:412
 trendingCluster.C:413
 trendingCluster.C:414
 trendingCluster.C:415
 trendingCluster.C:416
 trendingCluster.C:417
 trendingCluster.C:418
 trendingCluster.C:419
 trendingCluster.C:420
 trendingCluster.C:421
 trendingCluster.C:422
 trendingCluster.C:423
 trendingCluster.C:424
 trendingCluster.C:425
 trendingCluster.C:426
 trendingCluster.C:427
 trendingCluster.C:428
 trendingCluster.C:429
 trendingCluster.C:430
 trendingCluster.C:431
 trendingCluster.C:432
 trendingCluster.C:433
 trendingCluster.C:434
 trendingCluster.C:435
 trendingCluster.C:436
 trendingCluster.C:437
 trendingCluster.C:438
 trendingCluster.C:439
 trendingCluster.C:440
 trendingCluster.C:441
 trendingCluster.C:442
 trendingCluster.C:443
 trendingCluster.C:444
 trendingCluster.C:445
 trendingCluster.C:446
 trendingCluster.C:447
 trendingCluster.C:448
 trendingCluster.C:449
 trendingCluster.C:450
 trendingCluster.C:451
 trendingCluster.C:452
 trendingCluster.C:453
 trendingCluster.C:454
 trendingCluster.C:455
 trendingCluster.C:456
 trendingCluster.C:457
 trendingCluster.C:458
 trendingCluster.C:459
 trendingCluster.C:460
 trendingCluster.C:461
 trendingCluster.C:462
 trendingCluster.C:463
 trendingCluster.C:464
 trendingCluster.C:465
 trendingCluster.C:466
 trendingCluster.C:467
 trendingCluster.C:468
 trendingCluster.C:469
 trendingCluster.C:470
 trendingCluster.C:471
 trendingCluster.C:472
 trendingCluster.C:473
 trendingCluster.C:474
 trendingCluster.C:475
 trendingCluster.C:476
 trendingCluster.C:477
 trendingCluster.C:478
 trendingCluster.C:479
 trendingCluster.C:480
 trendingCluster.C:481
 trendingCluster.C:482
 trendingCluster.C:483
 trendingCluster.C:484
 trendingCluster.C:485
 trendingCluster.C:486
 trendingCluster.C:487
 trendingCluster.C:488
 trendingCluster.C:489
 trendingCluster.C:490
 trendingCluster.C:491
 trendingCluster.C:492
 trendingCluster.C:493
 trendingCluster.C:494
 trendingCluster.C:495
 trendingCluster.C:496
 trendingCluster.C:497
 trendingCluster.C:498
 trendingCluster.C:499
 trendingCluster.C:500
 trendingCluster.C:501
 trendingCluster.C:502
 trendingCluster.C:503
 trendingCluster.C:504
 trendingCluster.C:505
 trendingCluster.C:506
 trendingCluster.C:507
 trendingCluster.C:508
 trendingCluster.C:509
 trendingCluster.C:510
 trendingCluster.C:511
 trendingCluster.C:512
 trendingCluster.C:513
 trendingCluster.C:514
 trendingCluster.C:515
 trendingCluster.C:516
 trendingCluster.C:517
 trendingCluster.C:518
 trendingCluster.C:519
 trendingCluster.C:520
 trendingCluster.C:521
 trendingCluster.C:522
 trendingCluster.C:523
 trendingCluster.C:524