ROOT logo
// This macro has been developed to find badcells candidates in EMCal based on cells amplitude distributions
//
// Input needed :
// can be either outputs QA from AliAnaCalorimeterQA task (BadChannelAnalysis() function)
// Or from merged output of AliAnalysisTaskCaloCellsQA (use BCAnalysis() function)
//
// Ouput:
// in Results.txt file and cell control plots for bad channel candidates will be created in BadCandidate.pdf
// 
// To classify between bad/warm/good (this  last case can also occur in bad candidates) 
// the user will have to check manually (by eye)control plots. In those in red the bad cell candidate energy distrib in black a reference choosen
// just to guide the eye
// 
//
// Author : Alexis Mas (SUBATECH), based on getCellsRunQA.C from Olga Driga (SUBATECH)

#if !defined(__CINT__) || defined(__MAKECINT__) 
#include <TFile.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TH3D.h>
#include <TLine.h>
#include <Riostream.h>
#include <TCanvas.h>
#include <TGraphErrors.h>
#include <TGrid.h>
#include <TStyle.h>
#include <TFileMerger.h>
#include <TMultiGraph.h>
#include <TROOT.h>
#include <TLegend.h>
#include <TString.h>
#include <TGridCollection.h>
#include <TGridResult.h>
#include <TClonesArray.h>
#include <TObjString.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#endif
using namespace std;


void Draw(Int_t cell[], Int_t iBC, Int_t nBC, const Int_t cellref=151){
  //Allow to produce a pdf file with badcells candidates (red) compared to a refence cell (black)
  
  gROOT ->SetStyle("Plain");
  gStyle->SetOptStat(0); 
  gStyle->SetFillColor(kWhite);
  gStyle->SetTitleFillColor(kWhite);
  gStyle->SetPalette(1);
  
  char out[120]; char title[100]; char name[100];
  TString slide = "Cells ";
  slide+=cell[iBC];
  slide+="-";
  slide+=cell[iBC+nBC-1];
  sprintf(out,"%d-%d.gif",cell[iBC],cell[iBC+nBC-1]); 
  
  TH2 *hCellAmplitude = (TH2*) gFile->Get("hCellAmplitude"); 
  TH1 *hCellref       = hCellAmplitude->ProjectionY("badcells",cellref+1,cellref+1);
  
  Int_t i;
  TCanvas *c1 = new TCanvas("badcells","badcells",1000,750) ;
  c1->SetLogy();
  if      (nBC > 6) c1->Divide(3,3) ;
  else if (nBC > 3) c1->Divide(3,2) ;
  else              c1->Divide(3,1);  
  // hCellref->Rebin(3);
  
  TLegend *leg = new TLegend(0.7, 0.7, 0.9, 0.9);
  for(i=0; i<nBC ; i++){
    sprintf(name,"Cell %d",cell[iBC+i]) ;
    TH1 *hCell = hCellAmplitude->ProjectionY(name,cell[iBC+i]+1,cell[iBC+i]+1);
    c1->cd(i%9 + 1) ;
    c1->cd(i%9 + 1)->SetLogy(); 
    sprintf(title,"Cell %d      Entries : %d",cell[iBC+i], (Int_t)hCell->GetEntries()) ;
    hCell->SetLineColor(2)  ; 
    // cout<<title<<endl ; 
    hCell->SetMaximum(1e5);
    // hCell->Rebin(3);
    hCell->SetAxisRange(0.,4.);
    hCell->GetXaxis()->SetTitle("E (GeV)"); 
    hCell->GetYaxis()->SetTitle("N Entries");
    hCellref->SetAxisRange(0.,4.);
    hCell->SetLineWidth(1) ;
    hCellref->SetLineWidth(1) ;
    hCell->SetTitle(title);
    hCellref->SetLineColor(1)  ;  
    if(i==0){
      leg->AddEntry(hCellref,"reference","l"); 
      leg->AddEntry(hCell,"current","l");; 
    }
    hCell->Draw() ;
    hCellref->Draw("same") ; 
    leg->Draw();
  }
  
  //CREATE A PDF FILE 
  TString PdfName = "BadCellsCandidate.pdf";
  if(nBC<9) {
    PdfName +=")"; 
    c1->Print(PdfName.Data());}
  else if(iBC==0) {  
    PdfName +="("; 
    c1->Print(PdfName.Data());}
  else  c1->Print(PdfName.Data());
  
  
  //  c1->SaveAs(out);  
  delete hCellref ; 
  delete c1 ; 
  delete leg ;
  
}

