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");
126 auto nValidEntries = h->GetEntries() - h->GetBinContent(0) - h->GetBinContent(h->GetNbinsX() + 1);
128 B2DEBUG(20,
"not enough entries");
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");
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);
163 gauss1.SetLineColor(kBlue);
164 gauss1.SetLineStyle(kDashed);
165 gauss1.SetParameters(par[0]*par[1], par[2], par[3]);
167 gauss2.SetLineColor(kRed);
168 gauss2.SetLineStyle(kDashed);
169 gauss2.SetParameters(par[0] * (1 - par[1]), par[4], par[5]);
172 m_monObj->
setVariable(Form(
"N_%s", tag.Data()), nValidEntries, TMath::Sqrt(nValidEntries));
180 gStyle->SetOptFit(1111);
183 fitf.DrawClone(
"same");
184 gauss1.DrawClone(
"same");
185 gauss2.DrawClone(
"same");
187 if (retrieveMeanT0) {
189 return {
true, par[2]};
199 const bool retrieveMeanT0 = retrieveDeltas;
200 bool processingSuccessful =
false;
201 std::optional<double> currentT0;
206 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_ECLTRG");
207 TString tag =
"hadronECLTRG_ECLT0";
209 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
210 if (processingSuccessful) {
218 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
225 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_ECLTRG");
226 tag =
"bhabhaECLTRG_ECLT0";
233 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
240 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_ECLTRG");
241 tag =
"mumuECLTRG_ECLT0";
248 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
258 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_ECLTRG");
259 tag =
"hadronECLTRG_CDCT0";
261 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
262 if (processingSuccessful) {
270 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
277 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_ECLTRG");
278 tag =
"bhabhaECLTRG_CDCT0";
285 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
292 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_ECLTRG");
293 tag =
"mumuECLTRG_CDCT0";
300 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
310 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_ECLTRG");
311 tag =
"hadronECLTRG_TOPT0";
313 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
314 if (processingSuccessful) {
322 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
329 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_ECLTRG");
330 tag =
"bhabhaECLTRG_TOPT0";
337 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
344 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_ECLTRG");
345 tag =
"mumuECLTRG_TOPT0";
352 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
362 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_ECLTRG");
363 tag =
"hadronECLTRG_SVDT0";
365 std::tie(processingSuccessful, currentT0) =
processHistogram(h, tag, retrieveMeanT0);
366 if (processingSuccessful) {
374 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
381 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_ECLTRG");
382 tag =
"bhabhaECLTRG_SVDT0";
389 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
396 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_ECLTRG");
397 tag =
"mumuECLTRG_SVDT0";
404 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
418 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_CDCTRG");
419 TString tag =
"hadronCDCTRG_ECLT0";
427 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
434 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_CDCTRG");
435 tag =
"bhabhaCDCTRG_ECLT0";
443 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
450 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_CDCTRG");
451 tag =
"mumuCDCTRG_ECLT0";
458 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
468 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_CDCTRG");
469 tag =
"hadronCDCTRG_CDCT0";
477 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
484 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_CDCTRG");
485 tag =
"bhabhaCDCTRG_CDCT0";
493 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
500 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_CDCTRG");
501 tag =
"mumuCDCTRG_CDCT0";
508 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
518 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_CDCTRG");
519 tag =
"hadronCDCTRG_TOPT0";
527 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
534 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_CDCTRG");
535 tag =
"bhabhaCDCTRG_TOPT0";
543 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
550 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_CDCTRG");
551 tag =
"mumuCDCTRG_TOPT0";
558 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
568 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_CDCTRG");
569 tag =
"hadronCDCTRG_SVDT0";
577 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
584 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_CDCTRG");
585 tag =
"bhabhaCDCTRG_SVDT0";
593 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
600 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_CDCTRG");
601 tag =
"mumuCDCTRG_SVDT0";
608 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
620 TH1* h =
findHist(
"EventT0/m_histEventT0_ECL_hadron_L1_TOPTRG");
621 TString tag =
"hadronTOPTRG_ECLT0";
629 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
636 h =
findHist(
"EventT0/m_histEventT0_ECL_bhabha_L1_TOPTRG");
637 tag =
"bhabhaTOPTRG_ECLT0";
645 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
652 h =
findHist(
"EventT0/m_histEventT0_ECL_mumu_L1_TOPTRG");
653 tag =
"mumuTOPTRG_ECLT0";
660 B2DEBUG(29, Form(
"Histogram ECL EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
670 h =
findHist(
"EventT0/m_histEventT0_CDC_hadron_L1_TOPTRG");
671 tag =
"hadronTOPTRG_CDCT0";
679 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
686 h =
findHist(
"EventT0/m_histEventT0_CDC_bhabha_L1_TOPTRG");
687 tag =
"bhabhaTOPTRG_CDCT0";
695 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
702 h =
findHist(
"EventT0/m_histEventT0_CDC_mumu_L1_TOPTRG");
703 tag =
"mumuTOPTRG_CDCT0";
710 B2DEBUG(29, Form(
"Histogram CDC EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
720 h =
findHist(
"EventT0/m_histEventT0_TOP_hadron_L1_TOPTRG");
721 tag =
"hadronTOPTRG_TOPT0";
729 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
736 h =
findHist(
"EventT0/m_histEventT0_TOP_bhabha_L1_TOPTRG");
737 tag =
"bhabhaTOPTRG_TOPT0";
745 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
752 h =
findHist(
"EventT0/m_histEventT0_TOP_mumu_L1_TOPTRG");
753 tag =
"mumuTOPTRG_TOPT0";
760 B2DEBUG(29, Form(
"Histogram TOP EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
770 h =
findHist(
"EventT0/m_histEventT0_SVD_hadron_L1_TOPTRG");
771 tag =
"hadronTOPTRG_SVDT0";
779 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
786 h =
findHist(
"EventT0/m_histEventT0_SVD_bhabha_L1_TOPTRG");
787 tag =
"bhabhaTOPTRG_SVDT0";
795 B2DEBUG(29, Form(
"Histogram SVD EventT0 for %s from EventT0 DQM not processed!", tag.Data()));
802 h =
findHist(
"EventT0/m_histEventT0_SVD_mumu_L1_TOPTRG");
803 tag =
"mumuTOPTRG_SVDT0";
810 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.
The base class for the histogram analysis module.
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.
int registerEpicsPV(std::string pvname, std::string keyname="")
EPICS related Functions.
void setDescription(const std::string &description)
Sets the description of the module.
void setVariable(const std::string &var, float val, float upErr=-1., float dwErr=-1)
set value to float variable (new variable is made if not yet existing)
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.