98 TString htitle,hname,textfilename,rootfilename;
100 double Ecum_cut_PS = 20.;
101 double Ecum_cut_calo = 10.;
104 const double GeV = 1/1000.;
106 double nsigmaHits = 10.;
112 unsigned int onlid = 0;
123 double MeanEventEnergy_max = -999;
124 double MeanEventEnergy_min = 999;
131 vector<int, std::allocator<int> > DQLBList;
133 vector<int, std::allocator<int> > BadLBList;
136 printf(
"Getting histogram limits... ");
137 GetLimits_EqLB(inputfile,lbmin,lbmax,emin,emax,qmin,qmax,runNumber,BadLBList);
145 printf(
"Done.\n LBmin: %d LBmax: %d Emin: %d Emax: %d Qmin: %d Qmax: %d\n",lbmin,lbmax,emin,emax,qmin,qmax);
149 FILE * pFile=
nullptr;
152 textfilename.Form(
"Output/BadCellList_run%d.txt",runNumber);
153 pFile = fopen (textfilename ,
"w");
155 printf(
"Cannot open output text file\n");
161 pFile = fopen (textfilename ,
"w");
163 printf(
"Cannot open output text file\n");
170 fprintf(pFile,
"onlid // part // FT // SL // CH // # Events E>%d sigma // Mean Event Energy [GeV] (min // max) // # LBs // # LBs affected // fraction events Q>%d \n",(
int)nsigmaHits,qthreshold);
173 int EventCount=0., qcount=0.;
179 rootfilename.Form(
"Output/BadCells_run%d.root",runNumber);
182 auto fout = std::make_unique<TFile>(rootfilename,
"RECREATE");
196 printf(
"Creating histograms (nEbins = %d, nQbins = %d, nLBbins = %d)... ",ne,nq,nlb);
197 TH1F hene = TH1F(
"hEne",
"",ne,emin,emax); hene.SetXTitle(
"Energy [GeV]"); hene.SetYTitle(
"Events");
198 TH1F hqua = TH1F(
"hQua",
"",nq/100.,qmin,qmax); hqua.SetXTitle(
"Quality"); hqua.SetYTitle(
"Events");
199 TH1F hlb = TH1F(
"hLB",
"",nlb,lbmin,lbmax); hlb.SetXTitle(
"LB"); hlb.SetYTitle(
"Events");
200 TH2F henelb = TH2F(
"hEnelb",
"",nlb,lbmin,lbmax,ne,emin,emax); henelb.SetXTitle(
"LB"); henelb.SetYTitle(
"Energy [GeV]");
207 printf(
"Creating cut test histograms...");
208 static constexpr int npl=4;
209 TH2F tempHist = TH2F(
"tempNEvLB",
"",1000,0,1000.,1000,0.,1000.);
217 for (
int i=0;i<npl;i++){
218 hname.Form(
"hNEvVsEMean_Layer%i",i);
219 hNEvVsEMean[i].reset((TH2F*)tempHist.Clone(hname));
220 hNEvVsEMean[i]->GetXaxis()->SetTitle(
"Number of Events (E > 10 #sigma) / LB");
221 hNEvVsEMean[i]->GetYaxis()->SetTitle(
"E_{mean} per Event / LB [GeV]");
223 hname.Form(
"hNEvVsECum_Layer%i",i);
224 hNEvVsECum[i].reset((TH2F*)tempHist.Clone(hname));
225 hNEvVsECum[i]->GetXaxis()->SetTitle(
"Number of Events (E > 10 #sigma) / LB");
226 hNEvVsECum[i]->GetYaxis()->SetTitle(
"E_{cumulative} per Cell / LB [GeV]");
228 hname.Form(
"hECumVsEMean_Layer%i",i);
229 hECumVsEMean[i].reset((TH2F*)tempHist.Clone(hname));
230 hECumVsEMean[i]->GetXaxis()->SetTitle(
"E_{cumulative} per Cell / LB [GeV]");
231 hECumVsEMean[i]->GetYaxis()->SetTitle(
"E_{mean} per Event / LB [GeV]");
233 hname.Form(
"hNoise_Layer%i",i);
234 hNoise[i].reset(
new TH1F(hname,
"",60,0.,30.));
235 hNoise[i]->GetXaxis()->SetTitle(
"Noise [GeV]");
236 hNoise[i]->GetYaxis()->SetTitle(
"Number Of Cells");
238 hname.Form(
"hCellsPerLB_Layer%i",i);
239 hCellsPerLB[i].reset((TH1F*)hlb.Clone(hname));
240 hCellsPerLB[i]->GetXaxis()->SetTitle(
"LB");
241 hNoise[i]->GetYaxis()->SetTitle(
"Number Of Cells");
248 std::unique_ptr<LArSamples::Interface> tuple (
Interface::open(inputfile));
249 printf(
"Number of events: %u %u\n",tuple->nEvents(),tuple->nChannels());
250 unsigned int nchannels = tuple->nChannels();
252 printf(
"Begin looping over cells...\n");
253 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
256 if(tuple->historySize(ichan)==0){ nskipped++;
continue; }
264 onlid = cellInfo->
onlid();
267 unsigned int ndigits = hist->nData();
268 if(ndigits<(
unsigned int)
threshold){ nskipped++;
continue; }
272 hname.Form(
"h0x%x_Energy",onlid);
273 h1_e.reset((TH1F*)hene.Clone(hname));
274 hname.Form(
"h0x%x_Quality",onlid);
275 h1_q.reset((TH1F*)hqua.Clone(hname));
276 hname.Form(
"h0x%x_LB",onlid);
277 h1_lb.reset((TH1F*)hlb.Clone(hname));
278 hname.Form(
"h0x%x_hNEvVsEMean",onlid);
279 h1_elb.reset((TH1F*)hlb.Clone(hname));
280 hname.Form(
"h0x%x_Energy_LB",onlid);
281 h2_elb.reset((TH2F*)henelb.Clone(hname));
282 hname.Form(
"h0x%x_Quality_LB",onlid);
283 h1_qlb.reset((TH1F*)hlb.Clone(hname));
287 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
289 double noise =
data->noise()*
GeV;
292 double energy =
data->energy()*
GeV;
294 if (energy > nsigmaHits*noise){
299 h1_q->Fill(
data->quality());
300 h1_lb->Fill(lumiBlock);
301 h1_elb->Fill(lumiBlock, energy);
302 h2_elb->Fill(lumiBlock, energy);
303 h1_qlb->Fill(lumiBlock,
data->quality());
307 if (
data->quality() > qthreshold){
318 hNoise[cellInfo->
layer()]->Fill(noise);
321 if ( CellCounter%1000 == 0 ) {
322 printf(
"Scanning Cell No. = %d\n",CellCounter);
324 MeanEventEnergy_max = -999;
325 MeanEventEnergy_min = 999;
331 for (
int ilb=1;ilb<=nlb;ilb++){
332 if (h1_lb->GetBinContent(ilb) > 0.){
333 double EtotInLB = h1_elb->GetBinContent(ilb);
334 double NEventsInLB = h1_lb->GetBinContent(ilb);
336 int LB_number = h1_lb->GetBinLowEdge(ilb);
338 double MeanEventEnergy = EtotInLB / NEventsInLB;
341 if (cellInfo->
layer()==0){
342 if (EtotInLB>Ecum_cut_PS){
343 hNEvVsEMean[cellInfo->
layer()]->Fill(NEventsInLB,MeanEventEnergy);
344 hNEvVsECum[cellInfo->
layer()]->Fill(NEventsInLB,EtotInLB);
345 hECumVsEMean[cellInfo->
layer()]->Fill(EtotInLB,MeanEventEnergy);
346 hCellsPerLB[cellInfo->
layer()]->Fill(LB_number);
349 else if (EtotInLB>Ecum_cut_calo){
350 hNEvVsEMean[cellInfo->
layer()]->Fill(NEventsInLB,MeanEventEnergy);
351 hNEvVsECum[cellInfo->
layer()]->Fill(NEventsInLB,EtotInLB);
352 hECumVsEMean[cellInfo->
layer()]->Fill(EtotInLB,MeanEventEnergy);
353 hCellsPerLB[cellInfo->
layer()]->Fill(LB_number);
356 if (EtotInLB>Ecum_cut_PS && cellInfo->
layer()==0){
357 FlagCell=
true; FlagCount++;
358 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
359 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
361 else if (EtotInLB>Ecum_cut_calo && cellInfo->
layer()==1){
362 FlagCell=
true; FlagCount++;
363 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
364 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
366 else if (EtotInLB>Ecum_cut_calo && cellInfo->
layer()==2){
367 FlagCell=
true; FlagCount++;
368 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
369 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
371 else if (EtotInLB>Ecum_cut_calo && cellInfo->
layer()==3){
372 FlagCell=
true; FlagCount++;
373 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
374 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
379 fr_q4k = (double)qcount/(
double)EventCount;
386 fprintf(pFile,
"0x%x \t %7s \t %d \t %d \t %d \t %d \t %4.3f \t %4.3f \t %d \t %d \t %4.3f \n",onlid,
m_LarIdTranslator->GetPartitonLayerName(
index),cellInfo->
feedThrough(),cellInfo->
slot(),cellInfo->
channel(),EventCount,MeanEventEnergy_min,MeanEventEnergy_max,NFullLB,FlagCount,fr_q4k);
396 printf(
"Skipped %d cells. Cells scanned = %d\n",nskipped,nbad);
397 printf(
"Cells put in Bad Cell List = %d\n",nBadCells);
398 if (noEvdata>0) printf(
"No Evdata pointer: %d\n",noEvdata);
403 for(
int i=0;i<npl;i++){
404 hNEvVsEMean[i]->Write();
405 hNEvVsECum[i]->Write();
406 hECumVsEMean[i]->Write();
408 hCellsPerLB[i]->Write();
424 TString htitle,hname,textfilename,rootfilename;
436 printf(
"WARNING: Received instruction to select recurring bad cells only in SetSelectRecurringBadCells(bool flag)\n");
437 printf(
"-------> Only one algorithm selected for cell selection criteria in SetAlgo(int algoindex)\n");
438 printf(
"-------> Recurring cell selection overides algorithm specification\n");
443 printf(
"ERROR: Partition not specified in SetPartition(bool set_part, std::string partname)\n");
450 int selectionFlag = -1;
451 const double GeV = 1/1000.;
461 unsigned int onlid = 0;
473 int nEvents_E_gt_ecut=0;
474 double EventEnergySum=0.;
475 double EventEnergyMean=0.;
478 double MeanHits=0, rmsHits=0;
479 int iMeanCellHitsSelection=0,iEnergyThresholdSelection=0,iOR_selection=0,iAND_selection=0;
485 vector<int, std::allocator<int> > DQLBList;
486 vector<int, std::allocator<int> > BadLBList;
488 printf(
"Reading in DQ Defect LB List...\n");
493 printf(
"Getting bad LB list...\n");
494 BadLBList=
GetBadLBList(inputfile,lbmin,lbmax,nsigma,nlb,DQLBList);
495 printf(
"...Done.\n");
496 nBadLBs = BadLBList.size();
499 BadLBList = std::move(DQLBList);
500 nBadLBs = BadLBList.size();
504 printf(
"Getting histogram limits... ");
505 GetLimits_EqLB(inputfile,lbmin,lbmax,emin,emax,qmin,qmax,runNumber,BadLBList);
515 printf(
"Done.\n LBmin: %d LBmax: %d Emin: %d Emax: %d Qmin: %d Qmax: %d\n",lbmin,lbmax,emin,emax,qmin,qmax);
518 FILE * outputFile=
nullptr;
520 textfilename.Form(
"Output/BadCellSelection_run%d.txt",runNumber);
521 outputFile = fopen (textfilename ,
"w");
523 std::cout<<(
"Cannot open output selection summary file " + textfilename)<<
"\n";
527 outputFile = fopen (textfilename ,
"w");
529 std::cout<<(
"Cannot open output selection summary file " + textfilename)<<
"\n";
535 FILE * pFile=
nullptr;
538 textfilename.Form(
"Output/BadCellList_run%d.txt",runNumber);
539 pFile = fopen (textfilename ,
"w");
541 printf(
"Cannot open output text file\n");
546 pFile = fopen (textfilename ,
"w");
548 printf(
"Cannot open output text file\n");
557printf(
"Determining mean cell hits...\n ");
558 GetMeanCellHits(inputfile, nlb, lbmin, lbmax, nsigmaHits, BadLBList, MeanHits, rmsHits, nlb_corr);
560printf(
"Set threshold at %4.3f counts per cell for LB range. \n",(MeanHits+(nsigmaHits*rmsHits))*((
double)nlb_corr-(
double)nBadLBs));
564 fprintf(pFile,
"onlid // part // FT // SL // CH // Events (E>%d sigma) // Events E>1GeV // Mean Energy [GeV] // # LBs // fraction events Q>%d // Flagged in LB // selectionFlag\n",(
int)nsigmaHits,qthreshold);
567 int EventCount=0., qcount=0.;
574 rootfilename.Form(
"Output/BadCells_run%d.root",runNumber);
577 auto fout = std::make_unique<TFile>(rootfilename,
"RECREATE");
585 Float_t meanECell = 0;
587 TH1F* h1_lb =
nullptr;
588 TH1F* h1_e =
nullptr;
589 TH1F* h1_q =
nullptr;
590 TH2F* h2_elb =
nullptr;
591 TH2D* h2_pulse =
nullptr;
592 TH2D* h2_t_LB =
nullptr;
593 TProfile* TProf_pulse =
nullptr;
594 TH1F* h1_ADCmax =
nullptr;
595 std::unique_ptr<TTree> tree_cells;
597 tree_cells.reset(
new TTree(
"BadTree",
"LAr Tree ordered by OnlID"));
598 tree_cells->Branch(
"Energy",&h1_e);
599 tree_cells->Branch(
"Quality",&h1_q);
600 tree_cells->Branch(
"LB",&h1_lb);
601 tree_cells->Branch(
"larid",&larid);
602 tree_cells->Branch(
"onlid",&onlid);
603 tree_cells->Branch(
"Run",&t_run);
604 tree_cells->Branch(
"selectionFlag",&selectionFlag);
605 tree_cells->Branch(
"nhits_ensig",&n_ensig);
606 tree_cells->Branch(
"nhits_e1GeV",&n_ecut);
607 tree_cells->Branch(
"Quality_4k",&fr_q4k);
608 tree_cells->Branch(
"LBfraction",&fr_LB);
609 tree_cells->Branch(
"EnergyVsLB",&h2_elb);
610 tree_cells->Branch(
"PulseShape",&h2_pulse);
611 tree_cells->Branch(
"PulsePeakTimeVsLB",&h2_t_LB);
612 tree_cells->Branch(
"noise",&noise);
613 tree_cells->Branch(
"MeanCellEnergy",&meanECell);
614 tree_cells->Branch(
"PulseShapeTProf",&TProf_pulse);
615 tree_cells->Branch(
"ADCmax",&h1_ADCmax);
620 TH2D NormPulse(
"Normalised_pulse",
"",100,-200,200,400,-10,10);
621 NormPulse.SetXTitle(
"Time [ns]");
622 NormPulse.SetYTitle(
"Value [ADC counts] / ADCmax");
632 TH2F E_LB(
"E_LB",
"",nlb,lbmin,lbmax,ne,emin,emax);
633 E_LB.SetXTitle(
"LB");
634 E_LB.SetYTitle(
"Energy [GeV]");
636 TH2D t_LB(
"t_LB",
"",nlb,lbmin,lbmax,400,-200,200);
637 t_LB.GetXaxis()->SetTitle(
"LB");
638 t_LB.GetYaxis()->SetTitle(
"Time(maxSample) + ofcTime [ns]");
640 TH1F CF_LB(
"CF_LB",
"",nlb,lbmin,lbmax);
641 CF_LB.GetXaxis()->SetTitle(
"LB");
642 CF_LB.GetYaxis()->SetTitle(
"Number of cells flagged");
644 TH1F ME_EV(
"ME_EV",
"",1000,0,1000);
645 ME_EV.GetXaxis()->SetTitle(
"Nbr events >1 GeV");
646 ME_EV.GetYaxis()->SetTitle(
"Mean Energy [GeV]");
651 for (
int ii=0;ii<npl;ii++){
653 Cellmaps[ii]->GetXaxis()->SetTitle(
"#eta"); Cellmaps[ii]->GetYaxis()->SetTitle(
"#Phi");
654 hname.Form(
"%s_PulseShape_%dsigma",
m_LarIdTranslator->GetPartitonLayerName(ii),(
int)nsigmaHits);
655 Pulsemaps[ii].reset((TH2D*)NormPulse.Clone(hname));
657 E_LBmaps[ii].reset((TH2F*)E_LB.Clone(hname));
659 t_LBmaps[ii].reset((TH2D*)t_LB.Clone(hname));
661 CellsFlagged_LB_part[ii].reset((TH1F*)CF_LB.Clone(hname));
664 Emean_NbrEvents_part[ii].reset((TH1F*)ME_EV.Clone(hname));
669 Eeta.GetXaxis()->SetTitle(
"#eta");
670 Eeta.GetYaxis()->SetTitle(
"Energy [GeV]");
672 TH1F CellEnergy(
"CellEnergy",
"",ne,emin,emax);
673 CellEnergy.GetXaxis()->SetTitle(
"Cell Mean Energy [GeV]");
674 CellEnergy.GetYaxis()->SetTitle(
"Cells");
676 TH1F LBfrac(
"LBfrac",
"",100,0.,1.);
677 LBfrac.GetXaxis()->SetTitle(
"LB fraction");
678 LBfrac.GetYaxis()->SetTitle(
"Cells");
680 TH1F Qfrac(
"Qfrac",
"",100.,0.,1.);
681 Qfrac.GetXaxis()->SetTitle(
"Fraction of Events Q>4000");
682 Qfrac.GetYaxis()->SetTitle(
"Cells");
684 TH1F CellsFlagged_LB(
"CellsFlagged_LB",
"",nlb,lbmin,lbmax);
685 CellsFlagged_LB.GetXaxis()->SetTitle(
"LB");
686 CellsFlagged_LB.GetYaxis()->SetTitle(
"Number of cells flagged");
688 TH1F Emean_NbrEvents(
"Emean_NEvents_1GeV",
"",1000,0,1000);
689 Emean_NbrEvents.GetXaxis()->SetTitle(
"N events > 1 GeV");
690 Emean_NbrEvents.GetYaxis()->SetTitle(
"Mean Energy [GeV]");
695 printf(
"Creating histograms (nEbins = %d, nQbins = %d, nLBbins = %d)... ",ne,nq,nlb);
696 TH1F hene = TH1F(
"hEne",
"",ne,emin,emax); hene.SetXTitle(
"Energy [GeV]");
697 hene.SetYTitle(
"Events");
698 TH1F hqua = TH1F(
"hQua",
"",nq/100.,qmin,qmax); hqua.SetXTitle(
"Quality");
699 hqua.SetYTitle(
"Events");
700 TH1F hlb = TH1F(
"hLB",
"",nlb,lbmin,lbmax); hlb.SetXTitle(
"LB");
701 hlb.SetYTitle(
"Events");
702 TH2F henelb = TH2F(
"hEnelb",
"",nlb,lbmin,lbmax,ne,emin,emax); henelb.SetXTitle(
"LB");
703 henelb.SetYTitle(
"Energy [GeV]");
704 TH2D hpulse = TH2D(
"hPulse",
"",100,-200,200,400, -10,10); hpulse.SetXTitle(
"Time [ns]");
705 hpulse.SetYTitle(
"Value [ADC counts] / ADCmax");
706 TProfile TProfpulse = TProfile(
"",
"",5, 0, 5,
"s"); TProfpulse.SetXTitle(
"Sample Number");
707 TProfpulse.SetYTitle(
"Value [ADC counts]");
708 TH2D ht_LB= TH2D(
"ht_LB",
"",nlb,lbmin,lbmax,400,-200,200); ht_LB.GetXaxis()->SetTitle(
"LB");
709 ht_LB.GetYaxis()->SetTitle(
"Time(maxSample) + ofcTime [ns]");
710 TH1F hADCmax = TH1F(
"",
"",110,-200,2000); hADCmax.SetXTitle(
"ADCmax [ADC counts]"); hADCmax.SetYTitle(
"Events");
715 std::unique_ptr<LArSamples::Interface> tuple =
Interface::open(inputfile);
716 printf(
"Number of events: %u %u\n",tuple->nEvents(),tuple->nChannels());
717 unsigned int nchannels = tuple->nChannels();
719 fprintf(outputFile,
"Onlid \t MeanCellHitBased \t EnergyThresholdBased \t OR \t AND\n");
722 printf(
"Begin looping over cells...\n");
723 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
725 if(tuple->historySize(ichan)==0){ nskipped++;
continue; }
731 double eta = cellInfo->
eta();
732 double phi = cellInfo->
phi();
737 onlid = cellInfo->
onlid();
745 unsigned int ndigits = hist->nData();
746 if(ndigits<(
unsigned int)
threshold){ nskipped++;
continue; }
752 hname.Form(
"h0x%x_Energy",onlid);
753 h1_e = (TH1F*)hene.Clone(hname);
754 hname.Form(
"h0x%x_Quality",onlid);
755 h1_q = (TH1F*)hqua.Clone(hname);
756 hname.Form(
"h0x%x_LB",onlid);
757 h1_lb = (TH1F*)hlb.Clone(hname);
758 hname.Form(
"h0x%x_Energy_LB",onlid);
759 h2_elb = (TH2F*)henelb.Clone(hname);
760 hname.Form(
"h0x%x_Pulse",onlid);
761 h2_pulse = (TH2D*)hpulse.Clone(hname);
762 hname.Form(
"TProf0x%x_Pulse",onlid);
763 TProf_pulse = (TProfile*)TProfpulse.Clone(hname);
764 hname.Form(
"h0x%x_ADCmax",onlid);
765 h1_ADCmax = (TH1F*)hADCmax.Clone(hname);
766 hname.Form(
"h0x%x_t_LB",onlid);
767 h2_t_LB = (TH2D*)ht_LB.Clone(hname);
770 bool CellInList =
false;
771 int LBFlaggedIn = -1;
774 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
779 double energy =
data->energy()*
GeV;
786 if (isBadLB)
continue;
793 h1_e->Fill(
data->energy()*
GeV);
794 h1_q->Fill(
data->quality());
795 h1_lb->Fill(lumiBlock);
796 h2_elb->Fill(lumiBlock,
data->energy()*
GeV);
797 h1_ADCmax->Fill(
data->adcMax());
798 double time =
data->maxPosition()*25.0+
data->ofcTime();
799 h2_t_LB->Fill(lumiBlock,time);
800 for(
unsigned int isample=0;isample<
data->nSamples();isample++) {
801 TProf_pulse->Fill(isample,
data->value(isample));
802 h2_pulse->Fill(
data->time(isample)-time,
data->value(isample)/
data->adcMax());
807 if (
data->quality() > qthreshold){
815 if (
data->energy()*
GeV > ecut) {
817 EventEnergySum+=(
data->energy()*
GeV);
822 selectionFlag=
CheckCellSelectionCriteria(EventCount,nsigmaHits,MeanHits,rmsHits,nEvents_E_gt_ecut,EventEnergySum,nBadLBs,nlb_corr);
823 if(selectionFlag==2){
824 LBFlaggedIn = lumiBlock;
827 else if(selectionFlag==1){
829 LBFlaggedIn = lumiBlock;
833 LBFlaggedIn = lumiBlock;
837 else if(selectionFlag==0){
839 LBFlaggedIn = lumiBlock;
843 LBFlaggedIn = lumiBlock;
854 if ( CellCounter%1000 == 0 ) {
855 printf(
"Scanning Cell No. = %d\n",CellCounter);
857 selectionFlag=
CheckCellSelectionCriteria(EventCount,nsigmaHits,MeanHits,rmsHits,nEvents_E_gt_ecut,EventEnergySum,nBadLBs,nlb_corr);
860 if (selectionFlag >= 0){
861 bool ListOutput =
true;
862 int MeanCellHitsSelection = 0;
863 int EnergyThresholdSelection = 0;
864 int OR_selection = 0;
865 int AND_selection = 0;
867 if (selectionFlag == 2){
868 MeanCellHitsSelection = 1;
869 EnergyThresholdSelection = 1;
875 else if (selectionFlag == 1){
876 if (
m_Algo == 1) ListOutput =
false;
877 MeanCellHitsSelection = 1;
878 EnergyThresholdSelection = 0;
883 else if (selectionFlag == 0){
884 if (
m_Algo == 0) ListOutput =
false;
885 MeanCellHitsSelection = 0;
886 EnergyThresholdSelection = 1;
892 iMeanCellHitsSelection += MeanCellHitsSelection;
893 iEnergyThresholdSelection += EnergyThresholdSelection;
894 iOR_selection += OR_selection;
895 iAND_selection += AND_selection;
902 fprintf(outputFile,
"0x%x \t %d \t \t \t %d \t \t %d \t %d\n",onlid,MeanCellHitsSelection,EnergyThresholdSelection,OR_selection,AND_selection);
909 for (
int ilb=1;ilb<=nlb;ilb++){
910 if (h1_lb->GetBinContent(ilb) > 0.) nLB++;
913 fr_LB = (double)nLB/(
double)(nlb_corr-nBadLBs);
915 meanECell = h1_e->GetMean();
916 n_ensig = EventCount;
918 fr_q4k = (double)qcount/(
double)EventCount;
920 n_ecut = nEvents_E_gt_ecut;
925 for (
int ilb=1;ilb<=nlb;ilb++){
926 if (h1_lb->GetBinContent(ilb) > 0.) nLB++;
928 fr_LB = (double)nLB/(
double)(nlb_corr-nBadLBs);
930 meanECell = h1_e->GetMean();
931 n_ensig = EventCount;
933 fr_q4k = (double)qcount/(
double)EventCount;
935 n_ecut = nEvents_E_gt_ecut;
937 Eeta.Fill(
eta,meanECell);
938 CellEnergy.Fill(meanECell);
941 Emean_NbrEvents.Fill(n_ecut,EventEnergySum/n_ecut);
942 Emean_NbrEvents_part[
index]->Fill(n_ecut,EventEnergySum/n_ecut);
949 CellsFlagged_LB_part[
index]->Fill(LBFlaggedIn);
950 CellsFlagged_LB.Fill(LBFlaggedIn);
958 if (nEvents_E_gt_ecut>0) { EventEnergyMean = EventEnergySum/nEvents_E_gt_ecut; }
959 fprintf(pFile,
"0x%x \t %7s \t %d \t %d \t %d \t %d \t %d \t %f \t %4.0f \t %4.3f \t %d \t %d\n",onlid,
m_LarIdTranslator->GetPartitonLayerName(
index),cellInfo->
feedThrough(),cellInfo->
slot(),cellInfo->
channel(),EventCount,nEvents_E_gt_ecut,EventEnergyMean,nbrLB,fr_q4k,LBFlaggedIn,selectionFlag);
968 nEvents_E_gt_ecut = 0.;
970 EventEnergyMean = 0.;
972 printf(
"Cells selected: MeanCellHitsCut \t EnergyThreshodCut \t Either List \t Both Lists\n");
973 printf(
"\t \t %d \t \t \t \t %d \t \t %d \t %d\n",iMeanCellHitsSelection,iEnergyThresholdSelection,iOR_selection,iAND_selection);
980 printf(
"Skipped %d cells. Cells scanned = %d\n",nskipped,nbad);
981 printf(
"Cells put in Bad Cell List = %d\n",nBadCells);
982 if (noEvdata>0) printf(
"No Evdata pointer: %d\n",noEvdata);
986 for(
int i=0;i<npl;i++){
987 if(Cellmaps[i]->
GetEntries()>0) Cellmaps[i]->Write();
988 if(E_LBmaps[i]->
GetEntries()>0) E_LBmaps[i]->Write();
989 if(t_LBmaps[i]->
GetEntries()>0) t_LBmaps[i]->Write();
990 if(Pulsemaps[i]->
GetEntries()>0) Pulsemaps[i]->Write();
991 if(CellsFlagged_LB_part[i]->
GetEntries()>0) CellsFlagged_LB_part[i]->Write();
992 if( Emean_NbrEvents_part[i]->
GetEntries()>0) Emean_NbrEvents_part[i]->Write();
994 CellsFlagged_LB.Write();
998 Emean_NbrEvents.Write();
1067std::vector<int, std::allocator<int> >
LArCellsEmptyMonitoring::GetBadLBList(
const char* inputfile,
int lbmin,
int lbmax,
double nsigma,
int nlb,
const std::vector<
int, std::allocator<int> >& DQLBList){
1068 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventCells_tot;
1069 std::map< std::pair<unsigned int, unsigned int>,
double > eventEnergy_tot;
1070 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventLumiBlock;
1071 std::map< std::pair<std::string, unsigned int>,
unsigned int > eventCells;
1073 double NSIG = nsigma;
1076 std::unique_ptr<LArSamples::Interface> tuple =
Interface::open(inputfile);
1077 unsigned int nchannels = tuple->nChannels();
1080 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
1082 if(tuple->historySize(ichan)==0){
continue; }
1088 int calo = cellInfo->
calo();
1097 unsigned int ndigits = hist->nData();
1098 if(ndigits==0){
continue; }
1101 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
1108 lb = (int)lumiBlock;
1109 double energyGeV =
data->energy()/1000.;
1112 if (lumiBlock <= lbmax && lumiBlock >= lbmin ) {
1113 if (
data->energy() > sqrt((NSIG*
data->noise())*(NSIG*
data->noise())) &&
data->energy() != 0. &&
data->noise() != 0.){
1115 std::pair<unsigned int, unsigned int>
ev(
data->run(),
data->event());
1116 std::pair<std::string, unsigned int> ev_cryo(
GetCryostat(calo),
data->event());
1117 eventCells_tot[
ev]++;
1118 eventEnergy_tot[
ev] += energyGeV;
1119 eventLumiBlock[
ev] =
lb;
1120 eventCells[ev_cryo]++;
1128 auto hCells_Ev_LB = std::make_unique<TProfile>(
"",
"",nlb,lbmin,lbmax,-100,100000);
1129 std::map< std::string, TProfilep> hCellsEvLB;
1130 std::map< std::string, TH1Fp> hp_cryo;
1135 std::string Cryo[8] = {
"EMBA",
"EMBC",
"EMECA",
"EMECC",
"HECA",
"HECC",
"FCALA",
"FCALC"};
1136 for(
int k = 0; k< nCryo; k++){
1137 hCellsEvLB[Cryo[k]].reset((TProfile*)hCells_Ev_LB->Clone());
1139 for(
unsigned int ievent = 0; ievent < tuple->nEvents(); ievent++) {
1141 std::pair<unsigned int, unsigned int> id(evtData->
run(), evtData->
event());
1142 if(eventCells_tot[
id]==0)
continue;
1144 for(
int j=0; j<nCryo ;j++){
1145 std::pair<std::string, unsigned int> id_cryo(Cryo[j], evtData->
event());
1146 hCellsEvLB[Cryo[j]]->Fill(eventLumiBlock[
id], eventCells[id_cryo]);
1149 hCells_Ev_LB->Fill(eventLumiBlock[
id], eventCells_tot[
id]);
1152 auto hp = std::make_unique<TH1F>(
"",
"",(hCells_Ev_LB->GetBinContent(hCells_Ev_LB->GetMaximumBin())),0,hCells_Ev_LB->GetBinContent(hCells_Ev_LB->GetMaximumBin()));
1153 for(
int k = 0; k< nCryo; k++){
1154 auto hp_temp = std::make_unique< TH1F>(
"",
"",(hCellsEvLB[Cryo[k]]->GetBinContent(hCellsEvLB[Cryo[k]]->GetMaximumBin())*10),0,hCellsEvLB[Cryo[k]]->GetBinContent(hCellsEvLB[Cryo[k]]->GetMaximumBin()));
1155 std::string name1 =
"hp_" + Cryo[k];
1156 hp_cryo[Cryo[k]].reset((TH1F*)hp_temp->Clone(name1.c_str()));
1159 for (
int p=1;p<=nlb;p++){
1160 for(
int j=0; j<nCryo; j++){
1161 double bincont = hCellsEvLB[Cryo[j]]->GetBinContent(p);
1162 hp_cryo[Cryo[j]]->Fill(bincont);
1164 double bincont1 = hCells_Ev_LB->GetBinContent(p);
1168 std::map< std::string, double> Mean;
1169 std::map< std::string, double> RMS;
1170 std::map< int, vector<std::string> > BadLB_cryo;
1172 for(
int k=0; k<nCryo; k++)
1174 Mean[Cryo[k]] = hp_cryo[Cryo[k]]->GetMean();
1175 RMS[Cryo[k]] = hp_cryo[Cryo[k]]->GetRMS();
1178 double MEAN2 = hp->GetMean();
1179 double RMS2 = hp->GetRMS();
1184 vector<int> BadLB_tot=DQLBList;
1186 double value1 = (MEAN2+(RMS2*3.));
1187 int numberFlagged=0;
1188 for (
int l=1;l<=nlb;l++){
1189 for(
int j=0; j<nCryo; j++){
1190 double value = MEAN2 + (RMS[Cryo[j]]*3);
1191 if(hCellsEvLB[Cryo[j]]->GetBinContent(l) > value){
1192 int badLB = hCellsEvLB[Cryo[j]]->GetBinLowEdge(l);
1193 BadLB_cryo[badLB].push_back(Cryo[j]);
1195 for(
unsigned int p=0; p< BadLB_tot.size(); p++) {
1196 if(badLB == BadLB_tot[p]) isadd =
false;
1199 BadLB_tot.push_back(badLB);
1201 printf(
"Removing bad LB %d in %s\n",badLB,Cryo[j].c_str());
1206 if (hCells_Ev_LB->GetBinContent(l) > value1){
1207 BadLB.push_back(hCells_Ev_LB->GetBinLowEdge(l));
1211 printf(
"Number of Bad LBs found: %d\n",numberFlagged);
1212 printf(
"Number of LBs to be removed: %zu", BadLB_tot.size());
1567 printf(
"LArCellsEmptyMonitoring::DoEtaPhiMonitoring: Reading options: %s %s.\n",optionplot,optionsave);
1569 bool knormplot =
false;
1570 if(strstr(optionplot,
"Precentage")) knormplot =
true;
1573 double nsigmacut = 0.;
1574 double qualitycut = 0.;
1575 if(strstr(optionplot,
"Sigma")){
1577 if(strstr(optionplot,
"4Sigma")) nsigmacut = 4.;
1578 if(strstr(optionplot,
"5Sigma")) nsigmacut = 5.;
1579 }
else if(strstr(optionplot,
"Quality")){
1587 ULong64_t onlid = 0;
1590 std::unique_ptr<LArSamples::Interface> tuple(
Interface::open(inputfile));
1591 printf(
"Number of events: %u %u\n",tuple->nEvents(),tuple->nChannels());
1592 unsigned int nchannels = tuple->nChannels();
1596 std::vector<TH2*> hmap_counts_all (nhists);
1597 std::vector<TH2*> hmap_energy_cut (nhists);
1598 std::vector<TH2*> hmap_quality_cut (nhists);
1599 for(
int j=0;j<nhists;j++){
1602 hmap_counts_all[j]->SetName(hname);
1606 hmap_energy_cut[j]->SetName(hname);
1609 sprintf(hname,
"quality_cut_%s_%d",
m_LarIdTranslator->GetPartitonLayerName(j),j);
1610 hmap_quality_cut[j]->SetName(hname);
1614 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
1616 if(tuple->historySize(ichan)==0){ nskipped++;
continue; }
1621 unsigned int ndigits = hist->nData();
1622 if(ndigits==0){ nskipped++;
continue; }
1627 std::cout<<
"GetPartitionLayerIndex returned -1 in LArCellsEmptyMonitoring::DoEtaPhiMonitoring"<<std::endl;
1630 onlid = cellInfo->
onlid();
1631 if(onlid<=0) printf(
"%u: Bad Cell Onlid = 0x%x (%+.2f,%+.2f)\n",ichan,(
unsigned int)onlid,cellInfo->
eta(),cellInfo->
phi());
1634 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
1641 if(kcuttype==1 &&
data->noise()>0.){
1651 printf(
"Skipped %d cells. Bad Cells = %d\n",nskipped,nbad);
1655 for(
int j=0;j<nhists;j++){
1656 hmap_energy_cut[j]->Divide(hmap_counts_all[j]);
1657 hmap_quality_cut[j]->Divide(hmap_counts_all[j]);
1661 std::unique_ptr<TFile> tout;
1662 TCanvas* c0 =
nullptr, *c1 =
nullptr;
1664 if(!strcmp(optionsave,
"root")){
1665 tout.reset(
new TFile(
"EtaPhiMonitoring.root",
"recreate"));
1666 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_counts_all.data(),
"Counts",1);
1667 c0->SetName(
"Normalization");
1669 for(
int j=0;j<nhists;j++) hmap_counts_all[j]->Write();
1671 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_energy_cut.data(),
"EnergyCut",1);
1672 c0->SetName(
"EnergyCut");
1674 for(
int j=0;j<nhists;j++) hmap_energy_cut[j]->Write();
1677 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_quality_cut.data(),
"QualityCut",1);
1678 c0->SetName(
"QualityCut");
1680 for(
int j=0;j<nhists;j++) hmap_quality_cut[j]->Write();
1684 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_counts_all.data(),
"Counts",1);
1685 c0->SaveAs(
"Normalization.png");
1686 c1 =
new TCanvas(
"c1",
"");
1687 for(
int j=0;j<nhists;j++){ hmap_counts_all[j]->Draw(
"colz"); sprintf(hname,
"%s.png",hmap_counts_all[j]->GetName()); c1->SaveAs(hname); }
1689 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_energy_cut.data(),
"EnergyCut",1);
1690 c0->SaveAs(
"EnergyCut.png");
1692 for(
int j=0;j<nhists;j++){ hmap_energy_cut[j]->Draw(
"colz"); sprintf(hname,
"%s.png",hmap_energy_cut[j]->GetName()); c1->SaveAs(hname); }
1695 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_quality_cut.data(),
"QualityCut",1);
1696 c0->SaveAs(
"QualityCut.png");
1698 for(
int j=0;j<nhists;j++){ hmap_quality_cut[j]->Draw(
"colz"); sprintf(hname,
"%s.png",hmap_quality_cut[j]->GetName()); c1->SaveAs(hname); }
1718 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventCells;
1719 std::map< std::pair<unsigned int, unsigned int>,
double > eventEnergy_PS;
1720 std::map< std::pair<unsigned int, unsigned int>,
double > eventEnergy_LAr;
1721 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventCells_PS;
1722 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventLayer;
1725 std::unique_ptr<LArSamples::Interface> tuple(
Interface::open(inputfile));
1726 unsigned int nchannels = tuple->nChannels();
1729 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
1731 if(tuple->historySize(ichan)==0){
continue; }
1736 unsigned int layer = cellInfo->
layer();
1738 unsigned int ndigits = hist->nData();
1739 if(ndigits==0){
continue; }
1742 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
1747 double energyGeV =
data->energy()/1000.;
1750 std::pair<unsigned int, unsigned int>
ev(
data->run(),
data->event());
1752 eventEnergy_LAr[
ev] += energyGeV;
1753 eventLayer[
ev] = layer;
1755 eventEnergy_PS[
ev] += energyGeV;
1756 eventCells_PS[
ev]++;
1764 constexpr int nbins = 42;
1765 double binE[nbins+1]{};
1768 double de = 0.,ene = 0.;
1771 stop = (int)(20./de);
1772 for(i=0;i<stop;i++,j++){
1778 stop = (int)((100.-20.)/de);
1779 for(i=0;i<stop;i++,j++){
1785 stop = (int)((500.-100.)/de);
1786 for(i=0;i<stop;i++,j++){
1794 TH1F E_LAr_pass(
"E_LAr_pass",
"",nbins,binE);
1795 TH1F E_LAr_tot(
"E_LAr_tot",
"",nbins,binE);
1796 TH1F E_LAr_EM5_pass(
"E_LAr_EM5_pass",
"",nbins,binE);
1797 TH1F E_LAr_EM5_tot(
"E_LAr_EM5_tot",
"",nbins,binE);
1798 TH1F E_LAr_TAU8_pass(
"E_LAr_TAU8_pass",
"",nbins,binE);
1799 TH1F E_LAr_TAU8_tot(
"E_LAr_TAU8_tot",
"",nbins,binE);
1800 TH1F E_LAr_J10_pass(
"E_LAr_J10_pass",
"",nbins,binE);
1801 TH1F E_LAr_J10_tot(
"E_LAr_J10_tot",
"",nbins,binE);
1802 TH1F nCellsPS_pass(
"nCellsPS_pass",
"",100, 0, 100);
1803 TH1F nCellsPS_tot(
"nCellsPS_tot",
"",100, 0, 100);
1804 TH1F nCellsPS_EM5_pass(
"nCellsPS_EM5_pass",
"",100, 0, 100);
1805 TH1F nCellsPS_EM5_tot(
"nCellsPS_EM5_tot",
"",100, 0, 100);
1806 TH1F nCellsPS_TAU8_pass(
"nCellsPS_TAU8_pass",
"",100, 0, 100);
1807 TH1F nCellsPS_TAU8_tot(
"nCellsPS_TAU8_tot",
"",100, 0, 100);
1808 TH1F nCellsPS_J10_tot(
"nCellsPS_J10_tot",
"",100, 0, 100);
1809 TH1F nCellsPS_J10_pass(
"nCellsPS_J10_pass",
"",100, 0, 100);
1814 for(
unsigned int ievent = 0; ievent < tuple->nEvents(); ievent++) {
1816 std::pair<unsigned int, unsigned int> id(evtData->
run(), evtData->
event());
1817 if(eventCells[
id]==0)
continue;
1818 if(eventEnergy_LAr[
id]<=0)
continue;
1819 bool isEM5 = evtData->
isPassed(
"L1_EM5_EMPTY");
1820 bool isTAU8 = evtData->
isPassed(
"L1_TAU8_EMPTY");
1821 bool isJ10 = evtData->
isPassed(
"L1_J10_EMPTY");
1823 E_LAr_tot.Fill(eventEnergy_LAr[
id]);
1824 nCellsPS_tot.Fill(eventCells_PS[
id]);
1826 E_LAr_EM5_tot.Fill(eventEnergy_LAr[
id]);
1827 nCellsPS_EM5_tot.Fill(eventCells_PS[
id]);
1830 E_LAr_TAU8_tot.Fill(eventEnergy_LAr[
id]);
1831 nCellsPS_TAU8_tot.Fill(eventCells_PS[
id]);
1834 E_LAr_J10_tot.Fill(eventEnergy_LAr[
id]);
1835 nCellsPS_J10_tot.Fill(eventCells_PS[
id]);
1839 if((eventEnergy_LAr[
id])!=0)
1840 ratio = eventEnergy_PS[id]/(eventEnergy_LAr[id]);
1841 bool isL2_PreS =
false;
1842 if(ratio > fractionInPS) isL2_PreS =
true;
1845 E_LAr_pass.Fill(eventEnergy_LAr[
id]);
1846 nCellsPS_pass.Fill(eventCells_PS[
id]);
1848 E_LAr_EM5_pass.Fill(eventEnergy_LAr[
id]);
1849 nCellsPS_EM5_pass.Fill(eventCells_PS[
id]);
1852 E_LAr_TAU8_pass.Fill(eventEnergy_LAr[
id]);
1853 nCellsPS_TAU8_pass.Fill(eventCells_PS[
id]);
1856 E_LAr_J10_pass.Fill(eventEnergy_LAr[
id]);
1857 nCellsPS_J10_pass.Fill(eventCells_PS[
id]);
1863 sprintf(fname,
"TriggerEfficiency_%d.root",
run);
1864 auto mfile = std::make_unique<TFile>(fname,
"recreate");
1867 E_LAr_EM5_pass.Write();
1868 E_LAr_EM5_tot.Write();
1869 E_LAr_TAU8_pass.Write();
1870 E_LAr_TAU8_tot.Write();
1871 E_LAr_J10_pass.Write();
1872 E_LAr_J10_tot.Write();
1873 nCellsPS_pass.Write();
1874 nCellsPS_tot.Write();
1875 nCellsPS_EM5_pass.Write();
1876 nCellsPS_EM5_tot.Write();
1877 nCellsPS_TAU8_pass.Write();
1878 nCellsPS_TAU8_tot.Write();
1879 nCellsPS_J10_pass.Write();
1880 nCellsPS_J10_tot.Write();