14#include <dqm/analysis/modules/DQMHistAnalysisEventT0TriggerJitter.h>
26REG_MODULE(DQMHistAnalysisEventT0TriggerJitter);
35 setDescription(
"Determining and processing EventT0s from different subdetectors (ECL, CDC, TOP, SVD) for different L1 trigger sources (ECL, CDC, and TOP) to estimate trigger jitter information for different HLT event types (hadron, BhaBha, ยตยต).");
39 addParam(
"prefixCanvas",
m_prefixCanvas,
"Prefix to be added to canvas filename when saved as pdf.", std::string(
"c"));
51 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_CDCEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_CDCEventT0_SVDEventT0");
52 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_ECLEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_ECLEventT0_SVDEventT0");
53 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_TOPEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_TOPEventT0_SVDEventT0");
101 double frac = par[1];
102 double mean = par[2];
103 double sigma = par[3];
104 double mean2 = par[4];
105 double sigma2 = par[5];
107 return N * frac * TMath::Gaus(x[0], mean, sigma) + N * (1 - frac) * TMath::Gaus(x[0], mean2, sigma2);
115 B2DEBUG(20,
"h == nullptr");
116 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
123 auto nValidEntries = h->GetEntries() - h->GetBinContent(0) - h->GetBinContent(h->GetNbinsX() + 1);
125 B2DEBUG(20,
"not enough entries");
126 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
132 h->Scale(1. / nValidEntries);
133 h->GetXaxis()->SetRangeUser(-50, 50);
137 fitf.SetParNames(
"N",
"f_{1}",
"#mu_{1}",
"#sigma_{1}",
"#mu_{2}",
"#sigma_{2}");
138 fitf.SetParameters(0.1, 0.8, 0, 5, 0, 15);
139 fitf.SetParLimits(1, 0, 1);
140 fitf.SetParLimits(3, 0, 100);
141 fitf.SetParLimits(5, 0, 100);
143 if (h->Fit(&fitf,
"SR+") != 0) {
144 B2DEBUG(20,
"failed fit");
145 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
150 fitf.GetParameters(&par[0]);
152 for (
int i = 0; i < 6; i++)
153 parErr[i] = fitf.GetParError(i) ;
157 TF1 gauss1(
"gauss1",
"gaus", -100, 100);
158 TF1 gauss2(
"gauss2",
"gaus", -100, 100);
162 const double mainFrac = par[1] > 0.5 ? par[1] : (1 - par[1]);
163 const double mainMean = par[1] > 0.5 ? par[2] : par[4];
164 const double mainSigma = par[1] > 0.5 ? par[3] : par[5];
165 const double miniMean = par[1] > 0.5 ? par[4] : par[2];
166 const double miniSigma = par[1] > 0.5 ? par[5] : par[3];
167 const double mainMeanErr = par[1] > 0.5 ? parErr[2] : parErr[4];
168 const double mainSigmaErr = par[1] > 0.5 ? parErr[3] : parErr[5];
169 const double miniMeanErr = par[1] > 0.5 ? parErr[4] : parErr[2];
170 const double miniSigmaErr = par[1] > 0.5 ? parErr[5] : parErr[3];
172 gauss1.SetLineColor(kBlue);
173 gauss1.SetLineStyle(kDashed);
174 gauss1.SetParameters(par[0]*mainFrac, mainMean, mainSigma);
176 gauss2.SetLineColor(kRed);
177 gauss2.SetLineStyle(kDashed);
178 gauss2.SetParameters(par[0] * (1 - mainFrac), miniMean, miniSigma);
180 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 1);
181 m_monObj->setVariable(Form(
"N_%s", tag.Data()), nValidEntries, TMath::Sqrt(nValidEntries));
182 m_monObj->setVariable(Form(
"f_%s", tag.Data()), mainFrac, parErr[1]);
183 m_monObj->setVariable(Form(
"mean1_%s", tag.Data()), mainMean, mainMeanErr);
184 m_monObj->setVariable(Form(
"sigma1_%s", tag.Data()), mainSigma, mainSigmaErr);
185 m_monObj->setVariable(Form(
"mean2_%s", tag.Data()), miniMean, miniMeanErr);
186 m_monObj->setVariable(Form(
"sigma2_%s", tag.Data()), miniSigma, miniSigmaErr);
189 gStyle->SetOptFit(1111);
193 fitf.DrawCopy(
"same");
194 gauss1.DrawCopy(
"same");
195 gauss2.DrawCopy(
"same");
197 if (retrieveMeanT0) {
199 return {
true, mainMean};
209 const bool retrieveMeanT0 = retrieveDeltas;
210 bool processingSuccessful =
false;
211 std::optional<double> currentT0;
216 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_ECLTRG");
217 TString tag =
"hadronECLTRG_ECLT0";
219 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
220 if (processingSuccessful) {
228 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
235 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_ECLTRG");
236 tag =
"bhabhaECLTRG_ECLT0";
243 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
250 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_ECLTRG");
251 tag =
"mumuECLTRG_ECLT0";
258 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
268 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_ECLTRG");
269 tag =
"hadronECLTRG_CDCT0";
271 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
272 if (processingSuccessful) {
280 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
287 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_ECLTRG");
288 tag =
"bhabhaECLTRG_CDCT0";
295 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
302 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_ECLTRG");
303 tag =
"mumuECLTRG_CDCT0";
310 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
320 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_ECLTRG");
321 tag =
"hadronECLTRG_TOPT0";
323 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
324 if (processingSuccessful) {
332 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
339 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_ECLTRG");
340 tag =
"bhabhaECLTRG_TOPT0";
347 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
354 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_ECLTRG");
355 tag =
"mumuECLTRG_TOPT0";
362 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
372 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_ECLTRG");
373 tag =
"hadronECLTRG_SVDT0";
375 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
376 if (processingSuccessful) {
384 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
391 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_ECLTRG");
392 tag =
"bhabhaECLTRG_SVDT0";
399 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
406 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_ECLTRG");
407 tag =
"mumuECLTRG_SVDT0";
414 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
428 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_CDCTRG");
429 TString tag =
"hadronCDCTRG_ECLT0";
437 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
444 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_CDCTRG");
445 tag =
"bhabhaCDCTRG_ECLT0";
453 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
460 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_CDCTRG");
461 tag =
"mumuCDCTRG_ECLT0";
468 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
478 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_CDCTRG");
479 tag =
"hadronCDCTRG_CDCT0";
487 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
494 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_CDCTRG");
495 tag =
"bhabhaCDCTRG_CDCT0";
503 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
510 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_CDCTRG");
511 tag =
"mumuCDCTRG_CDCT0";
518 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
528 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_CDCTRG");
529 tag =
"hadronCDCTRG_TOPT0";
537 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
544 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_CDCTRG");
545 tag =
"bhabhaCDCTRG_TOPT0";
553 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
560 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_CDCTRG");
561 tag =
"mumuCDCTRG_TOPT0";
568 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
578 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_CDCTRG");
579 tag =
"hadronCDCTRG_SVDT0";
587 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
594 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_CDCTRG");
595 tag =
"bhabhaCDCTRG_SVDT0";
603 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
610 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_CDCTRG");
611 tag =
"mumuCDCTRG_SVDT0";
618 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
630 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_TOPTRG");
631 TString tag =
"hadronTOPTRG_ECLT0";
639 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
646 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_TOPTRG");
647 tag =
"bhabhaTOPTRG_ECLT0";
655 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
662 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_TOPTRG");
663 tag =
"mumuTOPTRG_ECLT0";
670 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
680 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_TOPTRG");
681 tag =
"hadronTOPTRG_CDCT0";
689 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
696 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_TOPTRG");
697 tag =
"bhabhaTOPTRG_CDCT0";
705 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
712 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_TOPTRG");
713 tag =
"mumuTOPTRG_CDCT0";
720 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
730 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_TOPTRG");
731 tag =
"hadronTOPTRG_TOPT0";
739 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
746 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_TOPTRG");
747 tag =
"bhabhaTOPTRG_TOPT0";
755 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
762 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_TOPTRG");
763 tag =
"mumuTOPTRG_TOPT0";
770 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
780 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_TOPTRG");
781 tag =
"hadronTOPTRG_SVDT0";
789 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
796 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_TOPTRG");
797 tag =
"bhabhaTOPTRG_SVDT0";
805 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
812 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_TOPTRG");
813 tag =
"mumuTOPTRG_SVDT0";
820 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
void initializeCanvases()
Initialise canvases.
TCanvas * m_cCDCTimeMuMuECLTRG
Canvas for CDC time ECLTRG jitter mumu.
TCanvas * m_cECLTimeHadronsECLTRG
Canvas for ECL time ECLTRG jitter hadrons.
void initialize() override final
create TCanvas and MonitoringObject
TCanvas * m_cTOPTimeHadronsECLTRG
Canvas for TOP time ECLTRG jitter hadrons.
TCanvas * m_cECLTimeHadronsCDCTRG
Canvas for ECL time CDCTRG jitter hadrons.
TCanvas * m_cECLTimeMuMuECLTRG
Canvas for ECL time ECLTRG jitter mumu.
TCanvas * m_cCDCTimeHadronsECLTRG
Canvas for CDC time ECLTRG jitter hadrons.
static double fDoubleGaus(double *x, double *par)
double gaussian fitting function for the jitter distribution
double m_ECLTRGHLThadronCDCT0
CDC T0 for ECLTRG jitter for HLT hadron events.
double m_ECLTRGHLThadronTOPT0
TOP T0 for ECLTRG jitter for HLT hadron events.
TCanvas * m_cCDCTimeBhaBhaECLTRG
Canvas for CDC time ECLTRG jitter bhabhas.
TCanvas * m_cSVDTimeMuMuTOPTRG
Canvas for SVD time TOPTRG jitter mumu.
double m_ECLTRGHLThadronSVDT0
SVD T0 for ECLTRG jitter for HLT hadron events.
void deleteCanvases()
Delete canvases.
TCanvas * m_cCDCTimeHadronsTOPTRG
Canvas for CDC time TOPTRG jitter hadrons.
void setDeltaT0Values()
Set the deltaT0 values in the monObj.
TCanvas * m_cECLTimeBhaBhaECLTRG
Canvas for ECL time ECLTRG jitter bhabhas.
TCanvas * m_cCDCTimeBhaBhaCDCTRG
Canvas for CDC time CDCTRG jitter bhabhas.
std::tuple< bool, std::optional< double > > processHistogram(TH1 *h, TString tag, bool retrieveMeanT0=false)
process the EventT0 distribution fitting with two gaussians filling the MonitoringObject
std::string m_prefixCanvas
prefix to be added to canvas name when saved as pdf
void analyseECLTRGEventT0Distributions(bool retrieveDeltas=true)
Analyse the ECLTRG EventT0 distributions The only function to retrieve deltaT values ECL-SVD,...
double m_ECLTRGHLThadronECLT0
ECL T0 for ECLTRG jitter for HLT hadron events.
TCanvas * m_cCDCTimeMuMuCDCTRG
Canvas for CDC time CDCTRG jitter mumu.
MonitoringObject * m_monObj
MonitoringObject to be produced by this module.
TCanvas * m_cCDCTimeMuMuTOPTRG
Canvas for CDC time TOPTRG jitter mumu.
TCanvas * m_cCDCTimeHadronsCDCTRG
Canvas for CDC time CDCTRG jitter hadrons.
TCanvas * m_cTOPTimeHadronsTOPTRG
Canvas for TOP time TOPTRG jitter hadrons.
void terminate() override final
delete pointers
void clearCanvases()
Initialise canvases.
void analyseTOPTRGEventT0Distributions()
Analyse the TOPTRG EventT0 distributions.
void event() override final
fit the histograms in the event
TCanvas * m_cECLTimeBhaBhaTOPTRG
Canvas for ECL time TOPTRG jitter bhabhas.
bool m_printCanvas
if true print the pdf of the canvases
TCanvas * m_cTOPTimeBhaBhaECLTRG
Canvas for TOP time ECLTRG jitter bhabhas.
TCanvas * m_cSVDTimeHadronsTOPTRG
Canvas for SVD time TOPTRG jitter hadrons.
TCanvas * m_cTOPTimeBhaBhaTOPTRG
Canvas for TOP time TOPTRG jitter bhabhas.
TCanvas * m_cSVDTimeBhaBhaECLTRG
Canvas for SVD time ECLTRG jitter bhabhas.
TCanvas * m_cTOPTimeBhaBhaCDCTRG
Canvas for TOP time CDCTRG jitter bhabhas.
uint m_nEntriesMin
minimum number of entries to process the histogram
TCanvas * m_cECLTimeMuMuCDCTRG
Canvas for ECL time CDCTRG jitter mumu.
TCanvas * m_cSVDTimeMuMuCDCTRG
Canvas for SVD time CDCTRG jitter mumu.
TCanvas * m_cTOPTimeMuMuTOPTRG
Canvas for TOP time TOPTRG jitter mumu.
TCanvas * m_cECLTimeBhaBhaCDCTRG
Canvas for ECL time CDCTRG jitter bhabhas.
void endRun() override final
final fit of T0 distributions
TCanvas * m_cTOPTimeHadronsCDCTRG
Canvas for TOP time CDCTRG jitter hadrons.
TCanvas * m_cECLTimeHadronsTOPTRG
Canvas for ECL time TOPTRG jitter hadrons.
TCanvas * m_cCDCTimeBhaBhaTOPTRG
Canvas for CDC time TOPTRG jitter bhabhas.
void beginRun() override final
clear TCanvas
TCanvas * m_cSVDTimeHadronsECLTRG
Canvas for SVD time ECLTRG jitter hadrons.
TCanvas * m_cECLTimeMuMuTOPTRG
Canvas for ECL time TOPTRG jitter mumu.
TCanvas * m_cTOPTimeMuMuCDCTRG
Canvas for TOP time CDCTRG jitter mumu.
DQMHistAnalysisEventT0TriggerJitterModule()
Constructor.
void printCanvases()
Print canvases if required.
TCanvas * m_cSVDTimeMuMuECLTRG
Canvas for SVD time ECLTRG jitter mumu.
TCanvas * m_cSVDTimeHadronsCDCTRG
Canvas for SVD time CDCTRG jitter hadrons.
TCanvas * m_cTOPTimeMuMuECLTRG
Canvas for TOP time ECLTRG jitter mumu.
TCanvas * m_cSVDTimeBhaBhaCDCTRG
Canvas for SVD time CDCTRG jitter bhabhas.
TCanvas * m_cSVDTimeBhaBhaTOPTRG
Canvas for SVD time TOPTRG jitter bhabhas.
void analyseCDCTRGEventT0Distributions()
Analyse the CDCTRG EventT0 distributions.
int registerEpicsPV(const std::string &pvname, const std::string &keyname="")
EPICS related Functions.
static MonitoringObject * getMonitoringObject(const std::string &name)
Get MonitoringObject with given name (new object is created if non-existing)
static TH1 * findHist(const std::string &histname, bool onlyIfUpdated=false)
Get histogram from list (no other search).
DQMHistAnalysisModule()
Constructor / Destructor.
void setEpicsPV(const std::string &keyname, double value)
Write value to a EPICS PV.
void setDescription(const std::string &description)
Sets the description of the module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.