1 // This macro has been developed to find badcells candidates in EMCal based on cells amplitude distributions
4 // can be either outputs QA from AliAnaCalorimeterQA task (BadChannelAnalysis() function)
5 // Or from merged output of AliAnalysisTaskCaloCellsQA (use BCAnalysis() function)
8 // in Results.txt file and cell control plots for bad channel candidates will be created in BadCandidate.pdf
10 // To classify between bad/warm/good (this last case can also occur in bad candidates)
11 // 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
12 // just to guide the eye
15 // Author : Alexis Mas (SUBATECH), based on getCellsRunQA.C from Olga Driga (SUBATECH)
17 #if !defined(__CINT__) || defined(__MAKECINT__)
23 #include <Riostream.h>
25 #include <TGraphErrors.h>
28 #include <TFileMerger.h>
29 #include <TMultiGraph.h>
33 #include <TGridCollection.h>
34 #include <TGridResult.h>
35 #include <TClonesArray.h>
36 #include <TObjString.h>
44 void Draw(Int_t cell[], Int_t iBC, Int_t nBC, const Int_t cellref=151){
45 //Allow to produce a pdf file with badcells candidates (red) compared to a refence cell (black)
47 gROOT ->SetStyle("Plain");
48 gStyle->SetOptStat(0);
49 gStyle->SetFillColor(kWhite);
50 gStyle->SetTitleFillColor(kWhite);
51 gStyle->SetPalette(1);
53 char out[120]; char title[100]; char name[100];
54 TString slide = "Cells ";
57 slide+=cell[iBC+nBC-1];
58 sprintf(out,"%d-%d.gif",cell[iBC],cell[iBC+nBC-1]);
60 TH2 *hCellAmplitude = (TH2*) gFile->Get("hCellAmplitude");
61 TH1 *hCellref = hCellAmplitude->ProjectionY("badcells",cellref+1,cellref+1);
64 TCanvas *c1 = new TCanvas("badcells","badcells",1000,750) ;
66 if (nBC > 6) c1->Divide(3,3) ;
67 else if (nBC > 3) c1->Divide(3,2) ;
69 // hCellref->Rebin(3);
71 TLegend *leg = new TLegend(0.7, 0.7, 0.9, 0.9);
72 for(i=0; i<nBC ; i++){
73 sprintf(name,"Cell %d",cell[iBC+i]) ;
74 TH1 *hCell = hCellAmplitude->ProjectionY(name,cell[iBC+i]+1,cell[iBC+i]+1);
76 c1->cd(i%9 + 1)->SetLogy();
77 sprintf(title,"Cell %d Entries : %d",cell[iBC+i], (Int_t)hCell->GetEntries()) ;
78 hCell->SetLineColor(2) ;
79 // cout<<title<<endl ;
80 hCell->SetMaximum(1e5);
82 hCell->SetAxisRange(0.,4.);
83 hCell->GetXaxis()->SetTitle("E (GeV)");
84 hCell->GetYaxis()->SetTitle("N Entries");
85 hCellref->SetAxisRange(0.,4.);
86 hCell->SetLineWidth(1) ;
87 hCellref->SetLineWidth(1) ;
88 hCell->SetTitle(title);
89 hCellref->SetLineColor(1) ;
91 leg->AddEntry(hCellref,"reference","l");
92 leg->AddEntry(hCell,"current","l");;
95 hCellref->Draw("same") ;
100 TString PdfName = "BadCellsCandidate.pdf";
103 c1->Print(PdfName.Data());}
106 c1->Print(PdfName.Data());}
107 else c1->Print(PdfName.Data());
117 //_________________________________________________________________________
118 //_________________________________________________________________________
120 void Convert(TString fCalorimeter = "EMCAL", TString period = "LHC11h", TString pass = "pass1_HLT", TString trigger= "default"){
122 // Create one file for the analysis from several outputs QA files listed in runlist.txt
124 // runlist.txt with runs listed
125 // outputsQA e.g period/pass/123456.root
127 TH2F * hCellAmplitude = new TH2F("hCellAmplitude","Cell Amplitude",11520,0,11520,200,0,10);
128 TH1D * hNEventsProcessedPerRun = new TH1D("hNEventsProcessedPerRun","Number of processed events vs run number",200000,100000,300000);
130 TString file = "/scratch/alicehp2/mas/analyse/QA/"+period+"/"+ pass + "/runlistMB.txt" ;
132 pFile = fopen(file.Data(), "r"); //open the text file where include the run list and correct run index
135 cout << " fcalo: " << fCalorimeter << "; period: " << period << "; pass: " << pass << " trigger "<<trigger<< endl;
149 ncols = fscanf(pFile,"%d %d ",&p,&q);
159 const Int_t nRun = nlines ;
163 TString direct = "CaloQA_";
166 for(Int_t i = 0 ; i < nRun ; i++) {
167 base = "/scratch/alicehp2/germain/QA/";
168 BCfile = base + period ;
177 infile = base + ".root" ;
178 TFile *f = TFile::Open(infile);
181 TDirectoryFile *dir = (TDirectoryFile *)f->Get(direct);
182 TList *outputList = (TList*)dir->Get(direct);
185 hAmpId =(TH2F *)outputList->FindObject("EMCAL_hAmpId");
186 hNEvents =(TH2F *)outputList->FindObject("hNEvents");
187 Nentr = (Int_t)hNEvents->GetEntries();
188 if (Nentr<100) continue ;
189 hNEventsProcessedPerRun->SetBinContent(RunId[i]-100000,(Double_t)Nentr);
191 for(ix=1;ix<=200;ix++){
192 for(iy=1; iy<=11520; iy++){
194 content += hAmpId->GetBinContent(ix,iy);
195 content += hCellAmplitude->GetBinContent(iy,ix);
197 hCellAmplitude->SetBinContent(iy,ix,content);
202 if(i==0){ cout<<"Merging/Converting procedure ..." ; cout.flush();}
203 else { cout<<"..." ; cout.flush();}
204 outputList->Delete();
211 TFile *BCF = TFile::Open(BCfile,"recreate");
212 hNEventsProcessedPerRun->Write();
213 hCellAmplitude->Write();
215 cout<<"DONE !"<<endl;
219 //_________________________________________________________________________
220 //_________________________________________________________________________
222 void Process(Int_t *pflag[11520][7], TH1* inhisto, Double_t Nsigma = 4., Int_t dnbins = 200, Double_t dmaxval = -1.)
224 // 1) create a distribution for the input histogram;
225 // 2) fit the distribution with a gaussian
226 // 3) define good area within +-Nsigma to identfy badcells
228 // inhisto -- input histogram;
229 // dnbins -- number of bins in distribution;
230 // dmaxval -- maximum value on distribution histogram.
232 Int_t crit = *pflag[0][0] ; //identify the criterum processed
233 Double_t goodmax= 0. ;
234 Double_t goodmin= 0. ;
237 dmaxval = inhisto->GetMaximum()*1.01; // 1.01 - to see the last bin
238 if(crit==2 && dmaxval > 1) dmaxval =1. ;
241 TH1 *distrib = new TH1F(Form("%sDistr",inhisto->GetName()), "", dnbins, inhisto->GetMinimum(), dmaxval);
242 distrib->SetXTitle(inhisto->GetYaxis()->GetTitle());
243 distrib->SetYTitle("Entries");
246 for (Int_t c = 1; c <= inhisto->GetNbinsX(); c++)
247 distrib->Fill(inhisto->GetBinContent(c));
249 // draw histogram + distribution
250 TCanvas *c1 = new TCanvas(inhisto->GetName(),inhisto->GetName(), 800,400);
254 gPad->SetLeftMargin(0.14);
255 gPad->SetRightMargin(0.06);
257 inhisto->SetTitleOffset(1.7,"Y");
261 gPad->SetLeftMargin(0.14);
262 gPad->SetRightMargin(0.10);
267 for (i = 2; i <= distrib->GetNbinsX(); i++){
268 if(distrib->GetBinContent(higherbin) < distrib->GetBinContent(i))
272 for(i=higherbin ; i<=dnbins ; i++)
273 if(distrib->GetBinContent(i)<2) break ;
274 goodmax = distrib->GetBinCenter(i);
276 for(i=higherbin ; i>0 ; i--)
277 if(distrib->GetBinContent(i)<2) break ;
278 goodmin = distrib->GetBinLowEdge(i);
280 TF1 *fit2 = new TF1("fit2", "gaus");
282 distrib->Fit(fit2, "0LQEM", "", goodmin, goodmax);
283 Double_t sig, mean, chi2ndf;
284 mean = fit2->GetParameter(1);
285 sig = fit2->GetParameter(2);
286 chi2ndf = fit2->GetChisquare()/fit2->GetNDF();
287 goodmin = mean - Nsigma*sig ;
288 goodmax = mean + Nsigma*sig ;
291 TLine *lline = new TLine(goodmin, 0, goodmin, distrib->GetMaximum());
292 lline->SetLineColor(kOrange);
293 lline->SetLineStyle(7);
296 TLine *rline = new TLine(goodmax, 0, goodmax, distrib->GetMaximum());
297 rline->SetLineColor(kOrange);
298 rline->SetLineStyle(7);
302 TLegend *leg = new TLegend(0.60,0.82,0.9,0.88);
303 leg->AddEntry(lline, "Good region boundary","l");
308 TString name = "criteria-" ;
316 for (Int_t c = 1; c <= inhisto->GetNbinsX(); c++) {
317 cel=(Int_t)(inhisto->GetBinLowEdge(c)+0.1);
318 if (inhisto->GetBinContent(c) < goodmin) {
322 else if (inhisto->GetBinContent(c) > goodmax) {
329 //_________________________________________________________________________
330 //_________________________________________________________________________
332 void TestCellEandN(Int_t *pflag[11520][7], Double_t Emin = 0.1, Double_t Nsigma = 4., char* hname = "hCellAmplitude", Int_t dnbins = 200)
336 // Three more tests for bad cells:
337 // 1) total deposited energy;
338 // 2) total number of entries;
339 // 3) average energy = [total deposited energy]/[total number of entries].
343 // input; X axis -- absId numbers
344 TH2 *hCellAmplitude = (TH2*) gFile->Get(hname);
346 // binning parameters
347 Int_t ncells = hCellAmplitude->GetNbinsX();
348 Double_t amin = hCellAmplitude->GetXaxis()->GetXmin();
349 Double_t amax = hCellAmplitude->GetXaxis()->GetXmax();
351 TH1* hCellEtotal = new TH1F(Form("%s_hCellEtotal_E%.2f",hname,Emin),
352 Form("Total deposited energy, E > %.2f GeV",Emin), ncells,amin,amax);
353 hCellEtotal->SetXTitle("AbsId");
354 hCellEtotal->SetYTitle("Energy, GeV");
356 TH1F *hCellNtotal = new TH1F(Form("%s_hCellNtotal_E%.2f",hname,Emin),
357 Form("Number of entries per events, E > %.2f GeV",Emin), ncells,amin,amax);
358 hCellNtotal->SetXTitle("AbsId");
359 hCellNtotal->SetYTitle("Entries");
361 TH1F *hCellEtoNtotal = new TH1F(Form("%s_hCellEtoNtotal_E%.2f",hname,Emin),
362 Form("Average energy per hit, E > %.2f GeV",Emin), ncells,amin,amax);
363 hCellEtoNtotal->SetXTitle("AbsId");
364 hCellEtoNtotal->SetYTitle("Energy, GeV");
366 TH1* hNEventsProcessedPerRun = (TH1*) gFile->Get("hNEventsProcessedPerRun");
367 Double_t totalevents = hNEventsProcessedPerRun->Integral(1, hNEventsProcessedPerRun->GetNbinsX());
370 for (Int_t c = 1; c <= ncells; c++) {
375 for (Int_t j = 1; j <= hCellAmplitude->GetNbinsY(); j++) {
376 Double_t E = hCellAmplitude->GetYaxis()->GetBinCenter(j);
377 Double_t N = hCellAmplitude->GetBinContent(c, j);
378 if (E < Emin) continue;
383 hCellEtotal->SetBinContent(c, Esum);
384 hCellNtotal->SetBinContent(c, Nsum/totalevents);
386 if (Nsum > 0.5) // number of entries >= 1
387 hCellEtoNtotal->SetBinContent(c, Esum/Nsum);
391 delete hCellAmplitude;
393 // Process(hCellEtotal, dnbins );
395 Process(pflag, hCellEtoNtotal, Nsigma, dnbins );
397 Process(pflag, hCellNtotal, Nsigma, dnbins );
400 //_________________________________________________________________________
401 //_________________________________________________________________________
403 void TestCellShapes(Int_t *pflag[11520][7], Double_t fitEmin, Double_t fitEmax, Double_t Nsigma =4., char* hname = "hCellAmplitude", Int_t dnbins = 1000)
405 // Test cells shape using fit function f(x)=A*exp(-B*x)/x^2.
406 // Produce values per cell + distributions for A,B and chi2/ndf parameters.
408 TH2 *hCellAmplitude = (TH2*) gFile->Get(Form("%s",hname));
410 // binning parameters
411 Int_t ncells = hCellAmplitude->GetNbinsX();
412 Double_t amin = hCellAmplitude->GetXaxis()->GetXmin();
413 Double_t amax = hCellAmplitude->GetXaxis()->GetXmax();
415 // initialize histograms
416 TH1 *hFitA = new TH1F(Form("hFitA_%s",hname),"Fit A value", ncells,amin,amax);
417 hFitA->SetXTitle("AbsId");
418 hFitA->SetYTitle("A");
420 TH1 *hFitB = new TH1F(Form("hFitB_%s",hname),"Fit B value", ncells,amin,amax);
421 hFitB->SetXTitle("AbsId");
422 hFitB->SetYTitle("B");
424 TH1 *hFitChi2Ndf = new TH1F(Form("hFitChi2Ndf_%s",hname),"Fit #chi^{2}/ndf value", ncells,amin,amax);
425 hFitChi2Ndf->SetXTitle("AbsId");
426 hFitChi2Ndf->SetYTitle("#chi^{2}/ndf");
428 Double_t maxval1=0., maxval2=0., maxval3=0.;
429 Double_t prev=0., MSA=0., AvA = 0. ; //those param are used to automaticaly determined a reasonable maxval1
430 Double_t prev2=0., MSB=0., AvB = 0. ; //those param are used to automaticaly determined a reasonable maxval2
431 Double_t prev3=0., MSki2=0., Avki2 = 0. ; //those param are used to automaticaly determined a reasonable maxval3
434 for (Int_t k = 1; k <= ncells; k++) {
435 TF1 *fit = new TF1("fit", "[0]*exp(-[1]*x)/x^2");
436 TH1 *hCell = hCellAmplitude->ProjectionY("",k,k);
437 if (hCell->GetEntries() == 0) continue;
439 hCell->Fit(fit, "0QEM", "", fitEmin, fitEmax);
442 if(fit->GetParameter(0) < 5000.){
443 hFitA->SetBinContent(k, fit->GetParameter(0));
445 AvA += fit->GetParameter(0);
446 if(k==2999) maxval1 = AvA/3000. ;
447 if (prev < fit->GetParameter(0)) MSA += fit->GetParameter(0) - prev;
448 else MSA -= (fit->GetParameter(0) - prev) ;
449 prev = fit->GetParameter(0);
455 if((fit->GetParameter(0) - maxval1) > 0. && (fit->GetParameter(0) - maxval1) < (MSA/1000.))
457 maxval1 = fit->GetParameter(0);
461 else hFitA->SetBinContent(k, 5000.);
465 if(fit->GetParameter(1) < 5000.){
466 hFitB->SetBinContent(k, fit->GetParameter(1));
468 AvB += fit->GetParameter(1);
469 if(k==2999) maxval2 = AvB/3000. ;
470 if (prev2 < fit->GetParameter(1)) MSB += fit->GetParameter(1) - prev2;
471 else MSB -= (fit->GetParameter(1) - prev2) ;
472 prev2 = fit->GetParameter(1);
478 if((fit->GetParameter(1) - maxval2) > 0. && (fit->GetParameter(1) - maxval2) < (MSB/1000.))
480 maxval2 = fit->GetParameter(1);
484 else hFitB->SetBinContent(k, 5000.);
487 if (fit->GetNDF() != 0 ) ki2 = fit->GetChisquare()/fit->GetNDF();
491 hFitChi2Ndf->SetBinContent(k, ki2);
494 if(k==2999) maxval3 = Avki2/3000. ;
495 if (prev3 < ki2) MSki2 += ki2 - prev3;
496 else MSki2 -= (ki2 - prev3) ;
503 if((ki2 - maxval3) > 0. && (ki2 - maxval3) < (MSki2/1000.))
509 else hFitChi2Ndf->SetBinContent(k, 1000.);
515 delete hCellAmplitude;
517 // if you have problem with automatic parameter :
524 Process(pflag, hFitChi2Ndf, Nsigma, dnbins, maxval3);
528 Process(pflag, hFitA, Nsigma, dnbins, maxval1);
532 Process(pflag, hFitB, Nsigma, dnbins, maxval2);
536 //_________________________________________________________________________
537 //_________________________________________________________________________
539 void ExcludeCells(Int_t *pexclu[11520]) {
540 //find the cell with 0 entrie for excluding
541 TH2 *hCellAmplitude = (TH2*) gFile->Get("hCellAmplitude");
544 for (Int_t c = 1; c <= 11520; c++) {
547 for (Int_t l = 1; l <= hCellAmplitude->GetNbinsY(); l++) {
548 Double_t N = hCellAmplitude->GetBinContent(c, l);
551 if(Nsum < 0.5 && *pexclu[c-1]!=1) *pexclu[c-1]=1; //trick for criterum 7
552 //if(Nsum < 0.5 ) *pexclu[c-1]=1;
555 delete hCellAmplitude;
558 //_________________________________________________________________________
559 //_________________________________________________________________________
561 void KillCells(Int_t filter[], Int_t nbc) {
562 // kill a cell : put it to 0 entrie
563 TH2 *hCellAmplitude = (TH2*) gFile->Get("hCellAmplitude");
565 for(Int_t i =0; i<nbc; i++){
566 for(Int_t j=0; j<= hCellAmplitude->GetNbinsY() ;j++){
567 hCellAmplitude->SetBinContent(filter[i]+1,j,0) ; }}
569 TH1* hNEventsProcessedPerRun = (TH1*) gFile->Get("hNEventsProcessedPerRun");
571 TFile *tf = new TFile("filter.root","recreate");
572 hCellAmplitude->Write();
573 hNEventsProcessedPerRun->Write();
576 delete hCellAmplitude; delete hNEventsProcessedPerRun;
579 //_________________________________________________________________________
580 //_________________________________________________________________________
582 void PeriodAnalysis(Int_t criterum=7, Double_t Nsigma = 4.0, Double_t Emin=0.1, Double_t Emax=1.0, TString file ="none") {
584 // what it does in function of criterum value
586 // 1 : average E for E>Emin
587 // 2 : entries for E>Emin
588 // 3 : ki²/ndf (from fit of each cell Amplitude between Emin and Emax)
589 // 4 : A parameter (from fit of each cell Amplitude between Emin and Emax)
590 // 5 : B parameter (from fit of each cell Amplitude between Emin and Emax)
592 // 7 : give bad + dead list
594 Int_t newBC[11520]; // newBC[0] donne l'id de la premiere BC trouvée
595 Int_t *pexclu[11520] ;
597 Int_t *pflag[11520][7] ;
598 Int_t flag[11520][7];
603 TString output, bilan;
604 if(criterum == 7) bilan = "Results.txt" ;
605 output.Form("Criterum-%d_Emin-%.2f.txt",criterum,Emin);
606 for(i=0;i<11520;i++) { exclu[i]=0; pexclu[i] =&exclu[i];
607 for(j=0;j<7;j++) { flag[i][j] =1 ; pflag[i][j] = &flag[i][j];}}
608 flag[0][0]=criterum ; //to identify the criterum tested
612 ExcludeCells(pexclu); //exclude cells from analysis (will not appear in results)
614 cout<<"Excluded/dead cells : "<<endl;
615 for(i=0;i<11520;i++) {if(exclu[i]!=0) {cout<<i<<", " ; nb++;}}
616 cout<<"("<<nb<<")"<<endl; nb=0;}
619 //CRITERUM 7 : FINAL RESULT
621 cout<<"FINAL RESULTS"<<endl;
622 ofstream fichier(bilan, ios::out | ios::trunc);
624 fichier<<"Dead cells : "<<endl;
625 cout<<"Dead cells : "<<endl;
626 for(i=0;i<11520;i++) {
627 if(exclu[i]!=0) {fichier<<i<<", " ; cout<<i<<", " ; nb++;}}
628 fichier<<"("<<nb<<")"<<endl; cout<<"("<<nb<<")"<<endl; nb=0;
630 TFile::Open("filter.root");
631 ExcludeCells(pexclu);
632 fichier<<"Bad cells candidates : "<<endl; cout<<"Bad cells candidates : "<<endl;
633 for(i=0;i<11520;i++) {
634 if(exclu[i]!=0) {bad[nb]=i; fichier<<i<<", " ; cout<<i<<", " ;
635 nb++; if(nb==999){ cout<<"TO MUCH BAD CELLS"<<endl ; break;}}}
636 fichier<<"("<<nb<<")"<<endl; cout<<"("<<nb<<")"<<endl;}
643 for(w=0; (w*9)<=nb; w++) {
644 if(9<=(nb-w*9)) c = 9 ;
654 if (criterum < 3) TestCellEandN(pflag, Emin, Nsigma);
655 else if (criterum < 6)
656 TestCellShapes(pflag, Emin, Emax, Nsigma);
660 if(criterum < 6) { nb=0;
661 cout<<"bad by lower value : "<<endl;
662 for(i=0;i<11520;i++) {
663 if(flag[i][criterum]==0 && exclu[i]==0){nb++;
664 cout<<i<<", " ;}} cout<<"("<<nb<<")"<<endl; nb=0;
666 cout<<"bad by higher value : "<<endl;
667 for(i=0;i<11520;i++) {
668 if(flag[i][criterum]==2 && exclu[i]==0) {nb++;
669 cout<<i<<", " ;}} cout<<"("<<nb<<")"<<endl; nb=0;
671 cout<<"total bad "<<endl;
672 for(i=0;i<11520;i++) {
673 if(flag[i][criterum]!=1 && exclu[i]==0) {
676 cout<<i<<", " ; }} cout<<"("<<nb<<")"<<endl;
679 //create a filtered file
680 KillCells(newBC,nb) ; nb=0;
682 //write in a file the results
683 ofstream fichier(output, ios::out | ios::trunc);
686 fichier <<"criterum : "<<criterum<<", Emin = "<<Emin<<" GeV"<<", Emax = "<<Emax<<" GeV"<<endl;
687 fichier<<"bad by lower value : "<<endl;
688 for(i=0;i<11520;i++) {
689 if(flag[i][criterum]==0 && exclu[i]==0){nb++;
690 fichier<<i<<", " ;}} fichier<<"("<<nb<<")"<<endl; nb=0;
692 fichier<<"bad by higher value : "<<endl;
693 for(i=0;i<11520;i++) {
694 if(flag[i][criterum]==2 && exclu[i]==0) {nb++;
695 fichier<<i<<", " ;}} fichier<<"("<<nb<<")"<<endl; nb=0;
697 fichier<<"total bad "<<endl;
698 for(i=0;i<11520;i++) {
699 if(flag[i][criterum]!=1 && exclu[i]==0) {
702 fichier<<i<<", " ; }} fichier<<"("<<nb<<")"<<endl;
706 cerr << "opening error" << endl;
713 //_________________________________________________________________________
714 //_________________________________________________________________________
716 void BCAnalysis(TString file, TString trigger = "default"){
718 //Configure a complete analysis with different criteria, it provides bad+dead cells lists
719 //You can manage criteria used and their order, the first criteria will use the original
720 //output file from AliAnalysisTaskCaloCellsQA task, then after each criteria it will use a filtered file without the badchannel previously identified
722 if(trigger=="default"){
725 PeriodAnalysis(3, 8., 0.1, 2.5);
726 TFile::Open("filter.root");
727 PeriodAnalysis(2, 4., 0.1, 2.5);
728 TFile::Open("filter.root");
729 PeriodAnalysis(2, 4., 0.5, 2.5);
730 TFile::Open("filter.root");
731 PeriodAnalysis(1, 4., 0.1, 2.5);
732 TFile::Open("filter.root");
733 PeriodAnalysis(4, 4., 0.1,2.5);
737 else { //you have the possibility to change analysis configuration in function of trigger type
740 PeriodAnalysis(3, 8., 0.1, 2.5);
741 TFile::Open("filter.root");
742 PeriodAnalysis(2, 4., 0.1, 2.5);
743 TFile::Open("filter.root");
744 PeriodAnalysis(2, 4., 0.5, 2.5);
745 TFile::Open("filter.root");
746 PeriodAnalysis(1, 4., 0.1, 2.5);
747 TFile::Open("filter.root");
748 PeriodAnalysis(4, 4., 0.1, 2.5);
753 PeriodAnalysis(7,0.,0.,0.,file); //provide dead cells list from original file and draw bad cells candidate from indicated file
757 //_________________________________________________________________________
758 //_________________________________________________________________________
760 void BadChannelAnalysis(TString fCalorimeter = "EMCAL", TString period = "LHC11h", TString pass = "pass1_HLT", TString trigger= "default"){
761 Convert(fCalorimeter, period, pass, trigger);
762 TString inputfile = "/scratch/alicehp2/germain/QA/" + period;
763 inputfile += trigger;
764 inputfile += ".root";
765 BCAnalysis(inputfile, trigger);