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");
102 double frac = par[1];
103 double mean = par[2];
104 double sigma = par[3];
105 double mean2 = par[4];
106 double sigma2 = par[5];
108 return N * frac * TMath::Gaus(x[0], mean, sigma) + N * (1 - frac) * TMath::Gaus(x[0], mean2, sigma2);
116 B2DEBUG(20,
"h == nullptr");
117 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
124 auto nValidEntries = h->GetEntries() - h->GetBinContent(0) - h->GetBinContent(h->GetNbinsX() + 1);
126 B2DEBUG(20,
"not enough entries");
127 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
133 h->Scale(1. / nValidEntries);
134 h->GetXaxis()->SetRangeUser(-50, 50);
138 fitf.SetParNames(
"N",
"f_{1}",
"#mu_{1}",
"#sigma_{1}",
"#mu_{2}",
"#sigma_{2}");
139 fitf.SetParameters(0.1, 0.8, 0, 5, 0, 15);
140 fitf.SetParLimits(1, 0, 1);
141 fitf.SetParLimits(3, 0, 100);
142 fitf.SetParLimits(5, 0, 100);
144 if (h->Fit(&fitf,
"SR+") != 0) {
145 B2DEBUG(20,
"failed fit");
146 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
151 fitf.GetParameters(&par[0]);
153 for (
int i = 0; i < 6; i++)
154 parErr[i] = fitf.GetParError(i) ;
158 TF1 gauss1(
"gauss1",
"gaus", -100, 100);
159 TF1 gauss2(
"gauss2",
"gaus", -100, 100);
163 const double mainFrac = par[1] > 0.5 ? par[1] : (1 - par[1]);
164 const double mainMean = par[1] > 0.5 ? par[2] : par[4];
165 const double mainSigma = par[1] > 0.5 ? par[3] : par[5];
166 const double miniMean = par[1] > 0.5 ? par[4] : par[2];
167 const double miniSigma = par[1] > 0.5 ? par[5] : par[3];
168 const double mainMeanErr = par[1] > 0.5 ? parErr[2] : parErr[4];
169 const double mainSigmaErr = par[1] > 0.5 ? parErr[3] : parErr[5];
170 const double miniMeanErr = par[1] > 0.5 ? parErr[4] : parErr[2];
171 const double miniSigmaErr = par[1] > 0.5 ? parErr[5] : parErr[3];
173 gauss1.SetLineColor(kBlue);
174 gauss1.SetLineStyle(kDashed);
175 gauss1.SetParameters(par[0]*mainFrac, mainMean, mainSigma);
177 gauss2.SetLineColor(kRed);
178 gauss2.SetLineStyle(kDashed);
179 gauss2.SetParameters(par[0] * (1 - mainFrac), miniMean, miniSigma);
181 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 1);
182 m_monObj->setVariable(Form(
"N_%s", tag.Data()), nValidEntries, TMath::Sqrt(nValidEntries));
183 m_monObj->setVariable(Form(
"f_%s", tag.Data()), mainFrac, parErr[1]);
184 m_monObj->setVariable(Form(
"mean1_%s", tag.Data()), mainMean, mainMeanErr);
185 m_monObj->setVariable(Form(
"sigma1_%s", tag.Data()), mainSigma, mainSigmaErr);
186 m_monObj->setVariable(Form(
"mean2_%s", tag.Data()), miniMean, miniMeanErr);
187 m_monObj->setVariable(Form(
"sigma2_%s", tag.Data()), miniSigma, miniSigmaErr);
190 gStyle->SetOptFit(1111);
194 fitf.DrawCopy(
"same");
195 gauss1.DrawCopy(
"same");
196 gauss2.DrawCopy(
"same");
198 if (retrieveMeanT0) {
200 return {
true, mainMean};
210 const bool retrieveMeanT0 = retrieveDeltas;
211 bool processingSuccessful =
false;
212 std::optional<double> currentT0;
217 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_ECLTRG");
218 TString tag =
"hadronECLTRG_ECLT0";
220 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
221 if (processingSuccessful) {
229 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
236 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_ECLTRG");
237 tag =
"bhabhaECLTRG_ECLT0";
244 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
251 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_ECLTRG");
252 tag =
"mumuECLTRG_ECLT0";
259 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
269 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_ECLTRG");
270 tag =
"hadronECLTRG_CDCT0";
272 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
273 if (processingSuccessful) {
281 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
288 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_ECLTRG");
289 tag =
"bhabhaECLTRG_CDCT0";
296 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
303 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_ECLTRG");
304 tag =
"mumuECLTRG_CDCT0";
311 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
321 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_ECLTRG");
322 tag =
"hadronECLTRG_TOPT0";
324 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
325 if (processingSuccessful) {
333 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
340 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_ECLTRG");
341 tag =
"bhabhaECLTRG_TOPT0";
348 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
355 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_ECLTRG");
356 tag =
"mumuECLTRG_TOPT0";
363 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
373 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_ECLTRG");
374 tag =
"hadronECLTRG_SVDT0";
376 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
377 if (processingSuccessful) {
385 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
392 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_ECLTRG");
393 tag =
"bhabhaECLTRG_SVDT0";
400 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
407 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_ECLTRG");
408 tag =
"mumuECLTRG_SVDT0";
415 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
429 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_CDCTRG");
430 TString tag =
"hadronCDCTRG_ECLT0";
438 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
445 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_CDCTRG");
446 tag =
"bhabhaCDCTRG_ECLT0";
454 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
461 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_CDCTRG");
462 tag =
"mumuCDCTRG_ECLT0";
469 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
479 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_CDCTRG");
480 tag =
"hadronCDCTRG_CDCT0";
488 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
495 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_CDCTRG");
496 tag =
"bhabhaCDCTRG_CDCT0";
504 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
511 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_CDCTRG");
512 tag =
"mumuCDCTRG_CDCT0";
519 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
529 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_CDCTRG");
530 tag =
"hadronCDCTRG_TOPT0";
538 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
545 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_CDCTRG");
546 tag =
"bhabhaCDCTRG_TOPT0";
554 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
561 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_CDCTRG");
562 tag =
"mumuCDCTRG_TOPT0";
569 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
579 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_CDCTRG");
580 tag =
"hadronCDCTRG_SVDT0";
588 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
595 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_CDCTRG");
596 tag =
"bhabhaCDCTRG_SVDT0";
604 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
611 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_CDCTRG");
612 tag =
"mumuCDCTRG_SVDT0";
619 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
631 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_TOPTRG");
632 TString tag =
"hadronTOPTRG_ECLT0";
640 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
647 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_TOPTRG");
648 tag =
"bhabhaTOPTRG_ECLT0";
656 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
663 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_TOPTRG");
664 tag =
"mumuTOPTRG_ECLT0";
671 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
681 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_TOPTRG");
682 tag =
"hadronTOPTRG_CDCT0";
690 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
697 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_TOPTRG");
698 tag =
"bhabhaTOPTRG_CDCT0";
706 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
713 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_TOPTRG");
714 tag =
"mumuTOPTRG_CDCT0";
721 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
731 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_TOPTRG");
732 tag =
"hadronTOPTRG_TOPT0";
740 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
747 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_TOPTRG");
748 tag =
"bhabhaTOPTRG_TOPT0";
756 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
763 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_TOPTRG");
764 tag =
"mumuTOPTRG_TOPT0";
771 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
781 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_TOPTRG");
782 tag =
"hadronTOPTRG_SVDT0";
790 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
797 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_TOPTRG");
798 tag =
"bhabhaTOPTRG_SVDT0";
806 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
813 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_TOPTRG");
814 tag =
"mumuTOPTRG_SVDT0";
821 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
void clearOwnCanvases()
Clear the canvases owned by this module.
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 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)
DQMHistAnalysisModule()
Constructor / Destructor.
void setEpicsPV(const std::string &keyname, double value)
Write value to a EPICS PV.
static TH1 * findHist(const std::string &dirname, const std::string &histname="", bool onlyIfUpdated=false)
Find histogram.
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.