//_________________________________________________________________________
//_________________________________________________________________________

void Convert(TString fCalorimeter = "EMCAL", TString period = "LHC11h", TString pass = "pass1_HLT", TString trigger= "default"){ 
  
  // Create one file for the analysis from several outputs QA files listed in runlist.txt
  // You need :
  //   runlist.txt with runs listed 
  //   outputsQA  e.g  period/pass/123456.root 
  
  TH2F * hCellAmplitude = new TH2F("hCellAmplitude","Cell Amplitude",11520,0,11520,200,0,10);
  TH1D * hNEventsProcessedPerRun = new TH1D("hNEventsProcessedPerRun","Number of processed events vs run number",200000,100000,300000);
  FILE * pFile;
  TString file = "/scratch/alicehp2/mas/analyse/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 "<<trigger<<  endl; 
  
  Int_t ix,iy;
  Int_t Nentr;
  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] ;
  
  while (1){
    ncols = fscanf(pFile,"%d  %d ",&p,&q);
    if (ncols< 0) break;
    x[nlines]=p;
    RunId[nlines]=q;
    xrun[nlines]=1.*q;
    nlines++;
  }
  
  fclose(pFile);
  
  const Int_t nRun = nlines ;
  Double_t content;
  TString base ;
  TString BCfile ;
  TString direct = "CaloQA_"; 
  direct += trigger;
  
  for(Int_t i = 0 ; i < nRun ; i++) { 
    base = "/scratch/alicehp2/germain/QA/";
    BCfile = base + period ;
    BCfile += trigger ;
    BCfile += ".root";
    base += period ;
    base += "/";
    base += pass ;
    base += "/";
    base += RunId[i] ;
    TString infile ;
    infile = base + ".root" ;
    TFile *f = TFile::Open(infile);
    base += "/" ;
    base += trigger ; 
    TDirectoryFile *dir = (TDirectoryFile *)f->Get(direct);
    TList *outputList = (TList*)dir->Get(direct);
    TH2F *hAmpId;
    TH2F *hNEvents;
    hAmpId =(TH2F *)outputList->FindObject("EMCAL_hAmpId");
    hNEvents =(TH2F *)outputList->FindObject("hNEvents");
    Nentr =  (Int_t)hNEvents->GetEntries();
    if (Nentr<100) continue ;
    hNEventsProcessedPerRun->SetBinContent(RunId[i]-100000,(Double_t)Nentr);
    
    for(ix=1;ix<=200;ix++){ 
      for(iy=1; iy<=11520; iy++){ 
        content = 0.0 ;
        content +=  hAmpId->GetBinContent(ix,iy);
        content +=  hCellAmplitude->GetBinContent(iy,ix);
        if(content > 0.5) 
          hCellAmplitude->SetBinContent(iy,ix,content);
      }
    }  
    
    //cout<<i<<endl;
    if(i==0){ cout<<"Merging/Converting procedure ..." ; cout.flush();}
    else { cout<<"..." ; cout.flush();}
    outputList->Delete();
    dir->Delete();
    f->Close();
    delete f;
  }
  
  
  TFile *BCF = TFile::Open(BCfile,"recreate");
  hNEventsProcessedPerRun->Write();
  hCellAmplitude->Write();
  BCF->Close();
  cout<<"DONE !"<<endl;
  
}

//_________________________________________________________________________
//_________________________________________________________________________

