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");
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;
291 if(!Evdata){ noEvdata++;
continue; }
293 double energy =
data->energy()*
GeV;
295 if (energy > nsigmaHits*noise){
300 h1_q->Fill(
data->quality());
301 h1_lb->Fill(lumiBlock);
302 h1_elb->Fill(lumiBlock, energy);
303 h2_elb->Fill(lumiBlock, energy);
304 h1_qlb->Fill(lumiBlock,
data->quality());
308 if (
data->quality() > qthreshold){
319 hNoise[cellInfo->
layer()]->Fill(noise);
322 if ( CellCounter%1000 == 0 ) {
323 printf(
"Scanning Cell No. = %d\n",CellCounter);
325 MeanEventEnergy_max = -999;
326 MeanEventEnergy_min = 999;
332 for (
int ilb=1;ilb<=nlb;ilb++){
333 if (h1_lb->GetBinContent(ilb) > 0.){
334 double EtotInLB = h1_elb->GetBinContent(ilb);
335 double NEventsInLB = h1_lb->GetBinContent(ilb);
337 int LB_number = h1_lb->GetBinLowEdge(ilb);
339 double MeanEventEnergy = EtotInLB / NEventsInLB;
342 if (cellInfo->
layer()==0){
343 if (EtotInLB>Ecum_cut_PS){
344 hNEvVsEMean[cellInfo->
layer()]->Fill(NEventsInLB,MeanEventEnergy);
345 hNEvVsECum[cellInfo->
layer()]->Fill(NEventsInLB,EtotInLB);
346 hECumVsEMean[cellInfo->
layer()]->Fill(EtotInLB,MeanEventEnergy);
347 hCellsPerLB[cellInfo->
layer()]->Fill(LB_number);
350 else if (EtotInLB>Ecum_cut_calo){
351 hNEvVsEMean[cellInfo->
layer()]->Fill(NEventsInLB,MeanEventEnergy);
352 hNEvVsECum[cellInfo->
layer()]->Fill(NEventsInLB,EtotInLB);
353 hECumVsEMean[cellInfo->
layer()]->Fill(EtotInLB,MeanEventEnergy);
354 hCellsPerLB[cellInfo->
layer()]->Fill(LB_number);
357 if (EtotInLB>Ecum_cut_PS && cellInfo->
layer()==0){
358 FlagCell=
true; FlagCount++;
359 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
360 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
362 else if (EtotInLB>Ecum_cut_calo && cellInfo->
layer()==1){
363 FlagCell=
true; FlagCount++;
364 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
365 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
367 else if (EtotInLB>Ecum_cut_calo && cellInfo->
layer()==2){
368 FlagCell=
true; FlagCount++;
369 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
370 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
372 else if (EtotInLB>Ecum_cut_calo && cellInfo->
layer()==3){
373 FlagCell=
true; FlagCount++;
374 if (MeanEventEnergy_max<MeanEventEnergy){ MeanEventEnergy_max = MeanEventEnergy; }
375 if (MeanEventEnergy_min>MeanEventEnergy){ MeanEventEnergy_min = MeanEventEnergy; }
380 fr_q4k = (double)qcount/(
double)EventCount;
387 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);
397 printf(
"Skipped %d cells. Cells scanned = %d\n",nskipped,nbad);
398 printf(
"Cells put in Bad Cell List = %d\n",nBadCells);
399 if (noEvdata>0) printf(
"No Evdata pointer: %d\n",noEvdata);
404 for(
int i=0;i<npl;i++){
405 hNEvVsEMean[i]->Write();
406 hNEvVsECum[i]->Write();
407 hECumVsEMean[i]->Write();
409 hCellsPerLB[i]->Write();
425 TString htitle,hname,textfilename,rootfilename;
437 printf(
"WARNING: Received instruction to select recurring bad cells only in SetSelectRecurringBadCells(bool flag)\n");
438 printf(
"-------> Only one algorithm selected for cell selection criteria in SetAlgo(int algoindex)\n");
439 printf(
"-------> Recurring cell selection overides algorithm specification\n");
444 printf(
"ERROR: Partition not specified in SetPartition(bool set_part, std::string partname)\n");
451 int selectionFlag = -1;
452 const double GeV = 1/1000.;
462 unsigned int onlid = 0;
474 int nEvents_E_gt_ecut=0;
475 double EventEnergySum=0.;
476 double EventEnergyMean=0.;
479 double MeanHits=0, rmsHits=0;
480 int iMeanCellHitsSelection=0,iEnergyThresholdSelection=0,iOR_selection=0,iAND_selection=0;
486 vector<int, std::allocator<int> > DQLBList;
487 vector<int, std::allocator<int> > BadLBList;
489 printf(
"Reading in DQ Defect LB List...\n");
494 printf(
"Getting bad LB list...\n");
495 BadLBList=
GetBadLBList(inputfile,lbmin,lbmax,nsigma,nlb,DQLBList);
496 printf(
"...Done.\n");
497 nBadLBs = BadLBList.size();
500 BadLBList = std::move(DQLBList);
501 nBadLBs = BadLBList.size();
505 printf(
"Getting histogram limits... ");
506 GetLimits_EqLB(inputfile,lbmin,lbmax,emin,emax,qmin,qmax,runNumber,BadLBList);
516 printf(
"Done.\n LBmin: %d LBmax: %d Emin: %d Emax: %d Qmin: %d Qmax: %d\n",lbmin,lbmax,emin,emax,qmin,qmax);
519 FILE * outputFile=
nullptr;
521 textfilename.Form(
"Output/BadCellSelection_run%d.txt",runNumber);
522 outputFile = fopen (textfilename ,
"w");
524 std::cout<<(
"Cannot open output selection summary file " + textfilename)<<
"\n";
528 outputFile = fopen (textfilename ,
"w");
530 std::cout<<(
"Cannot open output selection summary file " + textfilename)<<
"\n";
536 FILE * pFile=
nullptr;
539 textfilename.Form(
"Output/BadCellList_run%d.txt",runNumber);
540 pFile = fopen (textfilename ,
"w");
542 printf(
"Cannot open output text file\n");
547 pFile = fopen (textfilename ,
"w");
549 printf(
"Cannot open output text file\n");
558printf(
"Determining mean cell hits...\n ");
559 GetMeanCellHits(inputfile, nlb, lbmin, lbmax, nsigmaHits, BadLBList, MeanHits, rmsHits, nlb_corr);
561printf(
"Set threshold at %4.3f counts per cell for LB range. \n",(MeanHits+(nsigmaHits*rmsHits))*((
double)nlb_corr-(
double)nBadLBs));
565 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);
568 int EventCount=0., qcount=0.;
575 rootfilename.Form(
"Output/BadCells_run%d.root",runNumber);
578 auto fout = std::make_unique<TFile>(rootfilename,
"RECREATE");
586 Float_t meanECell = 0;
588 TH1F* h1_lb =
nullptr;
589 TH1F* h1_e =
nullptr;
590 TH1F* h1_q =
nullptr;
591 TH2F* h2_elb =
nullptr;
592 TH2D* h2_pulse =
nullptr;
593 TH2D* h2_t_LB =
nullptr;
594 TProfile* TProf_pulse =
nullptr;
595 TH1F* h1_ADCmax =
nullptr;
596 std::unique_ptr<TTree> tree_cells;
598 tree_cells.reset(
new TTree(
"BadTree",
"LAr Tree ordered by OnlID"));
599 tree_cells->Branch(
"Energy",&h1_e);
600 tree_cells->Branch(
"Quality",&h1_q);
601 tree_cells->Branch(
"LB",&h1_lb);
602 tree_cells->Branch(
"larid",&larid);
603 tree_cells->Branch(
"onlid",&onlid);
604 tree_cells->Branch(
"Run",&t_run);
605 tree_cells->Branch(
"selectionFlag",&selectionFlag);
606 tree_cells->Branch(
"nhits_ensig",&n_ensig);
607 tree_cells->Branch(
"nhits_e1GeV",&n_ecut);
608 tree_cells->Branch(
"Quality_4k",&fr_q4k);
609 tree_cells->Branch(
"LBfraction",&fr_LB);
610 tree_cells->Branch(
"EnergyVsLB",&h2_elb);
611 tree_cells->Branch(
"PulseShape",&h2_pulse);
612 tree_cells->Branch(
"PulsePeakTimeVsLB",&h2_t_LB);
613 tree_cells->Branch(
"noise",&noise);
614 tree_cells->Branch(
"MeanCellEnergy",&meanECell);
615 tree_cells->Branch(
"PulseShapeTProf",&TProf_pulse);
616 tree_cells->Branch(
"ADCmax",&h1_ADCmax);
621 TH2D NormPulse(
"Normalised_pulse",
"",100,-200,200,400,-10,10);
622 NormPulse.SetXTitle(
"Time [ns]");
623 NormPulse.SetYTitle(
"Value [ADC counts] / ADCmax");
633 TH2F E_LB(
"E_LB",
"",nlb,lbmin,lbmax,ne,emin,emax);
634 E_LB.SetXTitle(
"LB");
635 E_LB.SetYTitle(
"Energy [GeV]");
637 TH2D t_LB(
"t_LB",
"",nlb,lbmin,lbmax,400,-200,200);
638 t_LB.GetXaxis()->SetTitle(
"LB");
639 t_LB.GetYaxis()->SetTitle(
"Time(maxSample) + ofcTime [ns]");
641 TH1F CF_LB(
"CF_LB",
"",nlb,lbmin,lbmax);
642 CF_LB.GetXaxis()->SetTitle(
"LB");
643 CF_LB.GetYaxis()->SetTitle(
"Number of cells flagged");
645 TH1F ME_EV(
"ME_EV",
"",1000,0,1000);
646 ME_EV.GetXaxis()->SetTitle(
"Nbr events >1 GeV");
647 ME_EV.GetYaxis()->SetTitle(
"Mean Energy [GeV]");
652 for (
int ii=0;ii<npl;ii++){
654 Cellmaps[ii]->GetXaxis()->SetTitle(
"#eta"); Cellmaps[ii]->GetYaxis()->SetTitle(
"#Phi");
655 hname.Form(
"%s_PulseShape_%dsigma",
m_LarIdTranslator->GetPartitonLayerName(ii),(
int)nsigmaHits);
656 Pulsemaps[ii].reset((TH2D*)NormPulse.Clone(hname));
658 E_LBmaps[ii].reset((TH2F*)E_LB.Clone(hname));
660 t_LBmaps[ii].reset((TH2D*)t_LB.Clone(hname));
662 CellsFlagged_LB_part[ii].reset((TH1F*)CF_LB.Clone(hname));
665 Emean_NbrEvents_part[ii].reset((TH1F*)ME_EV.Clone(hname));
670 Eeta.GetXaxis()->SetTitle(
"#eta");
671 Eeta.GetYaxis()->SetTitle(
"Energy [GeV]");
673 TH1F CellEnergy(
"CellEnergy",
"",ne,emin,emax);
674 CellEnergy.GetXaxis()->SetTitle(
"Cell Mean Energy [GeV]");
675 CellEnergy.GetYaxis()->SetTitle(
"Cells");
677 TH1F LBfrac(
"LBfrac",
"",100,0.,1.);
678 LBfrac.GetXaxis()->SetTitle(
"LB fraction");
679 LBfrac.GetYaxis()->SetTitle(
"Cells");
681 TH1F Qfrac(
"Qfrac",
"",100.,0.,1.);
682 Qfrac.GetXaxis()->SetTitle(
"Fraction of Events Q>4000");
683 Qfrac.GetYaxis()->SetTitle(
"Cells");
685 TH1F CellsFlagged_LB(
"CellsFlagged_LB",
"",nlb,lbmin,lbmax);
686 CellsFlagged_LB.GetXaxis()->SetTitle(
"LB");
687 CellsFlagged_LB.GetYaxis()->SetTitle(
"Number of cells flagged");
689 TH1F Emean_NbrEvents(
"Emean_NEvents_1GeV",
"",1000,0,1000);
690 Emean_NbrEvents.GetXaxis()->SetTitle(
"N events > 1 GeV");
691 Emean_NbrEvents.GetYaxis()->SetTitle(
"Mean Energy [GeV]");
696 printf(
"Creating histograms (nEbins = %d, nQbins = %d, nLBbins = %d)... ",ne,nq,nlb);
697 TH1F hene = TH1F(
"hEne",
"",ne,emin,emax); hene.SetXTitle(
"Energy [GeV]");
698 hene.SetYTitle(
"Events");
699 TH1F hqua = TH1F(
"hQua",
"",nq/100.,qmin,qmax); hqua.SetXTitle(
"Quality");
700 hqua.SetYTitle(
"Events");
701 TH1F hlb = TH1F(
"hLB",
"",nlb,lbmin,lbmax); hlb.SetXTitle(
"LB");
702 hlb.SetYTitle(
"Events");
703 TH2F henelb = TH2F(
"hEnelb",
"",nlb,lbmin,lbmax,ne,emin,emax); henelb.SetXTitle(
"LB");
704 henelb.SetYTitle(
"Energy [GeV]");
705 TH2D hpulse = TH2D(
"hPulse",
"",100,-200,200,400, -10,10); hpulse.SetXTitle(
"Time [ns]");
706 hpulse.SetYTitle(
"Value [ADC counts] / ADCmax");
707 TProfile TProfpulse = TProfile(
"",
"",5, 0, 5,
"s"); TProfpulse.SetXTitle(
"Sample Number");
708 TProfpulse.SetYTitle(
"Value [ADC counts]");
709 TH2D ht_LB= TH2D(
"ht_LB",
"",nlb,lbmin,lbmax,400,-200,200); ht_LB.GetXaxis()->SetTitle(
"LB");
710 ht_LB.GetYaxis()->SetTitle(
"Time(maxSample) + ofcTime [ns]");
711 TH1F hADCmax = TH1F(
"",
"",110,-200,2000); hADCmax.SetXTitle(
"ADCmax [ADC counts]"); hADCmax.SetYTitle(
"Events");
718 unsigned int nchannels = tuple->
nChannels();
720 fprintf(outputFile,
"Onlid \t MeanCellHitBased \t EnergyThresholdBased \t OR \t AND\n");
723 printf(
"Begin looping over cells...\n");
724 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
726 if(tuple->
historySize(ichan)==0){ nskipped++;
continue; }
732 double eta = cellInfo->
eta();
733 double phi = cellInfo->
phi();
738 onlid = cellInfo->
onlid();
746 unsigned int ndigits = hist->nData();
747 if(ndigits<(
unsigned int)
threshold){ nskipped++;
continue; }
753 hname.Form(
"h0x%x_Energy",onlid);
754 h1_e = (TH1F*)hene.Clone(hname);
755 hname.Form(
"h0x%x_Quality",onlid);
756 h1_q = (TH1F*)hqua.Clone(hname);
757 hname.Form(
"h0x%x_LB",onlid);
758 h1_lb = (TH1F*)hlb.Clone(hname);
759 hname.Form(
"h0x%x_Energy_LB",onlid);
760 h2_elb = (TH2F*)henelb.Clone(hname);
761 hname.Form(
"h0x%x_Pulse",onlid);
762 h2_pulse = (TH2D*)hpulse.Clone(hname);
763 hname.Form(
"TProf0x%x_Pulse",onlid);
764 TProf_pulse = (TProfile*)TProfpulse.Clone(hname);
765 hname.Form(
"h0x%x_ADCmax",onlid);
766 h1_ADCmax = (TH1F*)hADCmax.Clone(hname);
767 hname.Form(
"h0x%x_t_LB",onlid);
768 h2_t_LB = (TH2D*)ht_LB.Clone(hname);
771 bool CellInList =
false;
772 int LBFlaggedIn = -1;
775 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
779 if(!Evdata){ noEvdata++;
continue; }
781 double energy =
data->energy()*
GeV;
788 if (isBadLB)
continue;
795 h1_e->Fill(
data->energy()*
GeV);
796 h1_q->Fill(
data->quality());
797 h1_lb->Fill(lumiBlock);
798 h2_elb->Fill(lumiBlock,
data->energy()*
GeV);
799 h1_ADCmax->Fill(
data->adcMax());
800 double time =
data->maxPosition()*25.0+
data->ofcTime();
801 h2_t_LB->Fill(lumiBlock,time);
802 for(
unsigned int isample=0;isample<
data->nSamples();isample++) {
803 TProf_pulse->Fill(isample,
data->value(isample));
804 h2_pulse->Fill(
data->time(isample)-time,
data->value(isample)/
data->adcMax());
809 if (
data->quality() > qthreshold){
817 if (
data->energy()*
GeV > ecut) {
819 EventEnergySum+=(
data->energy()*
GeV);
824 selectionFlag=
CheckCellSelectionCriteria(EventCount,nsigmaHits,MeanHits,rmsHits,nEvents_E_gt_ecut,EventEnergySum,nBadLBs,nlb_corr);
825 if(selectionFlag==2){
826 LBFlaggedIn = lumiBlock;
829 else if(selectionFlag==1){
831 LBFlaggedIn = lumiBlock;
835 LBFlaggedIn = lumiBlock;
839 else if(selectionFlag==0){
841 LBFlaggedIn = lumiBlock;
845 LBFlaggedIn = lumiBlock;
856 if ( CellCounter%1000 == 0 ) {
857 printf(
"Scanning Cell No. = %d\n",CellCounter);
859 selectionFlag=
CheckCellSelectionCriteria(EventCount,nsigmaHits,MeanHits,rmsHits,nEvents_E_gt_ecut,EventEnergySum,nBadLBs,nlb_corr);
862 if (selectionFlag >= 0){
863 bool ListOutput =
true;
864 int MeanCellHitsSelection = 0;
865 int EnergyThresholdSelection = 0;
866 int OR_selection = 0;
867 int AND_selection = 0;
869 if (selectionFlag == 2){
870 MeanCellHitsSelection = 1;
871 EnergyThresholdSelection = 1;
877 else if (selectionFlag == 1){
878 if (
m_Algo == 1) ListOutput =
false;
879 MeanCellHitsSelection = 1;
880 EnergyThresholdSelection = 0;
885 else if (selectionFlag == 0){
886 if (
m_Algo == 0) ListOutput =
false;
887 MeanCellHitsSelection = 0;
888 EnergyThresholdSelection = 1;
894 iMeanCellHitsSelection += MeanCellHitsSelection;
895 iEnergyThresholdSelection += EnergyThresholdSelection;
896 iOR_selection += OR_selection;
897 iAND_selection += AND_selection;
904 fprintf(outputFile,
"0x%x \t %d \t \t \t %d \t \t %d \t %d\n",onlid,MeanCellHitsSelection,EnergyThresholdSelection,OR_selection,AND_selection);
911 for (
int ilb=1;ilb<=nlb;ilb++){
912 if (h1_lb->GetBinContent(ilb) > 0.) nLB++;
915 fr_LB = (double)nLB/(
double)(nlb_corr-nBadLBs);
917 meanECell = h1_e->GetMean();
918 n_ensig = EventCount;
920 fr_q4k = (double)qcount/(
double)EventCount;
922 n_ecut = nEvents_E_gt_ecut;
927 for (
int ilb=1;ilb<=nlb;ilb++){
928 if (h1_lb->GetBinContent(ilb) > 0.) nLB++;
930 fr_LB = (double)nLB/(
double)(nlb_corr-nBadLBs);
932 meanECell = h1_e->GetMean();
933 n_ensig = EventCount;
935 fr_q4k = (double)qcount/(
double)EventCount;
937 n_ecut = nEvents_E_gt_ecut;
939 Eeta.Fill(
eta,meanECell);
940 CellEnergy.Fill(meanECell);
943 Emean_NbrEvents.Fill(n_ecut,EventEnergySum/n_ecut);
944 Emean_NbrEvents_part[
index]->Fill(n_ecut,EventEnergySum/n_ecut);
951 CellsFlagged_LB_part[
index]->Fill(LBFlaggedIn);
952 CellsFlagged_LB.Fill(LBFlaggedIn);
960 if (nEvents_E_gt_ecut>0) { EventEnergyMean = EventEnergySum/nEvents_E_gt_ecut; }
961 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);
970 nEvents_E_gt_ecut = 0.;
972 EventEnergyMean = 0.;
974 printf(
"Cells selected: MeanCellHitsCut \t EnergyThreshodCut \t Either List \t Both Lists\n");
975 printf(
"\t \t %d \t \t \t \t %d \t \t %d \t %d\n",iMeanCellHitsSelection,iEnergyThresholdSelection,iOR_selection,iAND_selection);
982 printf(
"Skipped %d cells. Cells scanned = %d\n",nskipped,nbad);
983 printf(
"Cells put in Bad Cell List = %d\n",nBadCells);
984 if (noEvdata>0) printf(
"No Evdata pointer: %d\n",noEvdata);
988 for(
int i=0;i<npl;i++){
989 if(Cellmaps[i]->
GetEntries()>0) Cellmaps[i]->Write();
990 if(E_LBmaps[i]->
GetEntries()>0) E_LBmaps[i]->Write();
991 if(t_LBmaps[i]->
GetEntries()>0) t_LBmaps[i]->Write();
992 if(Pulsemaps[i]->
GetEntries()>0) Pulsemaps[i]->Write();
993 if(CellsFlagged_LB_part[i]->
GetEntries()>0) CellsFlagged_LB_part[i]->Write();
994 if( Emean_NbrEvents_part[i]->
GetEntries()>0) Emean_NbrEvents_part[i]->Write();
996 CellsFlagged_LB.Write();
1000 Emean_NbrEvents.Write();
1070std::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){
1071 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventCells_tot;
1072 std::map< std::pair<unsigned int, unsigned int>,
double > eventEnergy_tot;
1073 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventLumiBlock;
1074 std::map< std::pair<std::string, unsigned int>,
unsigned int > eventCells;
1076 double NSIG = nsigma;
1080 unsigned int nchannels = tuple->
nChannels();
1083 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
1091 int calo = cellInfo->
calo();
1100 unsigned int ndigits = hist->nData();
1101 if(ndigits==0){
continue; }
1104 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
1108 if(!Evdata)
continue;
1112 lb = (int)lumiBlock;
1113 double energyGeV =
data->energy()/1000.;
1116 if (lumiBlock <= lbmax && lumiBlock >= lbmin ) {
1117 if (
data->energy() > sqrt((NSIG*
data->noise())*(NSIG*
data->noise())) &&
data->energy() != 0. &&
data->noise() != 0.){
1119 std::pair<unsigned int, unsigned int>
ev(
data->run(),
data->event());
1120 std::pair<std::string, unsigned int> ev_cryo(
GetCryostat(calo),
data->event());
1121 eventCells_tot[
ev]++;
1122 eventEnergy_tot[
ev] += energyGeV;
1123 eventLumiBlock[
ev] =
lb;
1124 eventCells[ev_cryo]++;
1132 auto hCells_Ev_LB = std::make_unique<TProfile>(
"",
"",nlb,lbmin,lbmax,-100,100000);
1133 std::map< std::string, TProfilep> hCellsEvLB;
1134 std::map< std::string, TH1Fp> hp_cryo;
1139 std::string Cryo[8] = {
"EMBA",
"EMBC",
"EMECA",
"EMECC",
"HECA",
"HECC",
"FCALA",
"FCALC"};
1140 for(
int k = 0; k< nCryo; k++){
1141 hCellsEvLB[Cryo[k]].reset((TProfile*)hCells_Ev_LB->Clone());
1143 for(
unsigned int ievent = 0; ievent < tuple->
nEvents(); ievent++) {
1145 std::pair<unsigned int, unsigned int> id(evtData->
run(), evtData->
event());
1146 if(eventCells_tot[
id]==0)
continue;
1148 for(
int j=0; j<nCryo ;j++){
1149 std::pair<std::string, unsigned int> id_cryo(Cryo[j], evtData->
event());
1150 hCellsEvLB[Cryo[j]]->Fill(eventLumiBlock[
id], eventCells[id_cryo]);
1153 hCells_Ev_LB->Fill(eventLumiBlock[
id], eventCells_tot[
id]);
1156 auto hp = std::make_unique<TH1F>(
"",
"",(hCells_Ev_LB->GetBinContent(hCells_Ev_LB->GetMaximumBin())),0,hCells_Ev_LB->GetBinContent(hCells_Ev_LB->GetMaximumBin()));
1157 for(
int k = 0; k< nCryo; k++){
1158 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()));
1159 std::string name1 =
"hp_" + Cryo[k];
1160 hp_cryo[Cryo[k]].reset((TH1F*)hp_temp->Clone(name1.c_str()));
1163 for (
int p=1;p<=nlb;p++){
1164 for(
int j=0; j<nCryo; j++){
1165 double bincont = hCellsEvLB[Cryo[j]]->GetBinContent(p);
1166 hp_cryo[Cryo[j]]->Fill(bincont);
1168 double bincont1 = hCells_Ev_LB->GetBinContent(p);
1172 std::map< std::string, double> Mean;
1173 std::map< std::string, double> RMS;
1174 std::map< int, vector<std::string> > BadLB_cryo;
1176 for(
int k=0; k<nCryo; k++)
1178 Mean[Cryo[k]] = hp_cryo[Cryo[k]]->GetMean();
1179 RMS[Cryo[k]] = hp_cryo[Cryo[k]]->GetRMS();
1182 double MEAN2 = hp->GetMean();
1183 double RMS2 = hp->GetRMS();
1188 vector<int> BadLB_tot=DQLBList;
1190 double value1 = (MEAN2+(RMS2*3.));
1191 int numberFlagged=0;
1192 for (
int l=1;l<=nlb;l++){
1193 for(
int j=0; j<nCryo; j++){
1194 double value = MEAN2 + (RMS[Cryo[j]]*3);
1195 if(hCellsEvLB[Cryo[j]]->GetBinContent(l) > value){
1196 int badLB = hCellsEvLB[Cryo[j]]->GetBinLowEdge(l);
1197 BadLB_cryo[badLB].push_back(Cryo[j]);
1199 for(
unsigned int p=0; p< BadLB_tot.size(); p++) {
1200 if(badLB == BadLB_tot[p]) isadd =
false;
1203 BadLB_tot.push_back(badLB);
1205 printf(
"Removing bad LB %d in %s\n",badLB,Cryo[j].c_str());
1210 if (hCells_Ev_LB->GetBinContent(l) > value1){
1211 BadLB.push_back(hCells_Ev_LB->GetBinLowEdge(l));
1215 printf(
"Number of Bad LBs found: %d\n",numberFlagged);
1216 printf(
"Number of LBs to be removed: %zu", BadLB_tot.size());
1572 printf(
"LArCellsEmptyMonitoring::DoEtaPhiMonitoring: Reading options: %s %s.\n",optionplot,optionsave);
1574 bool knormplot =
false;
1575 if(strstr(optionplot,
"Precentage")) knormplot =
true;
1578 double nsigmacut = 0.;
1579 double qualitycut = 0.;
1580 if(strstr(optionplot,
"Sigma")){
1582 if(strstr(optionplot,
"4Sigma")) nsigmacut = 4.;
1583 if(strstr(optionplot,
"5Sigma")) nsigmacut = 5.;
1584 }
else if(strstr(optionplot,
"Quality")){
1592 ULong64_t onlid = 0;
1596 printf(
"Number of events: %u %u\n",tuple->nEvents(),tuple->nChannels());
1597 unsigned int nchannels = tuple->nChannels();
1601 std::vector<TH2*> hmap_counts_all (nhists);
1602 std::vector<TH2*> hmap_energy_cut (nhists);
1603 std::vector<TH2*> hmap_quality_cut (nhists);
1604 for(
int j=0;j<nhists;j++){
1607 hmap_counts_all[j]->SetName(hname);
1611 hmap_energy_cut[j]->SetName(hname);
1614 sprintf(hname,
"quality_cut_%s_%d",
m_LarIdTranslator->GetPartitonLayerName(j),j);
1615 hmap_quality_cut[j]->SetName(hname);
1619 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
1621 if(tuple->historySize(ichan)==0){ nskipped++;
continue; }
1626 unsigned int ndigits = hist->nData();
1627 if(ndigits==0){ nskipped++;
continue; }
1632 std::cout<<
"GetPartitionLayerIndex returned -1 in LArCellsEmptyMonitoring::DoEtaPhiMonitoring"<<std::endl;
1635 onlid = cellInfo->
onlid();
1636 if(onlid<=0) printf(
"%u: Bad Cell Onlid = 0x%x (%+.2f,%+.2f)\n",ichan,(
unsigned int)onlid,cellInfo->
eta(),cellInfo->
phi());
1639 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
1646 if(kcuttype==1 &&
data->noise()>0.){
1656 printf(
"Skipped %d cells. Bad Cells = %d\n",nskipped,nbad);
1660 for(
int j=0;j<nhists;j++){
1661 hmap_energy_cut[j]->Divide(hmap_counts_all[j]);
1662 hmap_quality_cut[j]->Divide(hmap_counts_all[j]);
1666 std::unique_ptr<TFile> tout;
1667 TCanvas* c0 =
nullptr, *c1 =
nullptr;
1669 if(!strcmp(optionsave,
"root")){
1670 tout.reset(
new TFile(
"EtaPhiMonitoring.root",
"recreate"));
1671 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_counts_all.data(),
"Counts",1);
1672 c0->SetName(
"Normalization");
1674 for(
int j=0;j<nhists;j++) hmap_counts_all[j]->Write();
1676 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_energy_cut.data(),
"EnergyCut",1);
1677 c0->SetName(
"EnergyCut");
1679 for(
int j=0;j<nhists;j++) hmap_energy_cut[j]->Write();
1682 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_quality_cut.data(),
"QualityCut",1);
1683 c0->SetName(
"QualityCut");
1685 for(
int j=0;j<nhists;j++) hmap_quality_cut[j]->Write();
1689 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_counts_all.data(),
"Counts",1);
1690 c0->SaveAs(
"Normalization.png");
1691 c1 =
new TCanvas(
"c1",
"");
1692 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); }
1694 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_energy_cut.data(),
"EnergyCut",1);
1695 c0->SaveAs(
"EnergyCut.png");
1697 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); }
1700 c0 =
m_LarIdTranslator->CaloPartitionLayerDisplay(hmap_quality_cut.data(),
"QualityCut",1);
1701 c0->SaveAs(
"QualityCut.png");
1703 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); }
1723 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventCells;
1724 std::map< std::pair<unsigned int, unsigned int>,
double > eventEnergy_PS;
1725 std::map< std::pair<unsigned int, unsigned int>,
double > eventEnergy_LAr;
1726 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventCells_PS;
1727 std::map< std::pair<unsigned int, unsigned int>,
unsigned int > eventLayer;
1731 unsigned int nchannels = tuple->nChannels();
1734 for(
unsigned int ichan = 0; ichan < nchannels; ichan++){
1736 if(tuple->historySize(ichan)==0){
continue; }
1741 unsigned int layer = cellInfo->
layer();
1743 unsigned int ndigits = hist->nData();
1744 if(ndigits==0){
continue; }
1747 for(
unsigned int idigit = 0; idigit < ndigits; idigit++){
1752 double energyGeV =
data->energy()/1000.;
1755 std::pair<unsigned int, unsigned int>
ev(
data->run(),
data->event());
1757 eventEnergy_LAr[
ev] += energyGeV;
1758 eventLayer[
ev] = layer;
1760 eventEnergy_PS[
ev] += energyGeV;
1761 eventCells_PS[
ev]++;
1769 constexpr int nbins = 42;
1770 double binE[nbins+1]{};
1773 double de = 0.,ene = 0.;
1776 stop = (int)(20./de);
1777 for(i=0;i<stop;i++,j++){
1783 stop = (int)((100.-20.)/de);
1784 for(i=0;i<stop;i++,j++){
1790 stop = (int)((500.-100.)/de);
1791 for(i=0;i<stop;i++,j++){
1799 TH1F E_LAr_pass(
"E_LAr_pass",
"",nbins,binE);
1800 TH1F E_LAr_tot(
"E_LAr_tot",
"",nbins,binE);
1801 TH1F E_LAr_EM5_pass(
"E_LAr_EM5_pass",
"",nbins,binE);
1802 TH1F E_LAr_EM5_tot(
"E_LAr_EM5_tot",
"",nbins,binE);
1803 TH1F E_LAr_TAU8_pass(
"E_LAr_TAU8_pass",
"",nbins,binE);
1804 TH1F E_LAr_TAU8_tot(
"E_LAr_TAU8_tot",
"",nbins,binE);
1805 TH1F E_LAr_J10_pass(
"E_LAr_J10_pass",
"",nbins,binE);
1806 TH1F E_LAr_J10_tot(
"E_LAr_J10_tot",
"",nbins,binE);
1807 TH1F nCellsPS_pass(
"nCellsPS_pass",
"",100, 0, 100);
1808 TH1F nCellsPS_tot(
"nCellsPS_tot",
"",100, 0, 100);
1809 TH1F nCellsPS_EM5_pass(
"nCellsPS_EM5_pass",
"",100, 0, 100);
1810 TH1F nCellsPS_EM5_tot(
"nCellsPS_EM5_tot",
"",100, 0, 100);
1811 TH1F nCellsPS_TAU8_pass(
"nCellsPS_TAU8_pass",
"",100, 0, 100);
1812 TH1F nCellsPS_TAU8_tot(
"nCellsPS_TAU8_tot",
"",100, 0, 100);
1813 TH1F nCellsPS_J10_tot(
"nCellsPS_J10_tot",
"",100, 0, 100);
1814 TH1F nCellsPS_J10_pass(
"nCellsPS_J10_pass",
"",100, 0, 100);
1819 for(
unsigned int ievent = 0; ievent < tuple->nEvents(); ievent++) {
1821 std::pair<unsigned int, unsigned int> id(evtData->
run(), evtData->
event());
1822 if(eventCells[
id]==0)
continue;
1823 if(eventEnergy_LAr[
id]<=0)
continue;
1824 bool isEM5 = evtData->
isPassed(
"L1_EM5_EMPTY");
1825 bool isTAU8 = evtData->
isPassed(
"L1_TAU8_EMPTY");
1826 bool isJ10 = evtData->
isPassed(
"L1_J10_EMPTY");
1828 E_LAr_tot.Fill(eventEnergy_LAr[
id]);
1829 nCellsPS_tot.Fill(eventCells_PS[
id]);
1831 E_LAr_EM5_tot.Fill(eventEnergy_LAr[
id]);
1832 nCellsPS_EM5_tot.Fill(eventCells_PS[
id]);
1835 E_LAr_TAU8_tot.Fill(eventEnergy_LAr[
id]);
1836 nCellsPS_TAU8_tot.Fill(eventCells_PS[
id]);
1839 E_LAr_J10_tot.Fill(eventEnergy_LAr[
id]);
1840 nCellsPS_J10_tot.Fill(eventCells_PS[
id]);
1844 if((eventEnergy_LAr[
id])!=0)
1845 ratio = eventEnergy_PS[id]/(eventEnergy_LAr[id]);
1846 bool isL2_PreS =
false;
1847 if(ratio > fractionInPS) isL2_PreS =
true;
1850 E_LAr_pass.Fill(eventEnergy_LAr[
id]);
1851 nCellsPS_pass.Fill(eventCells_PS[
id]);
1853 E_LAr_EM5_pass.Fill(eventEnergy_LAr[
id]);
1854 nCellsPS_EM5_pass.Fill(eventCells_PS[
id]);
1857 E_LAr_TAU8_pass.Fill(eventEnergy_LAr[
id]);
1858 nCellsPS_TAU8_pass.Fill(eventCells_PS[
id]);
1861 E_LAr_J10_pass.Fill(eventEnergy_LAr[
id]);
1862 nCellsPS_J10_pass.Fill(eventCells_PS[
id]);
1868 sprintf(fname,
"TriggerEfficiency_%d.root",
run);
1869 auto mfile = std::make_unique<TFile>(fname,
"recreate");
1872 E_LAr_EM5_pass.Write();
1873 E_LAr_EM5_tot.Write();
1874 E_LAr_TAU8_pass.Write();
1875 E_LAr_TAU8_tot.Write();
1876 E_LAr_J10_pass.Write();
1877 E_LAr_J10_tot.Write();
1878 nCellsPS_pass.Write();
1879 nCellsPS_tot.Write();
1880 nCellsPS_EM5_pass.Write();
1881 nCellsPS_EM5_tot.Write();
1882 nCellsPS_TAU8_pass.Write();
1883 nCellsPS_TAU8_tot.Write();
1884 nCellsPS_J10_pass.Write();
1885 nCellsPS_J10_tot.Write();