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"));
54 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_CDCEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_CDCEventT0_SVDEventT0");
55 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_ECLEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_ECLEventT0_SVDEventT0");
56 registerEpicsPV(
"EventT0:ECLTRG_Hadron_Delta_TOPEventT0_SVDEventT0",
"ECLTRG_Hadron_Delta_TOPEventT0_SVDEventT0");
104 double frac = par[1];
105 double mean = par[2];
106 double sigma = par[3];
107 double mean2 = par[4];
108 double sigma2 = par[5];
110 return N * frac * TMath::Gaus(x[0], mean, sigma) + N * (1 - frac) * TMath::Gaus(x[0], mean2, sigma2);
118 B2DEBUG(20,
"h == nullptr");
119 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
126 auto nValidEntries = h->GetEntries() - h->GetBinContent(0) - h->GetBinContent(h->GetNbinsX() + 1);
128 B2DEBUG(20,
"not enough entries");
129 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
135 h->Scale(1. / nValidEntries);
136 h->GetXaxis()->SetRangeUser(-50, 50);
140 fitf.SetParNames(
"N",
"f_{1}",
"#mu_{1}",
"#sigma_{1}",
"#mu_{2}",
"#sigma_{2}");
141 fitf.SetParameters(0.1, 0.8, 0, 5, 0, 15);
142 fitf.SetParLimits(1, 0, 1);
143 fitf.SetParLimits(3, 0, 100);
144 fitf.SetParLimits(5, 0, 100);
146 if (h->Fit(&fitf,
"SR+") != 0) {
147 B2DEBUG(20,
"failed fit");
148 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 0);
153 fitf.GetParameters(&par[0]);
155 for (
int i = 0; i < 6; i++)
156 parErr[i] = fitf.GetParError(i) ;
160 TF1 gauss1(
"gauss1",
"gaus", -100, 100);
161 TF1 gauss2(
"gauss2",
"gaus", -100, 100);
165 const double mainFrac = par[1] > 0.5 ? par[1] : (1 - par[1]);
166 const double mainMean = par[1] > 0.5 ? par[2] : par[4];
167 const double mainSigma = par[1] > 0.5 ? par[3] : par[5];
168 const double miniMean = par[1] > 0.5 ? par[4] : par[2];
169 const double miniSigma = par[1] > 0.5 ? par[5] : par[3];
170 const double mainMeanErr = par[1] > 0.5 ? parErr[2] : parErr[4];
171 const double mainSigmaErr = par[1] > 0.5 ? parErr[3] : parErr[5];
172 const double miniMeanErr = par[1] > 0.5 ? parErr[4] : parErr[2];
173 const double miniSigmaErr = par[1] > 0.5 ? parErr[5] : parErr[3];
175 gauss1.SetLineColor(kBlue);
176 gauss1.SetLineStyle(kDashed);
177 gauss1.SetParameters(par[0]*mainFrac, mainMean, mainSigma);
179 gauss2.SetLineColor(kRed);
180 gauss2.SetLineStyle(kDashed);
181 gauss2.SetParameters(par[0] * (1 - mainFrac), miniMean, miniSigma);
183 m_monObj->setVariable(Form(
"fit_%s", tag.Data()), 1);
184 m_monObj->setVariable(Form(
"N_%s", tag.Data()), nValidEntries, TMath::Sqrt(nValidEntries));
185 m_monObj->setVariable(Form(
"f_%s", tag.Data()), mainFrac, parErr[1]);
186 m_monObj->setVariable(Form(
"mean1_%s", tag.Data()), mainMean, mainMeanErr);
187 m_monObj->setVariable(Form(
"sigma1_%s", tag.Data()), mainSigma, mainSigmaErr);
188 m_monObj->setVariable(Form(
"mean2_%s", tag.Data()), miniMean, miniMeanErr);
189 m_monObj->setVariable(Form(
"sigma2_%s", tag.Data()), miniSigma, miniSigmaErr);
192 gStyle->SetOptFit(1111);
196 fitf.DrawCopy(
"same");
197 gauss1.DrawCopy(
"same");
198 gauss2.DrawCopy(
"same");
200 if (retrieveMeanT0) {
202 return {
true, mainMean};
212 const bool retrieveMeanT0 = retrieveDeltas;
213 bool processingSuccessful =
false;
214 std::optional<double> currentT0;
219 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_ECLTRG");
220 TString tag =
"hadronECLTRG_ECLT0";
222 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
223 if (processingSuccessful) {
231 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
238 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_ECLTRG");
239 tag =
"bhabhaECLTRG_ECLT0";
246 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
253 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_ECLTRG");
254 tag =
"mumuECLTRG_ECLT0";
261 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
271 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_ECLTRG");
272 tag =
"hadronECLTRG_CDCT0";
274 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
275 if (processingSuccessful) {
283 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
290 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_ECLTRG");
291 tag =
"bhabhaECLTRG_CDCT0";
298 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
305 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_ECLTRG");
306 tag =
"mumuECLTRG_CDCT0";
313 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
323 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_ECLTRG");
324 tag =
"hadronECLTRG_TOPT0";
326 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
327 if (processingSuccessful) {
335 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
342 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_ECLTRG");
343 tag =
"bhabhaECLTRG_TOPT0";
350 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
357 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_ECLTRG");
358 tag =
"mumuECLTRG_TOPT0";
365 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
375 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_ECLTRG");
376 tag =
"hadronECLTRG_SVDT0";
378 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
379 if (processingSuccessful) {
387 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
394 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_ECLTRG");
395 tag =
"bhabhaECLTRG_SVDT0";
402 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
409 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_ECLTRG");
410 tag =
"mumuECLTRG_SVDT0";
417 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
431 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_CDCTRG");
432 TString tag =
"hadronCDCTRG_ECLT0";
440 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
447 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_CDCTRG");
448 tag =
"bhabhaCDCTRG_ECLT0";
456 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
463 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_CDCTRG");
464 tag =
"mumuCDCTRG_ECLT0";
471 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
481 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_CDCTRG");
482 tag =
"hadronCDCTRG_CDCT0";
490 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
497 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_CDCTRG");
498 tag =
"bhabhaCDCTRG_CDCT0";
506 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
513 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_CDCTRG");
514 tag =
"mumuCDCTRG_CDCT0";
521 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
531 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_CDCTRG");
532 tag =
"hadronCDCTRG_TOPT0";
540 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
547 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_CDCTRG");
548 tag =
"bhabhaCDCTRG_TOPT0";
556 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
563 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_CDCTRG");
564 tag =
"mumuCDCTRG_TOPT0";
571 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
581 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_CDCTRG");
582 tag =
"hadronCDCTRG_SVDT0";
590 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
597 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_CDCTRG");
598 tag =
"bhabhaCDCTRG_SVDT0";
606 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
613 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_CDCTRG");
614 tag =
"mumuCDCTRG_SVDT0";
621 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
633 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_TOPTRG");
634 TString tag =
"hadronTOPTRG_ECLT0";
642 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
649 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_TOPTRG");
650 tag =
"bhabhaTOPTRG_ECLT0";
658 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
665 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_TOPTRG");
666 tag =
"mumuTOPTRG_ECLT0";
673 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
683 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_TOPTRG");
684 tag =
"hadronTOPTRG_CDCT0";
692 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
699 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_TOPTRG");
700 tag =
"bhabhaTOPTRG_CDCT0";
708 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
715 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_TOPTRG");
716 tag =
"mumuTOPTRG_CDCT0";
723 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
733 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_TOPTRG");
734 tag =
"hadronTOPTRG_TOPT0";
742 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
749 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_TOPTRG");
750 tag =
"bhabhaTOPTRG_TOPT0";
758 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
765 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_TOPTRG");
766 tag =
"mumuTOPTRG_TOPT0";
773 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
783 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_TOPTRG");
784 tag =
"hadronTOPTRG_SVDT0";
792 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
799 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_TOPTRG");
800 tag =
"bhabhaTOPTRG_SVDT0";
808 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
815 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_TOPTRG");
816 tag =
"mumuTOPTRG_SVDT0";
823 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.
~DQMHistAnalysisEventT0TriggerJitterModule()
Destructor.
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.
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).
void setEpicsPV(std::string keyname, double value)
Write value to a EPICS PV.
DQMHistAnalysisModule()
Constructor / Destructor.
int registerEpicsPV(std::string pvname, std::string keyname="")
EPICS related Functions.
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.