void Process(Int_t *pflag[11520][7], TH1* inhisto, Double_t Nsigma = 4., Int_t dnbins = 200, Double_t dmaxval = -1.)
{  
  //  1) create a distribution for the input histogram;
  //  2) fit the distribution with a gaussian
  //  3) define good area within +-Nsigma to identfy badcells
  // 
  // inhisto -- input histogram;
  // dnbins -- number of bins in distribution;
  // dmaxval -- maximum value on distribution histogram.
  
  Int_t crit = *pflag[0][0] ; //identify the criterum processed
  Double_t goodmax= 0. ; 
  Double_t goodmin= 0. ;
  *pflag[0][0] =1;
  if (dmaxval < 0.) {
    dmaxval = inhisto->GetMaximum()*1.01;  // 1.01 - to see the last bin
    if(crit==2 && dmaxval > 1) dmaxval =1. ;
  }    
  
  TH1 *distrib = new TH1F(Form("%sDistr",inhisto->GetName()), "", dnbins, inhisto->GetMinimum(), dmaxval);
  distrib->SetXTitle(inhisto->GetYaxis()->GetTitle());
  distrib->SetYTitle("Entries");
  
  // fill distribution
  for (Int_t c = 1; c <= inhisto->GetNbinsX(); c++)
    distrib->Fill(inhisto->GetBinContent(c));
  
  // draw histogram + distribution
  TCanvas *c1 = new TCanvas(inhisto->GetName(),inhisto->GetName(), 800,400);
  c1->Divide(2,1);
  
  c1->cd(1);
  gPad->SetLeftMargin(0.14);
  gPad->SetRightMargin(0.06);
  gPad->SetLogy();
  inhisto->SetTitleOffset(1.7,"Y");
  inhisto->Draw();
  
  c1->cd(2);
  gPad->SetLeftMargin(0.14);
  gPad->SetRightMargin(0.10);
  gPad->SetLogy();
  distrib->Draw();
  
  Int_t higherbin=0,i;
  for (i = 2; i <= distrib->GetNbinsX(); i++){
    if(distrib->GetBinContent(higherbin) < distrib->GetBinContent(i))
      higherbin = i ;
  }
  
  for(i=higherbin ; i<=dnbins ; i++)
    if(distrib->GetBinContent(i)<2) break ;
  goodmax = distrib->GetBinCenter(i);
  
  for(i=higherbin ; i>0 ; i--)
    if(distrib->GetBinContent(i)<2) break ;
  goodmin = distrib->GetBinLowEdge(i);
  
  TF1 *fit2 = new TF1("fit2", "gaus");
  
  distrib->Fit(fit2, "0LQEM", "", goodmin, goodmax);
  Double_t sig, mean, chi2ndf; 
  mean = fit2->GetParameter(1);
  sig = fit2->GetParameter(2);
  chi2ndf = fit2->GetChisquare()/fit2->GetNDF();
  goodmin = mean - Nsigma*sig ;
  goodmax = mean + Nsigma*sig ;
  
  // lines
  TLine *lline = new TLine(goodmin, 0, goodmin, distrib->GetMaximum());
  lline->SetLineColor(kOrange);
  lline->SetLineStyle(7);
  lline->Draw();
  
  TLine *rline = new TLine(goodmax, 0, goodmax, distrib->GetMaximum());
  rline->SetLineColor(kOrange);
  rline->SetLineStyle(7);
  rline->Draw();
  
  // legend
  TLegend *leg = new TLegend(0.60,0.82,0.9,0.88);
  leg->AddEntry(lline, "Good region boundary","l");
  leg->Draw("same");
  fit2->Draw("same");
  
  c1->Update();
  TString name = "criteria-" ;
  name+= crit;
  name+= ".gif";
  
  c1->SaveAs(name); 
  
  Int_t ntot = 0, cel;
  
  for (Int_t c = 1; c <= inhisto->GetNbinsX(); c++) {
    cel=(Int_t)(inhisto->GetBinLowEdge(c)+0.1);
    if (inhisto->GetBinContent(c) < goodmin) { 
      ntot++;
      *pflag[cel][crit]=0; 
    }
    else if (inhisto->GetBinContent(c) > goodmax) { 
      ntot++; 
      *pflag[cel][crit]=2;
    }
  }
}

//_________________________________________________________________________
//_________________________________________________________________________

void TestCellEandN(Int_t *pflag[11520][7], Double_t Emin = 0.1, Double_t Nsigma = 4., char* hname = "hCellAmplitude", Int_t dnbins = 200)
{
  
  
  // Three more tests for bad cells:
  //  1) total deposited energy;
  //  2) total number of entries;
  //  3) average energy = [total deposited energy]/[total number of entries].
  //
  
  
  // input; X axis -- absId numbers
  TH2 *hCellAmplitude = (TH2*) gFile->Get(hname);
  
  // binning parameters
  Int_t ncells = hCellAmplitude->GetNbinsX();
  Double_t amin = hCellAmplitude->GetXaxis()->GetXmin();
  Double_t amax = hCellAmplitude->GetXaxis()->GetXmax();
  
  TH1* hCellEtotal = new TH1F(Form("%s_hCellEtotal_E%.2f",hname,Emin),
                              Form("Total deposited energy, E > %.2f GeV",Emin), ncells,amin,amax);
  hCellEtotal->SetXTitle("AbsId");
  hCellEtotal->SetYTitle("Energy, GeV");
  
  TH1F *hCellNtotal = new TH1F(Form("%s_hCellNtotal_E%.2f",hname,Emin),
                               Form("Number of entries per events, E > %.2f GeV",Emin), ncells,amin,amax);
  hCellNtotal->SetXTitle("AbsId");
  hCellNtotal->SetYTitle("Entries");
  
  TH1F *hCellEtoNtotal = new TH1F(Form("%s_hCellEtoNtotal_E%.2f",hname,Emin),
                                  Form("Average energy per hit, E > %.2f GeV",Emin), ncells,amin,amax);
  hCellEtoNtotal->SetXTitle("AbsId");
  hCellEtoNtotal->SetYTitle("Energy, GeV");
  
  TH1* hNEventsProcessedPerRun = (TH1*) gFile->Get("hNEventsProcessedPerRun");
  Double_t totalevents = hNEventsProcessedPerRun->Integral(1, hNEventsProcessedPerRun->GetNbinsX());
  
  // fill cells
  for (Int_t c = 1; c <= ncells; c++) {
    Double_t Esum = 0;
    Double_t Nsum = 0;
    
    
    for (Int_t j = 1; j <= hCellAmplitude->GetNbinsY(); j++) {
      Double_t E = hCellAmplitude->GetYaxis()->GetBinCenter(j);
      Double_t N = hCellAmplitude->GetBinContent(c, j);
      if (E < Emin) continue;
      Esum += E*N;
      Nsum += N;
    }
    
    hCellEtotal->SetBinContent(c, Esum);
    hCellNtotal->SetBinContent(c, Nsum/totalevents);
    
    if (Nsum > 0.5)  // number of entries >= 1
      hCellEtoNtotal->SetBinContent(c, Esum/Nsum);
    
  }
  
  delete hCellAmplitude;
  
  // Process(hCellEtotal,   dnbins );
  if(*pflag[0][0]==1)
    Process(pflag, hCellEtoNtotal, Nsigma, dnbins );
  if(*pflag[0][0]==2)
    Process(pflag, hCellNtotal, Nsigma,  dnbins );
}

//_________________________________________________________________________
//_________________________________________________________________________

void TestCellShapes(Int_t *pflag[11520][7], Double_t fitEmin, Double_t fitEmax, Double_t Nsigma =4., char* hname = "hCellAmplitude", Int_t dnbins = 1000)
{
  // Test cells shape using fit function f(x)=A*exp(-B*x)/x^2.
  // Produce values per cell + distributions for A,B and chi2/ndf parameters.
  
  TH2 *hCellAmplitude = (TH2*) gFile->Get(Form("%s",hname));
  
  // binning parameters
  Int_t  ncells = hCellAmplitude->GetNbinsX();
  Double_t amin = hCellAmplitude->GetXaxis()->GetXmin();
  Double_t amax = hCellAmplitude->GetXaxis()->GetXmax();
  
  // initialize histograms
  TH1 *hFitA = new TH1F(Form("hFitA_%s",hname),"Fit A value", ncells,amin,amax);
  hFitA->SetXTitle("AbsId");
  hFitA->SetYTitle("A");
  
  TH1 *hFitB = new TH1F(Form("hFitB_%s",hname),"Fit B value", ncells,amin,amax);
  hFitB->SetXTitle("AbsId");
  hFitB->SetYTitle("B");
  
  TH1 *hFitChi2Ndf = new TH1F(Form("hFitChi2Ndf_%s",hname),"Fit #chi^{2}/ndf value", ncells,amin,amax);
  hFitChi2Ndf->SetXTitle("AbsId");
  hFitChi2Ndf->SetYTitle("#chi^{2}/ndf");
  
  Double_t maxval1=0., maxval2=0., maxval3=0.;
  Double_t prev=0., MSA=0., AvA = 0. ; //those param are used to automaticaly determined a reasonable maxval1
  Double_t prev2=0., MSB=0., AvB = 0.  ; //those param are used to automaticaly determined a reasonable maxval2
  Double_t prev3=0., MSki2=0., Avki2 = 0. ; //those param are used to automaticaly determined a reasonable maxval3
  Double_t ki2=0.0 ;
  
  for (Int_t k = 1; k <= ncells; k++) { 
    TF1 *fit = new TF1("fit", "[0]*exp(-[1]*x)/x^2");
    TH1 *hCell = hCellAmplitude->ProjectionY("",k,k);
    if (hCell->GetEntries() == 0) continue;
    // hCell->Rebin(3);
    hCell->Fit(fit, "0QEM", "", fitEmin, fitEmax);
    delete hCell; 
    
    if(fit->GetParameter(0) < 5000.){ 
      hFitA->SetBinContent(k, fit->GetParameter(0));
      if(k<3000) {
        AvA +=  fit->GetParameter(0);
        if(k==2999)  maxval1  = AvA/3000. ;
        if (prev < fit->GetParameter(0)) MSA += fit->GetParameter(0) - prev;
        else MSA -= (fit->GetParameter(0) - prev) ;
        prev = fit->GetParameter(0);
      }
      
      else 
      {
        
        if((fit->GetParameter(0) - maxval1) > 0. && (fit->GetParameter(0) - maxval1) < (MSA/1000.))
        {
          maxval1 = fit->GetParameter(0); 
        }
      }
    }
    else hFitA->SetBinContent(k, 5000.);
    
    
    
    if(fit->GetParameter(1) < 5000.){ 
      hFitB->SetBinContent(k, fit->GetParameter(1));
      if(k<3000) {
        AvB +=  fit->GetParameter(1);
        if(k==2999)  maxval2  = AvB/3000. ;
        if (prev2 < fit->GetParameter(1)) MSB += fit->GetParameter(1) - prev2;
        else MSB -= (fit->GetParameter(1) - prev2) ;
        prev2 = fit->GetParameter(1);
      }
      
      else 
      {
        
        if((fit->GetParameter(1) - maxval2) > 0. && (fit->GetParameter(1) - maxval2) < (MSB/1000.))
        {
          maxval2 = fit->GetParameter(1); 
        }
      }
    }
    else hFitB->SetBinContent(k, 5000.);
    
    
    if (fit->GetNDF() != 0 ) ki2 =  fit->GetChisquare()/fit->GetNDF();
    else ki2 = 1000.;
    
    if(ki2 < 1000.){ 
      hFitChi2Ndf->SetBinContent(k, ki2);
      if(k<3000) {
        Avki2 +=  ki2;
        if(k==2999)  maxval3  = Avki2/3000. ;
        if (prev3 < ki2) MSki2 += ki2 - prev3;
        else MSki2 -= (ki2 - prev3) ;
        prev3 = ki2;
      }
      
      else 
      {
        
        if((ki2 - maxval3) > 0. && (ki2 - maxval3) < (MSki2/1000.))
        {
          maxval3 = ki2; 
        }
      }
    }
    else hFitChi2Ndf->SetBinContent(k, 1000.);
    
    
    delete fit ;
  }
  
  delete hCellAmplitude;
  
  // if you have problem with automatic parameter :
  //  maxval1 = 
  //  maxval2 =
  //  maxval3 =
  
  
  if(*pflag[0][0]==3)
    Process(pflag, hFitChi2Ndf, Nsigma, dnbins, maxval3); 
  
  
  if(*pflag[0][0]==4)
    Process(pflag, hFitA, Nsigma, dnbins,  maxval1); 
  
  
  if(*pflag[0][0]==5)
    Process(pflag, hFitB, Nsigma, dnbins, maxval2);
  
}

//_________________________________________________________________________
//_________________________________________________________________________

void ExcludeCells(Int_t *pexclu[11520]) {
  //find the cell with 0 entrie for excluding
  TH2 *hCellAmplitude = (TH2*) gFile->Get("hCellAmplitude"); 
  
  
  for (Int_t c = 1; c <= 11520; c++) {
    Double_t Nsum = 0;
    
    for (Int_t l = 1; l <= hCellAmplitude->GetNbinsY(); l++) {
      Double_t N = hCellAmplitude->GetBinContent(c, l);
      Nsum += N;
    }
    if(Nsum < 0.5 && *pexclu[c-1]!=1) *pexclu[c-1]=1; //trick for criterum 7
    //if(Nsum < 0.5 ) *pexclu[c-1]=1; 
    else *pexclu[c-1]=0;
  }
  delete hCellAmplitude;
}

//_________________________________________________________________________
//_________________________________________________________________________

void KillCells(Int_t filter[], Int_t nbc) {
  // kill a cell : put it to 0 entrie 
  TH2 *hCellAmplitude = (TH2*) gFile->Get("hCellAmplitude");
  
  for(Int_t i =0; i<nbc; i++){
    for(Int_t j=0; j<= hCellAmplitude->GetNbinsY() ;j++){
      hCellAmplitude->SetBinContent(filter[i]+1,j,0) ; }}
  
  TH1* hNEventsProcessedPerRun = (TH1*) gFile->Get("hNEventsProcessedPerRun");
  
  TFile *tf = new TFile("filter.root","recreate");
  hCellAmplitude->Write(); 
  hNEventsProcessedPerRun->Write(); 
  tf->Write();
  tf->Close();
  delete hCellAmplitude; delete hNEventsProcessedPerRun;
}

//_________________________________________________________________________
//_________________________________________________________________________

void PeriodAnalysis(Int_t criterum=7, Double_t Nsigma = 4.0, Double_t Emin=0.1, Double_t Emax=1.0, TString file ="none") { 
  
  // what it does in function of criterum value 
  
  // 1 : average E for E>Emin
  // 2 : entries for E>Emin
  // 3 : ki²/ndf  (from fit of each cell Amplitude between Emin and Emax) 
  // 4 : A parameter (from fit of each cell Amplitude between Emin and Emax) 
  // 5 : B parameter (from fit of each cell Amplitude between Emin and Emax) 
  // 6 : 
  // 7 : give bad + dead list
  
  Int_t newBC[11520]; // newBC[0] donne l'id de la premiere BC trouvée
  Int_t *pexclu[11520] ;
  Int_t exclu[11520];
  Int_t *pflag[11520][7] ;
  Int_t flag[11520][7];
  Int_t bad[1000] ;
  Int_t i, j, nb=0; 
  
  //INIT
  TString output, bilan;
  if(criterum == 7) bilan = "Results.txt" ;
  output.Form("Criterum-%d_Emin-%.2f.txt",criterum,Emin); 
  for(i=0;i<11520;i++) { exclu[i]=0; pexclu[i] =&exclu[i];
    for(j=0;j<7;j++) { flag[i][j] =1 ; pflag[i][j] = &flag[i][j];}}
  flag[0][0]=criterum ; //to identify the criterum tested
  
  
  //CELLS EXCLUDED
  ExcludeCells(pexclu); //exclude cells from analysis (will not appear in results)
  if(criterum < 7){
    cout<<"Excluded/dead cells : "<<endl;
    for(i=0;i<11520;i++) {if(exclu[i]!=0) {cout<<i<<", " ; nb++;}}
    cout<<"("<<nb<<")"<<endl; nb=0;}
  
  
  //CRITERUM 7 : FINAL RESULT
  if(criterum ==7) { 
    cout<<"FINAL RESULTS"<<endl;
    ofstream fichier(bilan, ios::out | ios::trunc);  
    if(fichier){
      fichier<<"Dead cells : "<<endl;  
      cout<<"Dead cells : "<<endl;
      for(i=0;i<11520;i++) {
        if(exclu[i]!=0) {fichier<<i<<", " ; cout<<i<<", " ; nb++;}}
      fichier<<"("<<nb<<")"<<endl; cout<<"("<<nb<<")"<<endl; nb=0;
      
      TFile::Open("filter.root");
      ExcludeCells(pexclu); 
      fichier<<"Bad cells candidates : "<<endl; cout<<"Bad cells candidates : "<<endl;
      for(i=0;i<11520;i++) {
        if(exclu[i]!=0) {bad[nb]=i; fichier<<i<<", " ; cout<<i<<", " ;
          nb++; if(nb==999){ cout<<"TO MUCH BAD CELLS"<<endl ; break;}}}
      fichier<<"("<<nb<<")"<<endl; cout<<"("<<nb<<")"<<endl;}
    fichier.close();
    
    if(file!="none"){
      TFile::Open(file);
      Int_t w=0 ;
      Int_t c;   
      for(w=0; (w*9)<=nb; w++) {
        if(9<=(nb-w*9)) c = 9 ; 
        else c = nb-9*w ;
        Draw(bad, w*9, c) ;
      }}
    
    nb=0;
  }
  
  
  //ANALYSIS
  if (criterum < 3)  TestCellEandN(pflag, Emin, Nsigma);
  else if (criterum < 6)
    TestCellShapes(pflag, Emin, Emax, Nsigma);
  
  
  //RESULTS
  if(criterum < 6) { nb=0;
    cout<<"bad by lower value : "<<endl;
    for(i=0;i<11520;i++) {
      if(flag[i][criterum]==0 && exclu[i]==0){nb++;
        cout<<i<<", " ;}} cout<<"("<<nb<<")"<<endl; nb=0;
    
    cout<<"bad by higher value : "<<endl;
    for(i=0;i<11520;i++) {
      if(flag[i][criterum]==2 && exclu[i]==0) {nb++;
        cout<<i<<", " ;}} cout<<"("<<nb<<")"<<endl; nb=0;
    
    cout<<"total bad "<<endl;
    for(i=0;i<11520;i++) {
      if(flag[i][criterum]!=1 && exclu[i]==0) {
        newBC[nb]=i;
        nb++;
        cout<<i<<", " ; }} cout<<"("<<nb<<")"<<endl;
    
    
    //create a filtered file
    KillCells(newBC,nb) ; nb=0;
    
    //write in a file the results
    ofstream fichier(output, ios::out | ios::trunc);  
    if(fichier)
    {
      fichier <<"criterum : "<<criterum<<", Emin = "<<Emin<<" GeV"<<", Emax = "<<Emax<<" GeV"<<endl;
      fichier<<"bad by lower value : "<<endl;
      for(i=0;i<11520;i++) {
        if(flag[i][criterum]==0 && exclu[i]==0){nb++;
          fichier<<i<<", " ;}} fichier<<"("<<nb<<")"<<endl; nb=0;
      
      fichier<<"bad by higher value : "<<endl;
      for(i=0;i<11520;i++) {
        if(flag[i][criterum]==2 && exclu[i]==0) {nb++;
          fichier<<i<<", " ;}} fichier<<"("<<nb<<")"<<endl; nb=0;
      
      fichier<<"total bad "<<endl;
      for(i=0;i<11520;i++) {
        if(flag[i][criterum]!=1 && exclu[i]==0) {
          newBC[nb]=i;
          nb++;
          fichier<<i<<", " ; }} fichier<<"("<<nb<<")"<<endl;   
      fichier.close();  
    }
    else  
      cerr << "opening error" << endl; 
    
  }
  
}


//_________________________________________________________________________
//_________________________________________________________________________

void BCAnalysis(TString file, TString trigger = "default"){
  
  //Configure a complete analysis with different criteria, it provides bad+dead cells lists
  //You can manage criteria used and their order, the first criteria will use the original 
  //output file from AliAnalysisTaskCaloCellsQA task, then after each criteria it will use a filtered file without the badchannel previously identified
  
  if(trigger=="default"){
    
    TFile::Open(file);
    PeriodAnalysis(3, 8., 0.1, 2.5);
    TFile::Open("filter.root");
    PeriodAnalysis(2, 4., 0.1, 2.5); 
    TFile::Open("filter.root");
    PeriodAnalysis(2, 4., 0.5, 2.5);
    TFile::Open("filter.root");
    PeriodAnalysis(1, 4., 0.1, 2.5);
    TFile::Open("filter.root");
    PeriodAnalysis(4, 4., 0.1,2.5); 
    
  }
  
  else { //you have the possibility to change analysis configuration  in function of trigger type
    
    TFile::Open(file);
    PeriodAnalysis(3, 8., 0.1, 2.5);
    TFile::Open("filter.root");
    PeriodAnalysis(2, 4., 0.1, 2.5); 
    TFile::Open("filter.root");
    PeriodAnalysis(2, 4., 0.5, 2.5);
    TFile::Open("filter.root");
    PeriodAnalysis(1, 4., 0.1, 2.5);
    TFile::Open("filter.root");
    PeriodAnalysis(4, 4., 0.1, 2.5); 
    
  }
  
  TFile::Open(file);
  PeriodAnalysis(7,0.,0.,0.,file); //provide dead cells list from original file and draw bad cells candidate from indicated file
  
}

//_________________________________________________________________________
//_________________________________________________________________________

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